看着下面这个图, 就想到了“孔雀开屏”。从main开始经过细致、周密的准备,pg启动了postmaster进程、系统日志进程、昙花一现的启动进程、后台写进程、写WAL日志进程、……,最后在服务器段抛出一句”database system is ready to acceptconnections”,开始准备对外提供服务。如果这时有客户端请求,就启动postgres服务进程提供服务。
从main开始,初始化内存上下文、设置时区、设置行政区时间、设置SSL、分配共享内存、在共享内存里初始化一系列对象和设施、设置文件描述、初始化后台进程列表、设置信号处理句柄、加载hba等文件,再加上共同的错误、日志处理模块、内部实现的PG_TRY、PG_CATCH、PG_END_TRY,各进程相同的内存管理机制,还有处理并发的锁机制等等,构成了“孔雀”的体,其中内存上下文每个pg进程都有一套,共享内存由所有进程共同使用。然后启动相关辅助进程和提供服务的postgres服务进程,构成了“孔雀开屏”的“屏”。如果给点并发,这个“屏”就开的更大更炫目了。加上做IPC的文件、管道、信号、共享内存等这些经络,这个“孔雀”活了。
Pg的多进程架构经住了很多严苛场景的考验,如果把其中数据库相关业务逻辑干掉,pg就可以是个不错的通用多进程程序架构,可以在上面填入自己的业务逻辑代码,少花好多精力得了一个非常棒的多进程架构,有需要的可以考虑。要是把fork换成ThreadCreate,稍加改造,这也是个很好的多线程程序架构。
“孔雀开屏”图
------------ 转载请著明出处,来自博客: blog.csdn.net/beiigang beigang.iteye.com