@H_403_1@一、Postgres在启动后,可分别以一下四种形式启动进程:
* SubPostmasterMain
* AuxiliaryProcessMain
* PostgresMain
* PostmasterMain @H_403_1@PostmasterMain
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数并载入hba和ident
5. 设置共享内存和信号量,初始化共享数据结构
6. 设置信号处理句柄
7. 启动守护进程:
(1) syslogger:收集其他其他进程的日志输出,写入到文件
(2) stats daemon:通过UDP获取各backend的运行时统计信息
(3) autovacuum launcher:定期进行表空间的自动清理
8. 由参数forkboot启动一个backend
9. 绑定到TCP socket,监听连接请求 @H_403_1@PostgresMain(--single)
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数和其他startup packet中的参数
5. 设置信号处理句柄
6. 初始化一个backend(无论它是否由postmaster生成):ipc,lock,file,storage,buffer
7. 启动XLOG
8. 加载FreeSpaceMap
9. 初始化进程
10. 初始化表缓存和系统目录访问
11. 处理预加载的库
12. 转到MessageContext内存池
13. 进入查询处理主循环 @H_403_1@SubPostmasterMain(--fork)
1. 指明由postmaster派生
2. 设置进程ID
3. 初始化内存池
4. 处理输入参数
5. 运行相应的backend或子进程
a) –forkbackend或–forkboot
1)关联到共享内存
2)初始化共享内存访问(UsedShmemSegAddr)
3)初始化AuxiliaryProcess
4)创建共享内存和信号量
5)启动AuxiliaryProcessMain
@H_403_1@b) –forkavlauncher
1)关联到共享内存
2) AutovacuumLauncherIAm()
3)初始化共享内存访问(UsedShmemSegAddr)
4)初始化AuxiliaryProcess
5)创建共享内存和信号量
6)启动AutoVacLauncherMain
@H_403_1@c) –forkavworker
1)关联到共享内存
2) AutovacuumLauncherIAm()
3)初始化共享内存访问(UsedShmemSegAddr)
4)初始化AuxiliaryProcess
5)创建共享内存和信号量
6)启动AutoVacWorkerMain
@H_403_1@d) –forkarch
1)启动PgArchiverMain
e) –forkcol
1)启动PgstatCollectorMain
f) –forklog
1)启动SysLoggerMain
@H_403_1@AuxiliaryProcessMain(--boot)
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数
5. 以BootstrapProcessing模式初始化一个backend:ipc,buffer
6. 设置信号处理句柄
7. 以NormalProcessing状态针对不同auxType分别进行以下处理
a) CheckerProcess
1)启动CheckerModeMain
b) BooststrapProcess
1) BootstrapXLOG
2)启动XLOG
3)启动BootstrapModeMain
c) StartupProcess
1)启动XLOG
2)加载FreeSpaceMap
3) BuildFlatFiles(false)
d) BgWriterProcess
1)初始化XLOG访问
2)启动BackgroundWriterMain
e) WalWriterProcess
1)初始化XLOG访问
2)启动WalWriterMain
@H_403_1@二、CATALOG的导入
1. 获取存放数据的目录DataDir
2. 创建该目录及其子目录
"global"
"pg_xlog"
"pg_xlog/archive_status"
"pg_clog"
"pg_subtrans"
"pg_twophase"
"pg_multixact/members"
"pg_multixact/offsets"
"base"
"base/1"
"pg_tblspc"
3. 初始化内存池
4. 以BootstrapProcessing模式初始化一个backend:ipc,buffer
5. 以NormalProcessing模式BootStrapXLOG和启动XLOG
6. 以BootstrapProcessing模式做类似backend的初始化
(1) 初始化进程
(2) 初始化表缓存和系统目录访问
7. 读入bki文件,解析并执行
8. 设置checkpoint确保所有更新被写入磁盘 @H_403_1@三、CATALOG的读取
1. PostgresMain中的1-9
2. 初始化relation description cache,创建一个空的cache哈希表
3. 初始化system catalogs cache
4. 启动事务系统
5. 使用formrdesc(仅用于pg_class、pg_attribute、pg_proc和pg_type)读取预计算好的relcache入口(或 nailed-in-cache relations的最小集的phony入口)
6. 在非bootstrapping模式下,确保可以访问critical system indexes
7. 访问并更新所有从formrdesc和relcache cache file中获得的数据。
8. 完成所有catcaches的初始化,预载最重要的系统目录和索引,并写入到relcache cache file供将来backend使用。 @H_403_1@注:此文章转自如下链接http://hi.baidu.com/roo7/blog/item/3432ce017ee95306728da554.html
* SubPostmasterMain
* AuxiliaryProcessMain
* PostgresMain
* PostmasterMain @H_403_1@PostmasterMain
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数并载入hba和ident
5. 设置共享内存和信号量,初始化共享数据结构
6. 设置信号处理句柄
7. 启动守护进程:
8. 由参数forkboot启动一个backend
9. 绑定到TCP socket,监听连接请求 @H_403_1@PostgresMain(--single)
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数和其他startup packet中的参数
5. 设置信号处理句柄
6. 初始化一个backend(无论它是否由postmaster生成):ipc,lock,file,storage,buffer
7. 启动XLOG
8. 加载FreeSpaceMap
9. 初始化进程
10. 初始化表缓存和系统目录访问
11. 处理预加载的库
12. 转到MessageContext内存池
13. 进入查询处理主循环 @H_403_1@SubPostmasterMain(--fork)
1. 指明由postmaster派生
2. 设置进程ID
3. 初始化内存池
4. 处理输入参数
5. 运行相应的backend或子进程
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数
5. 以BootstrapProcessing模式初始化一个backend:ipc,buffer
6. 设置信号处理句柄
7. 以NormalProcessing状态针对不同auxType分别进行以下处理
1. 获取存放数据的目录DataDir
2. 创建该目录及其子目录
3. 初始化内存池
4. 以BootstrapProcessing模式初始化一个backend:ipc,buffer
5. 以NormalProcessing模式BootStrapXLOG和启动XLOG
6. 以BootstrapProcessing模式做类似backend的初始化
7. 读入bki文件,解析并执行
8. 设置checkpoint确保所有更新被写入磁盘 @H_403_1@三、CATALOG的读取
1. PostgresMain中的1-9
2. 初始化relation description cache,创建一个空的cache哈希表
3. 初始化system catalogs cache
4. 启动事务系统
5. 使用formrdesc(仅用于pg_class、pg_attribute、pg_proc和pg_type)读取预计算好的relcache入口(或 nailed-in-cache relations的最小集的phony入口)
6. 在非bootstrapping模式下,确保可以访问critical system indexes
7. 访问并更新所有从formrdesc和relcache cache file中获得的数据。
8. 完成所有catcaches的初始化,预载最重要的系统目录和索引,并写入到relcache cache file供将来backend使用。 @H_403_1@注:此文章转自如下链接http://hi.baidu.com/roo7/blog/item/3432ce017ee95306728da554.html