postgresql整体概况

本文详细介绍了PostgreSQL的后台服务器结构及其执行流程,包括主进程(postmaster)、服务器进程(postgres)、各个文件夹的作用以及执行过程中的关键步骤。重点阐述了PostgreSQL如何通过信号灯和共享内存确保并行数据访问过程中的数据完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL是用一个简单的"每个用户对应一个进程"的client/server 模型实现的。在这种模式里一个客户端进程只是与一个服务器进程联接。因为我们不知道具体要建立多少个联接,所以我们不得不利用一个主进程 在每次联接请求时派生出一个新的服务器进程来。这个主进程叫做postmaster,它监听着一个特定TCP/IP 端口等待进来的联接。每当检测到一个联接请求时,postmaster 进程派生出一个新的叫postgres的服务器进程。服务器任务(postgres进程)相互之间使用信号灯和共享内存进行通讯,以确保在并行的数据访问过程中的数据完整性。

介绍下包含后台服务器端代码的文件夹:src/backend ,整理其各子文件夹作用:
access: 存储访问,支持堆, 索引, 和事务对数据的存取。
bootstrap: 系统初始化
catalog: 系统表以及操作。包含用于操作系统表和系统目录的函、数表、索引、过程、运算符、类型。它们都是低层的函数,通常由上层将用户请求格式化为预定义格式的函数调用。
command: 各种管理命令,不需要executor执行的命令。这些命令是不需要复杂处理的SQL命令,包括copy,alter,create table等等。调用这一部分代码时使用由parser生成的结构。大多数函数先做一些处理,然后就调用catalog目录下的一些低层函数来完成实际的工作。
executor: 执行器,执行来自optimizer的复杂的节点形式的查询计划。处理select, insert, update,和delete语句. 处理这些语句的操作包括堆扫描、索引扫描、排序、连接表、分组、计算集函数和唯一性处理。
libpq: 通信接口,处理后台服务器与客户进程之间的通讯。
Main: 主程序,将控制转到postmaster或postgres
Nodes: 查询处理过程中采用的大量抽象数据结构(查询树,连接树,查询计划)。PostgreSQL将SQL查询存储到称为节点的结构中。
parse: 语法分析
port: 各种os平台的移植
postmaster: 守护进程,控制postgres服务器启动/终止。创建共享内存,然后循环等待连接请求。请求到达时,启动一个postgres服务器进程,由它来处理这个连接。
rewrite: 重写(postgresql的规则系统实现,它的视图就是基于规则系统的)
storage: 存储,缓冲区,进程间通信,管理各种类型的存储系统。
tcop: 命令处理,将请求分派到合适的模块。postgres后台服务进程的主要处理部分,它调用parser,optimizer,executor和commands中的函数。
utils: 辅助性的工具,支持功能。
optimizer: 创建查询路径和查询计划。使用parser的输出来为executor生成优化了的查询计划。
regex: 正则表达式库

再来说说执行过程。

数据库一运行,主函数进去main-> PostmasterMain-> ServerLoop 等待连接的到来。

PostmasterMain运行过程:

postgresMain 怎么被调用?

其一:main->PostgresMain

       if (argc > 1 && strcmp(argv[1], "--single") == 0)

              exit(PostgresMain(argc, argv, get_current_username(progname)));

其二:main->SubPostmasterMain->BackendRun->PostgresMain

#ifdef EXEC_BACKEND

       if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)

              exit(SubPostmasterMain(argc, argv));

#endif

EXEC_BACKEND 什么意思,还没看明白,主要是找不到定义的地方。有知道的请告知,谢谢。

PostgresMain运行过程如下:

1、先放bsBusinessSkinForm、bsSkinData、bsStoredSkin各一个到窗体上 2、修改bsBusinessSkinForm的SkinData属性为bsSkinData1 3、修改bsSkinData1的StoredSkin属性为bsStoredSkin1 4、修改bsStoredSkin1的filename属性,指向一个皮肤文件,例如我的55套皮肤包是放在C:\Program Files\Borland\Delphi7\BSF-Skins\Skins文件夹里,我就修改 bsStoredSkin1的filename属性为C:\Program Files\Borland\Delphi7\BSF-Skins\Skins\Animate\skin.ini 5、在delphi设计窗口中按下F9 6、爽吧!!!!! 第一步-安装: 1、双击BSFD7.dpk文件,在delphi 7.0中打开 2、单击compile按钮,你会发现原来不可用的install按钮可以使用了 3、单击install按钮,会弹出来一个对话框提示你“安装成功!” 4、将所有源文件复制到C:\Program Files\Borland\Delphi7\Lib文件夹中(如delphi安装路径不同的话,请各位老兄自行更改) 第二步-最基本的使用方法: 当你安装成功后,你会在delphi的组件面板上发现三个控件组,它们是: businessskinform vcl和businessskinform db vcl和businessskinform vcl dialogs,顾名思义,第一个是常用组件,第二个是数据库组件,第三个是对话框组件。 按照下面的步骤,不用写一行代码,你可以马上做出一个有漂亮界面的程序来 1、先放bsBusinessSkinForm、bsSkinData、bsStoredSkin(在businessskinform vcl控件组中)各一个到窗体上 2、修改bsBusinessSkinForm的SkinData属性为bsSkinData1 3、修改bsSkinData1的StoredSkin属性为bsStoredSkin1 4、修改bsStoredSkin1的filename属性,指向一个皮肤文件,例如皮肤包是放在C:\Program Files\Borland\Delphi7\BSF-Skins\Skins文件夹里,我就修改 bsStoredSkin1的filename属性为C:\Program Files\Borland\Delphi7\BSF-Skins\Skins\Animate\skin.ini 5、按下F9键运行。 第三步-换肤: 现在的程序流行换肤功能,你是否也想做出一个可以让使用者换肤的程序来呢?请跟我一步一步来做: 1、请做完第二步中的各个步骤 2、添加三个bsSkinSpeedButton到窗体上,name分别是bsSkinSpeedButton1、bsSkinSpeedButton2、bsSkinSpeedButton3,caption分别是皮肤1、皮肤2、皮肤3 3、添加两个bsStoredSkin到窗体上,加上上面已添加的一个,共是三个,name分别是bsStoredSkin2、bsStoredSkin3。 4、将这三个bsStoredSkin的filename属性各指向三个不同的皮肤文件(什么?不知道怎么指?晕!参见第二步中的步骤4!) 5、添加代码,如下: procedure TForm1.bsSkinSpeedButton1Click(Sender: TObject); begin bsSkinData1.StoredSkin:=bsStoredSkin1; end; procedure TForm1.bsSkinSpeedButton2Click(Sender: TObject); begin bsSkinData1.StoredSkin:=bsStoredSkin2; end; procedure TForm1.bsSkinSpeedButton3Click(Sender: TObject); begin bsSkinData1.StoredSkin:=bsStoredSkin3; end; 6、按下F9先,分别点三个按钮试试再! 做主菜单要先加上一个bsSkinMainMenuBar控件,然后加上一个bsSkinMainMenu,把 bsSkinMainMenuBar的MainMenu属性为bsSkinMainMenu,再把bsBusinessSkinForm的MainMenuBar属性指为bsSkinMainMenuBar即可! 至于滚动条,需要自己手动加上,然后把它的HScrollBar和VScrollBar属性指向你所加的滚动条!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值