`

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

阅读更多

 

       这一节 pg 初始化 postmaster 子进程给 postmaster 进程发送信号用到的相关结构,在共享内存里通过信号交互,通过 PMSignalShmemInit 例程实现 。主要是初始化了一个 PMSignalData 结构,并使用了面向过程编程的一个技巧,把这个结构中的固定长度数组 sig_automatic_t PMChildFlags[1] 扩充成 2XMaxBackends=200 个的信号的数组,以供 postmaster 进程和 postmaster 子进程之间互动互操作。

 

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


初始化 PMSingal 方法调用流程图

 

2 初始化 xlog 相关结构

话说 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 entries in PMChildFlags[] */

    int         next_child_flag ;  /* next slot to try to assign */

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

};

 

NON_EXEC_STATIC volatile PMSignalData *PMSignalState = NULL;

 

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

POSIX 标准的 PGSemaphoreData 的定义:

typedef sem_t PGSemaphoreData;

SYSV 标准的 PGSemaphoreData 的定义:

typedef struct PGSemaphoreData

{

    int         semId;          /* semaphore set identifier */

    int         semNum;         /* semaphore number within set */

} PGSemaphoreData;

Windows 系统 PGSemaphoreData 的定义:

typedef HANDLE PGSemaphoreData;

 

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

       为了精简上图,把创建 shmem 的哈希表索引 "ShmemIndex" 时创建的 HCTL 结构删掉了,这个结构的作用是记录创建可扩展哈希表的相关信息,不过这个结构在 "ShmemIndex" 创建完成后也会由于出了对象作用域而消失。增加了左边灰色底的部分,描述 共享内存 /shmem 里各变量物理布局概览,由下往上,由低地址到高地址。 图中黄色的索引项就是本节新增加的索引项。

 

 

PMSignalState 相关结构图

  • 大小: 12.6 KB
  • 大小: 126 KB
  • 大小: 530.9 KB
0
0
分享到:
评论

相关推荐

    nacos-2.0.1 postgresql初始化脚本

    nacos-2.0.1 postgresql初始化脚本

    PostgreSQL中文手册9.2

    一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: . 50 PostgreSQL PostgreSQL...

    postgresql-42.3.1-API文档-中文版.zip

    赠送jar包:postgresql-42.3.1.jar; 赠送原API文档:postgresql-42.3.1-javadoc.jar; 赠送源代码:postgresql-42.3.1-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    postgresql-42.2.5-API文档-中英对照版.zip

    赠送jar包:postgresql-42.2.5.jar; 赠送原API文档:postgresql-42.2.5-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    关于PostGreSQL中的存储过程

    关于PostGreSQL中的存储过程 PostGreSQL是一个开源的数据库

    SpringBoot2.2.8集成PostgreSQL12 JPA MyBatis

    从零初始化一个SpringBoot项目,集成PostgreSQL并使用JPA和MyBatis两种方式对其进行操作。这里只记录PostgreSQL相关操作,项目创建过程不详细介绍,类似流程可参考文章<<Spring Boot:Idea从零开始初始化后台项目>>...

    Postgresql存储过程

    存储过程 postgresql postgresql存储过程

    PostgreSQL修炼之道:从小工到专家

    PostgreSQL数据库领域经典著作 系统讲解PostgreSQL技术内幕,深入分析PostgreSQL特色功能,包含大量来自实际生产环境的经典案例和经验总结 PostgreSQL数据库是目前功能最强大的开源数据库,它基本上包含其他所有...

    postgresql-42.2.2-API文档-中文版.zip

    赠送jar包:postgresql-42.2.2.jar; 赠送原API文档:postgresql-42.2.2-javadoc.jar; 赠送源代码:postgresql-42.2.2-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    postgresql-42.3.3-API文档-中文版.zip

    赠送jar包:postgresql-42.3.3.jar; 赠送原API文档:postgresql-42.3.3-javadoc.jar; 赠送源代码:postgresql-42.3.3-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    postgresql-42.2.2-API文档-中英对照版.zip

    赠送jar包:postgresql-42.2.2.jar; 赠送原API文档:postgresql-42.2.2-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    一套C#与PostgreSQL数据库完美结合的实例

    本套程序是在VS2005下C#开发,利用PostgreSQL作为数据库。 本程序的重点是如何利用C#对PostgreSQL数据库进行操作,PDatabase.cs是一个完整的操作类,role是角色表的操作类,程序采用三层架构模型。 在对PostgreSQL...

    postgresql-42.2.6-API文档-中文版.zip

    赠送jar包:postgresql-42.2.6.jar; 赠送原API文档:postgresql-42.2.6-javadoc.jar; 赠送源代码:postgresql-42.2.6-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    PostgreSQL 14.1 中文手册

    PostgreSQL 14.1 手册 PostgreSQL 全球开发组 翻译:彭煜玮1,PostgreSQL中文社区2文档翻译组

    PostgreSQL12.2中文手册.chm.7z

    PostgreSQL12.2中文手册.chm.7z PostgreSQL12.2中文手册.chm.7z

    tencentyun#intlcloud-documents#初始化PostgreSQL实例_intl_zh1

    创建 PostgreSQL 实例后,您还需要进行 PostgreSQL 实例的初始化,以轻松启用实例。操作步骤登录 PostgreSQL 控制台,在实例列表,选

    PostgreSQL 存储过程调试

    NULL 博文链接:https://haige18.iteye.com/blog/1746527

    Test-postgresql:积极维护的Test :: postgresql的分支

    Test-postgresql:积极维护的Test :: postgresql的分支

    PostgreSQL11.2-中文手册.pdf

    《PostgreSQL 11.2手册》是基于《PostgreSQL 10.1手册》翻译,并且合并了武汉大学彭煜玮老师翻译的《PostgreSQL 11.0文档》中的大量内容。其余翻译工作由翻译小组的志愿者们完成。 感谢彭老师和翻译小组的志愿者...

    postgresql-42.3.3-API文档-中英对照版.zip

    赠送jar包:postgresql-42.3.3.jar; 赠送原API文档:postgresql-42.3.3-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

Global site tag (gtag.js) - Google Analytics