ITPub博客

首页 > 数据库 > MySQL > PostgreSQL spin 与 lwlock

PostgreSQL spin 与 lwlock

原创 MySQL 作者:jesselyu 时间:2015-04-20 21:12:42 0 删除 编辑

在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博客 ” ,链接:https://blog.itpub.net/30088583/viewspace-1587930/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
资深Oracle RAC及Exadata部署实施运维专家,曾从事PostgreSQL内核开发与性能优化。丰富的大规模数据库管理架构设计经验。目前在阿里巴巴从事数据库架构工作以及新技术引进,对分布式存储,云计算及并行编程有一定研究。技术讨论请加微信:ljs521688

注册时间:2015-01-01

  • 博文量
    43
  • 访问量
    575123