PostgreSQL spin 与 lwlock

在PostgreSQL 中,内存锁大致可以分为spin lock, lwlock以及Lock。

1.spin lock

    就是自旋锁,实现的成本最低,一般使用TAS(test and set)来实现,而TAS操作,通常由硬件来实现内存操作。没有队列的概念。

因此速度是最快的。通常只有exlusive一种模式,要么得到,要么不断spin-》sleep-》spin。详细内容见可我另外一篇文章“TAS 指令与PostgreSQL spin lock“。

PG中,s_lock.h中定义的tas指令操作:

image

从上面的asm 嵌入指令中,可以看出汇编指令的操作也就是简单的比较与置位。实现简单快速。


2.lwlock

    也就是PG中所讲的轻量级锁(Light-weight lock)。这个锁一般由spin lock来保护。lwlock比spin lock多一种共享模式。

源码中定义:

image

其中 slock_t 类型的mutex就是用来保护LWLOCK的,另外多了shared模式。因此,从实现上比spin重了点。但是跟lock比,还是比较轻量级的,这也是为什么有了Light-Weight Lock的名称的原因。

PG中默认预先定义了许多LWLOCK,通常是跟共享内存的操作相关的。比较著名的如:

BufFreelistLock:用来保护buffer pool的freelist

WALInsertLock,WALWriteLock:用来保护WAL
      ControlFileLock:保护控制文件的写
      CheckpointLock:保护检查点


3.lock

是PG中重量级锁,是low-level锁,与表和事务相关。为application级别锁。这就是通常我们讲的表锁,行锁等。定义如下:

NoLock                        0        /* NoLock is not a lock mode, but a flag value meaning "don't get a lock"  */
AccessShareLock                 1        /* SELECT */
RowShareLock                    2        /* SELECT FOR UPDATE/FOR SHARE */
RowExclusiveLock               3        /* INSERT, UPDATE, DELETE */
ShareUpdateExclusiveLock    4        /* VACUUM (non-FULL),ANALYZE, CREATE * INDEX CONCURRENTLY */
ShareLock                          5        /* CREATE INDEX (WITHOUT CONCURRENTLY) */
ShareRowExclusiveLock        6        /* like EXCLUSIVE MODE, but allows ROW * SHARE */
ExclusiveLock                     7        /* blocks ROW SHARE/SELECT...FOR * UPDATE */
AccessExclusiveLock            8        /* ALTER TABLE, DROP TABLE, VACUUM * FULL, and unqualified LOCK TABLE */

lock的获取与释放,都有队列来维护。源码定义如下:

image


LOCKTAG,与PG中的数据库,relation等强相关。与数据库中表存在一一映射关系。 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30088583/viewspace-1587930/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30088583/viewspace-1587930/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值