日期:2014-05-16  浏览次数:20481 次

pg启动过程中的那些事七:初始化共享内存和信号一:初始化shmemIndex和信号

?

?????? pg 现在要初始化另一块内存——共享内存 shared memory (以后 shared memory 有时会简写成 shmem ),在这块内存里, pg 存放数据、锁、各种 backend 进程等。

1 先上个图,看一下函数调用过程梗概,中间略过部分细节


?

初始化共享内存方法调用流程图

?

2 计算 shared memory 大小

话说 main()-> ->PostmasterMain()-> ->reset_shared() ,在 reset_shared () 这个函数里, pg 首先计算干 xxx 一堆事需要的内存大小 size ,然后分之。

首先我们看看都计算了哪些内存, 估算使用动态哈希表管理共享内存需要的内存;计算数据池及管理需要的内存(根据shared_buffer );计算锁表需要的共享内存;计算xlogclog 需要的共享内存;计算共享进程、子事务、并发控制、轻量级锁、backend 进程、后台写等需要的共享内存等,这些共享内存统统累加到size 。计算shared memory 共享内存代码如下:

??????? size = 100000;

??????? size = add_size(size, hash_estimate_size(SHMEM_INDEX_SIZE,

??????????????????????????????????????????????? ? sizeof (ShmemIndexEnt)));

??????? size = add_size(size, BufferShmemSize());

??????? size = add_size(size, LockShmemSize());

??????? size = add_size(size, ProcGlobalShmemSize());

??????? size = add_size(size, XLOGShmemSize());

??????? size = add_size(size, CLOGShmemS