Postgresql学习笔记【3】-pg的进程

1. pg进程结构

pg的服务进程在操作系统中的名字都叫postgres,pg在多用户模式下启动后,用pidof postgres命令可以看到至少6个进程id。

但其实,pg的进程结构是:

单用户模式下只有1个进程postmaster

多用户模式下,有一个postmaster进程,它会启动几个辅助进程,如:

SysLogger(负责系统日志)

PgStat(负责收集数据的统计信息)

AutoVacuum(系统自动清理)

BgWriter(后台写进程)

WalWriter(预写式日志进程)

PgArch(预写式日志归档进程)

当每个客户端连接pg时,会先和postmaster请求分配一个postgres服务进程,分配服务进程后,客户端就只和服务进程交互了。postmaster只负责监听系统的状态,将必要的任务交给辅助进程来做。

其实postmaster和postgres都是从postgres程序装载的,只是执行的分支不一样。在linux上,pg安装目录下bin/postmaster只是bin/postgres的一个软连接,在windows上是一个拷贝。

众所周知,这种1:1的进程结构(一个客户端对应一个服务进程)比多线程的结构开销要大。进程的创建和回收比线程更加消耗资源。但是多进程的一个好处就是:系统的各个模块、各个服务进程之间耦合度更低,不会因为某一个后台进程崩溃导致系统的崩溃。在高性能的服务器上,通常几十个进程的开销并不会明显影响到性能,记得有人测试过,超过200个客户端连接到pg后同时执行查询,pg的性能会有明显的下降,其实这也不奇怪。200个用户的并发对事务管理系统和存储管理系统的压力也会导致性能下降,相信200个进程的创建开销并不是主要的。总而言之,相信pg的进程结构还是比较适合目前硬件条件下的数据库系统的。

2. pg的主函数

下面就来跟一下pg启动的代码:

pg启动时,我设置的命令行参数是:

-D [数据集簇的路径]

pg的主函数入口在src/backend/main/main.c中的main函数。

执行的流程如下:

【1】从argv[0]中取出postgres程序的文件名,通过这个文件名,pg可以知道自己是从哪个程序装载进来的:

progname = get_progname(argv[0]);

在这里,发现一个值得学习的地方:对不能随意修改的变量加上const关键字,需要修改时复制一份出来做修改,比如这个函数中的argv[0]. 此外C语言中的const 指针可以确保指针所指向的内容不能改变,而不是指针本身的值不能改变。

【2】将argv和环境变量复制一份,并将原来的argv和environ指针覆盖:

argv = save_ps_display_args(argc, argv);

这样pg就在自己的内存空间保存了一份环境变量和参数, 暂时不太明白这么做的意义

【3】设置locale和服务目录:

set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("postgres"));

这块有一堆处理平台兼容的代码,没仔细看。

【4】检查argv[1]中是否是--version、-?、--help、-V等参数,若是,则打印版本或者帮助,不启动pg服务直接exit(0):

if (argc > 1)
	{
		if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
		{
			help(progname);
			exit(0);
		}
		if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
		{
			puts("postgres (PostgreSQL) " PG_VERSION);
			exit(0);
		}
	}


【5】检查当前执行postgres程序的系统用户是否是root:

check_root(progname);

如果是,则打印错误信息,exit(1).  在linux上检查是否root是通过getuid的系统调用实现的,root的uid是0. 在windows上据说也是不能用administrator用户启动pg的。 这可能是出于安全的考虑,具体还不是很清楚

【6】检查argv[1],如果是--boot,则通过src/backend/bootstrap/bootstrap.c中的AuxiliaryProcessMain函数启动初始化数据集簇的bootstrap进程,这可以在白手起家创建系统库。initdb其实也只走的这个分支。如果是--describe-config则打印配置信息。如果是--single则启动单用户模式。缺省情况下,pg会在这里调用src/backend/postmaster/postmaster.c的PostMasterMain函数,以多用户模式启动:

	if (argc > 1 && strcmp(argv[1], "--boot") == 0)
		AuxiliaryProcessMain(argc, argv);		/* does not return */
	else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0)
		GucInfoMain();			/* does not return */
	else if (argc > 1 && strcmp(argv[1], "--single") == 0)
		PostgresMain(argc, argv,
					 NULL,		/* no dbname */
					 get_current_username(progname));	/* does not return */
	else
		PostmasterMain(argc, argv);		/* does not return */
	abort();					/* should not get here */

3. postmaster

进入PostMasterMain跟踪调试。

发现这里先是拿到当前的进程pid和时间,设置当前进程所创建的文件的umask,然后就是初始化内存上下文。在pg7.1中有了内存上下文管理。这个内存上下文在pg中是全局的,各个子进程都可以访问到。所有的内存空间都从上下文中申请和释放,这样就避免了内存泄漏。

接下来是解析命令行参数、加载配置、检查数据集簇的路径、创建数据集簇中的锁文件、创建套接字监听、注册信号处理函数、启动辅助进程(Syslogger、Pgstat、AutoVacuum、bgwriter)、装载用户认证文件(hba和ident文件)等等。

最后执行ServerLoop函数,进入监听循环,等待客户端的请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以和你分享一些关于 PostgreSQL学习笔记。 1. PostgreSQL 是什么? PostgreSQL 是一种开源的关系型数据库管理系统,它支持 SQL 语言和 ACID 事务处理,并且具有丰富的特性和扩展性,可用于大型企业应用、Web 应用和嵌入式应用。 2. PostgreSQL 的特点 PostgreSQL 具有以下特点: - 开源免费 - 支持 ACID 事务处理 - 支持 SQL 语言 - 支持复杂查询和数据类型 - 支持存储过程和触发器 - 可以扩展和定制 - 可以跨平台运行 3. PostgreSQL 的安装 在 Windows 平台下,可以从官网下载 Windows 安装程序进行安装。在 Linux 平台下,可以使用包管理器安装,例如 Ubuntu 可以使用以下命令进行安装: ``` sudo apt-get install postgresql ``` 4. PostgreSQL 的基本操作 创建数据库: ``` CREATE DATABASE databasename; ``` 创建表: ``` CREATE TABLE tablename ( column1 datatype, column2 datatype, column3 datatype, .... ); ``` 插入数据: ``` INSERT INTO tablename (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 查询数据: ``` SELECT column1, column2, ... FROM tablename WHERE condition; ``` 更新数据: ``` UPDATE tablename SET column1 = value1, column2 = value2, ... WHERE condition; ``` 删除数据: ``` DELETE FROM tablename WHERE condition; ``` 5. PostgreSQL 的扩展 PostgreSQL 可以通过扩展来增强其功能,例如: - PostGIS:空间数据处理扩展 - PL/Python:Python 语言扩展 - pgAdmin:可视化管理工具 - pgpool-II:连接池和负载均衡工具 以上就是一些关于 PostgreSQL 的基本学习笔记,希望对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值