设为首页 加入收藏

TOP

PostgreSQL启动过程中的那些事七:初始化共享内存和信号一:初始化shmemIndex和信号(二)
2014-11-24 00:59:50 来源: 作者: 【 】 浏览:11
Tags:PostgreSQL 启动 过程 那些 初始 共享 内存 信号 shmemIndex
dev_t device; /* device data directory is on */

ino_t inode; /* inode number of data directory */

#endif

} PGShmemHeader;

现在到了InitShmemAllocation()函数,调用SpinLockInit()给该共享内存初始化spinlock锁ShmemLock以备shmem分配时使用。再调用ShmemAlloc()(这个涉及到pg的另一块内存——共享内存/shared memory/shmem的管理机制,到pg的内存管理机制时在讨论。共享内存占pg整个使用内存的90%以上)给事务管理器transaction manager 在shmem上分配一个VariableCacheData 类型的空间赋给VariableCacheData *类型变量ShmemVariableCache以备后用。

接着调用CreateLWLocks()计算需要的LWLock锁(关于pg中的锁到并发控制的时候再讨论)的数目,并根据计算的数目分配LWLock数组需要的空间。每个内存块(根据设定,一般8k)需要两个LWLock,还有clog、subtrans等需要的,这个数目会比较大,在我PC上shared_buffer是200MB时这个数目是50,000+。

3分配并初始化shmem索引"ShmemIndex"——可扩展哈希表

下来调用InitShmemIndex()初始化一个pg的可扩展哈希表(见pg中的数据结构一)"ShmemIndex"作为共享内存/sharedmemory/shmem的索引。Pg基于该索引表"ShmemIndex"管理shmem内存。这里就是HTAB、HASHHDR、HashSegment、HashBucket、HashElemen等等一堆招呼,可扩展哈希表"ShmemIndex"诞生了。其中的HTAB在TopMemoryContext里,其它在shmem里,"ShmemIndex"哈希表里存的是ShmemIndexEnt类型实例,记录shmem里每个内存块的名字、大小及偏移信息。按默认信息创建的"ShmemIndex"哈希表可以管理64M以上个内存片段(每个哈希桶的开链表按1个元素计算),结构见下图。

typedef struct

{

char key[SHMEM_INDEX_KEYSIZE]; /* string name*/

void *location; /* location in shared mem */

Size size; /* # bytes allocated for the structure */

} ShmemIndexEnt;

static PGShmemHeader *ShmemSegHdr; /* shared mem segment header */

\

共享内存及其索引"ShmemIndex"结构图

这一节就到这儿吧

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇PostgreSQL启动过程中的那些事七.. 下一篇bbed修改undo段状态(ORA-01578)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: