日期:2014-05-16 浏览次数:20513 次
?
?????? pg 现在要初始化另一块内存——共享内存 shared memory (以后 shared memory 有时会简写成 shmem ),在这块内存里, pg 存放数据、锁、各种 backend 进程等。
1 先上个图,看一下函数调用过程梗概,中间略过部分细节
?
初始化共享内存方法调用流程图
?
2 计算 shared memory 大小
话说 main()-> … ->PostmasterMain()-> … ->reset_shared() ,在 reset_shared () 这个函数里, pg 首先计算干 xxx 一堆事需要的内存大小 size ,然后分之。
首先我们看看都计算了哪些内存, 估算使用动态哈希表管理共享内存需要的内存;计算数据池及管理需要的内存(根据shared_buffer );计算锁表需要的共享内存;计算xlog 、clog 需要的共享内存;计算共享进程、子事务、并发控制、轻量级锁、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