加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 17:47:08 所属栏目:百科 来源:网络整理
导读:这一节pg初始化共享后台进程状态数组SharedBackendStatus和多个字符串缓存,通过CreateSharedBackendStatus例程实现。 1先上个图,看一下函数调用过程梗概,中间略过部分细节 初始化 SharedBackendStatus 方法调用流程图 2初始化xlog相关结构 话说main()-…-

这一节pg初始化共享后台进程状态数组SharedBackendStatus和多个字符串缓存,通过CreateSharedBackendStatus例程实现。

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


初始化SharedBackendStatus方法调用流程图

2初始化xlog相关结构

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

CreateSharedBackendStatus()调用ShmemInitStruct(),在其中调用hash_search()在哈希表索引"ShmemIndex"中查找"Backend Application Name Buffer",如果没有,就在shmemIndex中给"Backend Application Name Buffer"分一个HashElement和ShmemIndexEnt(entry),在其中的Entry中写上"BackendApplication Name Buffer"。返回ShmemInitStruct(),再调用ShmemAlloc()在共享内存上给"BackendApplication Name Buffer"相关结构(见下面“BackendStatus相关结构图”)分配空间,设置entry(在这儿及ShmemIndexEnt类型变量)的成员location指向该空间,size成员记录该空间大小,最后返回CreateSharedBackendStatus(),让char *类型全局变量BackendAppnameBuffer指向所分配内存,设置上面BackendStatusArray变量所指的PgBackendStatus结构链表的每一个成员的st_appname指向BackendAppnameBuffer的每一个64字节长char *,形成一一对应。

CreateSharedBackendStatus()调用ShmemInitStruct(),在其中调用hash_search()在哈希表索引"ShmemIndex"中查找"Backend Client Host Name Buffer",如果没有,就在shmemIndex中给"Backend Client Host Name Buffer"分一个HashElement和ShmemIndexEnt(entry),在其中的Entry中写上"BackendClient Host Name Buffer"。返回ShmemInitStruct(),再调用ShmemAlloc()在共享内存上给"BackendClient Host Name Buffer"相关结构(见下面“BackendStatus相关结构图”)分配空间,设置entry(在这儿及ShmemIndexEnt类型变量)的成员location指向该空间,size成员记录该空间大小,最后返回CreateSharedBackendStatus(),让char *类型全局变量BackendClientHostnameBuffer指向所分配内存,设置上面BackendStatusArray变量所指的PgBackendStatus结构链表的每一个成员的st_clienthostname指向BackendClientHostnameBuffer的每一个64字节长char *,形成一一对应。

InitPredicateLocks()调用ShmemInitStruct(),在其中调用hash_search()在哈希表索引"ShmemIndex"中查找"Backend Activity Buffer",如果没有,就在shmemIndex中给"Backend Activity Buffer"分一个HashElement和ShmemIndexEnt(entry),在其中的Entry中写上"BackendActivity Buffer"。返回ShmemInitStruct(),再调用ShmemAlloc()在共享内存上给"BackendActivity Buffer"相关结构(见下面“Backend Status相关结构图”)分配空间,设置entry(在这儿及ShmemIndexEnt类型变量)的成员location指向该空间,size成员记录该空间大小,最后返回InitPredicateLocks(),让char *类型全局变量BackendActivityBuffer指向所分配内存,设置上面BackendStatusArray变量所指的PgBackendStatus结构链表的每一个成员的st_activity指向BackendActivityBuffer的每一个1024字节长char *,形成一一对应。

相关结构定义见下面:

typedef struct PgBackendStatus

{

/*

* To avoid lockingoverhead,we use the following protocol: a backend

* incrementsst_changecount before modifying its entry,and again after

* finishing amodification. A would-be reader shouldnote the value of

* st_changecount,copy theentry into private memory,then check

* st_changecountagain. If the value hasn't changed,andif it's even,

* the copy is valid;otherwise start over. This makes updatescheap

* while reads are potentiallyexpensive,but that's the tradeoff we want.

*/

int st_changecount;

/* The entry is valid iff st_procpid> 0,unused if st_procpid == 0 */

int st_procpid;

/* Times when current backend,transaction,and activity started */

TimestampTz st_proc_start_timestamp;

TimestampTz st_xact_start_timestamp;

TimestampTz st_activity_start_timestamp;

/* Database OID,owning user's OID,connection client address */

Oid st_databaseid;

Oid st_userid;

SockAddr st_clientaddr;

char *st_clienthostname; /* MUST be null-terminated */

/* Is backend currently waiting onan lmgr lock? */

bool st_waiting;

/* application name; MUST benull-terminated */

char *st_appname;

/* current command string; MUST benull-terminated */

char *st_activity;

} PgBackendStatus;


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

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

Backend Status相关结构图

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读