Postgresql启动后申请两段内存,在启动时会判断系统支持情况,默认是使用mmap申请共享内存。
Postgresql的共享内存在9.2以后就是使用mmap申请的了,在少数情况下使用ipc的共享内存。
下面在CreateSharedMemoryAndSemaphores中初始化的数据结构,都是在父进程中初始化好,直接继承给子进程使用的。
mmap内存块使用情况:
0x2aaaaac00000[mmap] ----------------------- <-- ShmemSegHdr / ShmemBase
PGShmemHeader
int32 magic;
pid_t creatorPID;
Size totalsize;
Size freeoffset;
dsm_handle dsm_control;
void *index;
freeoffset=56 -> - - - - - - - - - - - - <-- sharedSemas(信号量:一个进程一个sem_t)
PGSemaphoreData(128B)
PGSemaphoreData
...(2035+5)
PGSemaphoreData
freeoffset=261176 -> - - - - - - - - - - - - <-- ShmemLock(spinlock:一个slock_t)
slock_t(1B)
(只用1B但按8B对齐)
freeoffset=261184 - - - - - - - - - - - - <-- ShmemVariableCache(关键全局计数器)
VariableCache
freeoffset=261376 - - - - - - - - - - - -
LWLOCK
...
freeoffset=288256 - - - - - - - - - - - - <-- ShmemIndex(key:48B/val:ShmemIndexEnt)
ShmemInitHash("ShmemIndex") (共享内存索引哈希表)
(哈希表初始化好了,后面用ShmemInitStruct申请共享内存)
(前面使用ShmemAlloc申请)
(后面使用ShmemInitStruct调用ShmemAlloc申请)
freeoffset=298880 - - - - - - - - - - - - <-- XLogCtl(XLOG和写BUFFER)
XLogCtlData
...
freeoffset=4507136 - - - - - - - - - - - - <-- ControlFile(控制文件)
ControlFileData
freeoffset=4507520 - - - - - - - - - - - - <-- SharedStats
XLogPrefetchStats
freeoffset=4507648 - - - - - - - - - - - -
...
...
...
...
...
0x2aaabea00000 ----------------------- [mmap] <-- ShmemEnd
...
IPC的共享内存:
在当前例子中,IPC的共享内存只申请了一个PGShmemHeader的空间,没有其他空间可以使用。
0x7fc90a686000 ----------------------- [shmget] <-- InternalIpcMemoryCreate / UsedShmemSegAddr
PGShmemHeader
-----------------------
其中