postgresql启动过程

news/2024/7/9 23:30:45 标签: postgresql

一、主进程

  • src/backend/main/main.c
int
main(int argc, char *argv[])
{
    ...	 
		PostmasterMain(argc, argv); /* does not return */
    ...
}

二、服务器初始化

  • src/backend/postmaster/postmaster.c

主进程初始化,然后进行主循环loop

void
PostmasterMain(int argc, char *argv[])
{
    ...
        status = ServerLoop();
    ...
}

三、服务器主循环

  • src/backend/postmaster/postmaster.c

通过select等待客户端的连接

static int
ServerLoop(void)
{
	...
        
	for (;;)
	{
		...
			selres = select(nSockets, &rmask, NULL, NULL, &timeout);
		...
		/*
		 * New connection pending on any of our sockets? If so, fork a child
		 * process to deal with it.
		 */
		if (selres > 0)
		{
			int			i;

			for (i = 0; i < MAXLISTEN; i++)
			{
				if (ListenSocket[i] == PGINVALID_SOCKET)
					break;
				if (FD_ISSET(ListenSocket[i], &rmask))
				{
					Port	   *port;

					port = ConnCreate(ListenSocket[i]);
					if (port)
					{
						BackendStartup(port);

						/*
						 * We no longer need the open socket or port structure
						 * in this process
						 */
						StreamClose(port->sock);
						ConnFree(port);
					}
				}
			}
		}

		...
	}
}

四、创建子进程

  • src/backend/postmaster/postmaster.c

客户端连接到服务器时,服务器将fork一个子进程进行处理客户端的各种请求。

static int
BackendStartup(Port *port)
{
	...

#ifdef EXEC_BACKEND
	pid = backend_forkexec(port);
#else							/* !EXEC_BACKEND */
	pid = fork_process();
	if (pid == 0)				/* child */
	{
		free(bn);

		/* Detangle from postmaster */
		InitPostmasterChild();

		/* Close the postmaster's sockets */
		ClosePostmasterPorts(false);

		/* Perform additional initialization and collect startup packet */
		BackendInitialize(port);

		/* And run the backend */
		BackendRun(port);
	}
#endif							/* EXEC_BACKEND */
    
	...

	return STATUS_OK;
}

五、子进程主入口

  • src/backend/postmaster/postmaster.c

子进程进行相关的初始化后,进行主循环

static void
BackendRun(Port *port)
{
	...

	PostgresMain(ac, av, port->database_name, port->user_name);
}

六、子进程主循环

  • src/backend/tcop/postgres.c
    读取客户请求,解析处理请求,响应客户端。
void
PostgresMain(int argc, char *argv[],
			 const char *dbname,
			 const char *username)
{
	...
        
	for (;;)
	{
		...
            
		/*
		 * (3) read a command (loop blocks here)
		 */
		firstchar = ReadCommand(&input_message);

		...
            
		/*
		 * (7) process the command.  But ignore it if we're skipping till
		 * Sync.
		 */
		if (ignore_till_sync && firstchar != EOF)
			continue;

		switch (firstchar)
		{
			case 'Q':			/* simple query */
				{
					...
				}
				break;

			case 'P':			/* parse */
				{
					...
				}
				break;

			case 'B':			/* bind */
				...
				break;

			case 'E':			/* execute */
				{
				...
				}
				break;

			case 'F':			/* fastpath function call */
				...
				break;

			case 'C':			/* close */
				{
					...
				}
				break;

			case 'D':			/* describe */
				{
					...
				}
				break;

			case 'H':			/* flush */
				...
				break;

			case 'S':			/* sync */
				...
				break;

				/*
				 * 'X' means that the frontend is closing down the socket. EOF
				 * means unexpected loss of frontend connection. Either way,
				 * perform normal shutdown.
				 */
			case EOF:
				...

				/* FALLTHROUGH */

			case 'X':

				...
				proc_exit(0);

			case 'd':			/* copy data */
			case 'c':			/* copy done */
			case 'f':			/* copy fail */

				/*
				 * Accept but ignore these messages, per protocol spec; we
				 * probably got here because a COPY failed, and the frontend
				 * is still sending data.
				 */
				break;

			default:
				ereport(FATAL,
						(errcode(ERRCODE_PROTOCOL_VIOLATION),
						 errmsg("invalid frontend message type %d",
								firstchar)));
		}
	}							/* end of input-reading loop */
}

七、启动结构图

在这里插入图片描述


http://www.niftyadmin.cn/n/1830028.html

相关文章

Cocos2d-x 3.2:UI树

Cocos2d-x 3.2&#xff1a;UI树 本文参考与深入理解Cocos2d-x 3.x&#xff1a;UI树一文 Cocos2d-x 3.x 引擎的UI树系统 首先得普及一下Cocos2d-x的基础概念&#xff0c;Cocos2d- x的游戏世界一般是由一个又一个的场景&#xff08;Sence&#xff09;组成的&#xff0c;比如登录是…

java List的排序

List自定义排序 1、第一种方法&#xff0c;就是list中对象实现Comparable接口&#xff0c;重写compareTo接口&#xff0c; 对排序的字段进行比较。2、第二种方法&#xff0c;就是在重载Collections.sort方法。 代码示例 package com.xmy.list.sort;import java.util.ArrayList;…

Java编程思想小笔记

1.所有的类最终都继承自单一的基类-Object类&#xff0c;这就是单根继承结构&#xff0c;那么所有的接口是不是都继承自单一的基接口呢&#xff1f;&#xff1f; 2.java数据的存储&#xff1a;java对象主要存在于RAM中的堆中&#xff0c;堆不同于堆栈的好处是&#xff1a;编译器…

postgresql之词法分析简介

一、词法文件结构 flex的词法输入文件.l 结构通过%%分成三部分 声明 规则 c 代码 声明中 %{ C代码声明 %} 中包裹的内容将直接原样拷贝到生成的C代码中&#xff0c; 最后的段也是直接原样拷贝到生成的C代码中&#xff0c; 中间的规则段&#xff0c;每个规则由 模式 动作…

Easyui 生成layout

Easyui 生成layout var $tabs;var $body;var $south;function appendLayout(title, href) {if (!$body)$body $(document.body);if (!$body.hasClass(layout)) {var $centerHtml $("<div>", {"id": "center","style": "…

(转)Java web 项目中文件路径

为什么80%的码农都做不了架构师&#xff1f;>>> 源链接;http://blog.sina.com.cn/s/blog_6b695d5c01015dkp.html 前言 Java的路径问题&#xff0c;非常难搞。最近的工作涉及到创建和读取文件的工作&#xff0c;这里我就给大家彻底得解决Java路径问题。 我编写了一个…

MYSQL主从同步故障一例及解决过程

公司里有两个mysql服务器做主从同步&#xff0c;某天Nagios发来报警短信&#xff0c;mysqla is down...赶紧联系机房&#xff0c;机房的人反馈来的信息是 HARDWARE ERROR 后面信息省略&#xff0c;让机房记下错误信息后让他们帮忙重启下看是不是能正常起来&#xff0c;结果竟然…

使用 hexdump dump 文件内容

名词解释 【dump】 dump 是指把文件的内容&#xff0c;每个字节用2位十六进制数来表示的方式。 缘由 最近看矢泽久雄的《How Program Works》&#xff0c;了解到 dump “exe文件”&#xff08;恕我不知该如何将 dump 汉化&#xff09;。然后在系统&#xff08;Windows 7&#x…