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

时间:2023-02-05 05:56:08

LWLock

   LWLock,轻量锁,主要用于*共享内存中的数据结构,以达到互斥访问的目的(避免并发造成的同一份数据被不同进程改写带来的不一致,即一段关键代码同时只允许一个进程进行改写)。

   LWLock依赖SpinLock实现,有等待队列但没有死锁检测,能自动释放锁。所以适合使用在*时间较短的情况下。

    本节从LWLock加锁的本质、LWLock实现的技术、LWLock加锁与释放锁、LWLockPostgreSQL中的作用等多个角度,来探讨LWLock涉及的内容。

预定义的LWLock

    预定义的LWLock锁有42个,具体如下:

#define ShmemIndexLock (&MainLWLockArray[1].lock)//共享内存锁

#define OidGenLock (&MainLWLockArray[2].lock)//生成Oid的值的锁

#define XidGenLock (&MainLWLockArray[3].lock)//生成Xid(事务号)的值的锁

#define ProcArrayLock(&MainLWLockArray[4].lock) //进程锁(PostgreSQL是多进程体系结构,用于进程间互斥)

#define SInvalReadLock (&MainLWLockArray[5].lock)//共享cache的读锁(SI: shared cacheinvalidation data manager)

#define SInvalWriteLock(&MainLWLockArray[6].lock) //共享cache的写锁

#define WALBufMappingLock(&MainLWLockArray[7].lock) //预先日志(WAL)缓存区锁,把数据写入缓存区

#define WALWriteLock (&MainLWLockArray[8].lock)//预先日志(WAL)写锁,把数据从缓存区刷出到持久化存储

#define ControlFileLock(&MainLWLockArray[9].lock) //控制文件锁

#define CheckpointLock(&MainLWLockArray[10].lock) //CheckPoint锁,用于创建CheckPoint

#define CLogControlLock(&MainLWLockArray[11].lock) //事务日志(CLog)锁

#define SubtransControlLock(&MainLWLockArray[12].lock) //子事务锁

#define MultiXactGenLock(&MainLWLockArray[13].lock) //多事务生成锁

#define MultiXactOffsetControlLock(&MainLWLockArray[14].lock) //多事务偏移控制锁

#define MultiXactMemberControlLock(&MainLWLockArray[15].lock) //多事务成员控制锁

#define RelCacheInitLock(&MainLWLockArray[16].lock) //RelationCache初始化锁

#define CheckpointerCommLock(&MainLWLockArray[17].lock) //CheckPoint常规锁,用于创建CheckPoint之外的CheckPoint操作

#define TwoPhaseStateLock(&MainLWLockArray[18].lock) //2阶段提交状态锁,用于分布式事务

#define TablespaceCreateLock(&MainLWLockArray[19].lock) //创建、删除表空间时以排他模式加的锁

#define BtreeVacuumLock(&MainLWLockArray[20].lock) //BTree上执行Vacuum操作清理无用元组时加的锁

#define AddinShmemInitLock(&MainLWLockArray[21].lock) //共享内存初始化锁

#define AutovacuumLock (&MainLWLockArray[22].lock)//自动执行Vacuum的进程执行操作时的锁

#define AutovacuumScheduleLock(&MainLWLockArray[23].lock) //自动执行Vacuum的进程执行do_autovacuu()函数时的锁

#define SyncScanLock(&MainLWLockArray[24].lock) //heap上进行扫描定位数据位置(BlockNumber)时的互斥锁

#define RelationMappingLock (&MainLWLockArray[25].lock)//RelationMapping( Catalog-to-filenode mapping)

#define AsyncCtlLock(&MainLWLockArray[26].lock) //异步控制锁(Asynchronousnotification: NOTIFY, LISTEN, UNLISTEN

#define AsyncQueueLock(&MainLWLockArray[27].lock) //异步队列锁

#define SerializableXactHashLock(&MainLWLockArray[28].lock) //SSI(Serializable Snapshot Isolation)相关的锁

#define SerializableFinishedListLock(&MainLWLockArray[29].lock) //SSI相关的锁

#define SerializablePredicateLockListLock(&MainLWLockArray[30].lock) //SSI相关的锁

#define OldSerXidLock(&MainLWLockArray[31].lock) //SSI相关的锁

#define SyncRepLock(&MainLWLockArray[32].lock) //复制功能,同步复制相关锁

#define BackgroundWorkerLock(&MainLWLockArray[33].lock) //PostgreSQL 9.4支持backgroundworkers后台进程动态注册、启动、停止,是并行化的基础

#define DynamicSharedMemoryControlLock(&MainLWLockArray[34].lock) //动态共享内存控制锁

#define AutoFileLock(&MainLWLockArray[35].lock) //修改"postgresql.auto.conf"文件的操作锁

#define ReplicationSlotAllocationLock(&MainLWLockArray[36].lock) //复制功能,一个slot分配互斥锁

#define ReplicationSlotControlLock (&MainLWLockArray[37].lock)//复制功能,一个slot查找互斥锁

#define CommitTsControlLock(&MainLWLockArray[38].lock) //事务提交时间控制锁,与页面有关

#define CommitTsLock(&MainLWLockArray[39].lock) //事务提交时间锁,与上一个锁分别锁事务提交过程中不同的对象

#define ReplicationOriginLock(&MainLWLockArray[40].lock) //复制功能,复制相关锁

#define MultiXactTruncationLock(&MainLWLockArray[41].lock) //多事务Truncate

#define OldSnapshotTimeMapLock(&MainLWLockArray[42].lock) //老快照时间映射锁

 

    PostgreSQL的文档中,在“wait_event Description”一节提供如下表格,对各种锁作了一个描述如表X-XX,可以和预定义的42LWLock锁对应着互相理解。