PostgreSQL启动过程中的那些事七:初始化共享内存和信号八:shmem中初始化常规锁管理器(三)

2014-11-24 08:24:01 · 作者: · 浏览: 17
; /* uniqueidentifier of locallock entry */

/* data */

LOCK *lock; /* associated LOCK object in shared mem */

PROCLOCK *proclock; /* associated PROCLOCK object in shmem */

uint32 hashcode; /* copy of LOCKTAG's hash value */

int64 nLocks; /* totalnumber of times lock is held */

int numLockOwners; /* # of relevantResourceOwners */

int maxLockOwners; /* allocated size ofarray */

LOCALLOCKOWNER*lockOwners; /* dynamically resizable array */

} LOCALLOCK;

#define LOCALLOCK_LOCKMETHOD(llock)((llock).tag.lock.locktag_lockmethodid)

\

初始化完LOCK相关结构的内存结构图

为了精简上图,把创建shmem的哈希表索引"ShmemIndex"时创建的HCTL结构删掉了,这个结构的作用是记录创建可扩展哈希表的相关信息。增加了左边灰色底的部分,描述共享内存/shmem里各变量物理布局概览,由下往上,由低地址到高地址。图中黄色的索引项就是本节新增加的索引项。其中的"LOCK hash"相关结构内存图、"PROCLOCK hash"相关结构内存图下面分别给出,要不上面的图太大太复杂了。在MemoryContext "PROCLOCK hash"中分配的哈希表"PROCLOCK hash"相关结构内存图和当前pg中的MemoryContext相关实例图也在下边一并给出。

\

"LOCK hash"相关结构图

\

"PROCLOCK hash"相关结构图

\

"LOCALLOCKhash"相关结构图

\

当前pg中的MemoryContext结构图