读书人

PostgreSQL起步过程中的那些事七:初始

发布时间: 2012-07-04 19:33:55 作者: rapoo

PostgreSQL启动过程中的那些事七:初始化共享内存和信号十四:shmem中初始化PMSignal

?

初始化PMSingal方法调用流程图

?

话说main()->…->PostmasterMain()->…->reset_shared() ->CreateSharedMemoryAndSemaphores()>…-> PMSignalShmemInit(),调用ShmemInitStruct(),在其中调用hash_search()在哈希表索引"ShmemIndex"中查找"PMSignalState",如果没有,就在shmemIndex中给"PMSignalState"分一个HashElement和ShmemIndexEnt(entry),在其中的Entry中写上"PMSignalState"。返回ShmemInitStruct(),再调用ShmemAlloc()在共享内存上给"PMSignalState"相关结构(见下面“PMSignalState相关结构图”)分配空间,设置entry(在这儿及ShmemIndexEnt类型变量)的成员location指向该空间,size成员记录该空间大小,最后返回PMSignalShmemInit (),让PMSingalData *类型静态全局变量PMSignalState指向所分配内存,初始化PMSingalData结构类型的成员值,其中包括一个信号数组成员。

相关结构定义和图见下面:

struct PMSignalData

{

??? /* per-reason flags */

??? sig_atomic_t PMSignalFlags[NUM_PMSIGNALS];

??? /* per-child-process flags */

??? int??????? num_child_flags;? /* # of entriesin PMChildFlags[] */

??? int??????? next_child_flag;? /* next slot totry to assign */

??? sig_atomic_t PMChildFlags[1];????? /* VARIABLE LENGTH ARRAY */

};

?

NON_EXEC_STATIC volatile PMSignalData*PMSignalState = NULL;

信号在各操作系统中是不同的。下面是各系统的信号类型PGSemaphoreData的定义。

POSIX标准的PGSemaphoreData的定义:

typedef sem_tPGSemaphoreData;

SYSV标准的PGSemaphoreData的定义:

typedef structPGSemaphoreData

{

??? int???????? semId;????????? /* semaphore set identifier */

??? int???????? semNum;???????? /* semaphore number within set */

} PGSemaphoreData;

Windows系统PGSemaphoreData的定义:

typedef HANDLEPGSemaphoreData;

初始化完PMSignalState相关结构的共享内存结构图

?

PMSignalState相关结构图

读书人网 >操作系统

热点推荐