首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

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

2012-07-04 
PostgreSQL启动过程中的那些事七:初始化共享内存和信号十四:shmem中初始化PMSignal?初始化PMSingal方法调

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相关结构图

热点排行