PostgreSQL V9.6 LWLock实现分析(六)

LWLock锁的创建

    LWLock用于系统级共享资源的封锁操作,在系统的运行期间,系统级的资源需要加锁,实施操作后,被释放,如缓存区封锁的相关操作即如此。所以LWLock锁需要在整个数据库Server启动期间完成LWLock的准备工作,即被创建好然后再被使用(加锁或解锁)。CreateLWLocks()函数完成共享内存中预留锁的空间的工作,调用InitializeLWLocks()完成锁的初始化工作。

/*

 * Allocate shmem space for the main LWLock array and all tranches and

 * initialize it.  We also register all the LWLock tranches here.

 */

void

CreateLWLocks(void)  //在共享内存中创建所有的系统级LWLock

{...

    if (!IsUnderPostmaster)

    {

        Size spaceLocks = LWLockShmemSize(); //可以求知LWLock锁需要的空间大小,从中可以分析出有多少种系统级LWLock,详情如下

...

        ptr = (char *) ShmemAlloc(spaceLocks); //在共享内存中分配空间

...

        MainLWLockArray = (LWLockPadded *) ptr; //记录地址

...

        /* Initialize all LWLocks */

        InitializeLWLocks(); //在共享内存中分配了空间给系统级的LWLock后,对他们进行初始化

    }

    /* Register all LWLock tranches */

    RegisterLWLockTranches();  //注册即加载已经所有的系统级的LWLock(如"main""buffer_mapping""lock_manager""predicate_lock_manager"

}

    CreateLWLocks()调用LWLockShmemSize()求锁使用的空间大小。

Size

LWLockShmemSize(void)

{...

    int    numLocks = NUM_FIXED_LWLOCKS; //PostgreSQL提供的固定的LWLock个数

    numLocks += NumLWLocksByNamedTranches();//获得“a group of related lightweight locks”的个数(也是预定义好的LWLock

    /* Space for the LWLock array. */

    size = mul_size(numLocks, sizeof(LWLockPadded)); //2个参数的乘积,每个LWlock的结构体是LWLockPadded定义的,在LWLock上又封装一层

 

    /* Space for dynamic allocation counter, plus room for alignment. */

    size = add_size(size, sizeof(int) + LWLOCK_PADDED_SIZE);

 

    /* space for named tranches. */  //获得“a specific named lightweight lock”的个数(也是预定义好的LWLock

    size = add_size(size, mul_size(NamedLWLockTrancheRequests, sizeof(NamedLWLockTranche)));

 

    /* space for name of each tranche. */

    for (i = 0; i < NamedLWLockTrancheRequests; i++) //NamedLWLockTrancheRequests

        size = add_size(size, strlen(NamedLWLockTrancheRequestArray[i].tranche_name) + 1);

...

    return size;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值