| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> postgresql源码学习(七)—— 自旋锁与轻量锁 -> 正文阅读 |
|
[大数据]postgresql源码学习(七)—— 自旋锁与轻量锁 |
一、 pg中的锁pg中的锁可以分为3个层次:
二、自旋锁? ? ? ?自旋锁顾名思义就是一直原地旋转等待的锁。一个进程如果想要访问临界区,必须先获得锁资源,如果不能获得,就会一直自旋,直到获取到锁资源。 ? ? ? ?显然这种自旋会造成CPU浪费,但是通常它保护的临界区非常小,持锁进程很快就会释放资源,因此通常不会等太久,并且通常自旋比释放CPU资源带来的上下文切换消耗要小。 ? ? ? ?看了下源码介绍,自旋锁的实现太偏底层,并且有不少汇编语言,有兴趣请参考原书了。 三、 轻量锁? ? ? ? 如前所述,轻量锁负责保护共享内存中的数据结构,它正式的名字叫做Individual LWLocks。 1. 轻量锁类型? ? ? ? pg中的轻量锁类型定义在lwlocknames.h文件中(这个文件是在编译时由lwlocknames.txt生成的),在pg 14中,目前有45种轻量锁。
? ? ??可以看出,Individual LWLocks 被保存在MainLWLockArray数组中(前48个值),每种Individual LWLocks都有自己固定要保护的对象,使用方式如下(shmem.c 文件ShmemInitStruct函数):
? ? ? ?每个builtin tranches代表一组LWLocks,这组LWLocks虽然封锁各自的内容,但它们的功能相同。以下定义在lwlock.h文件中
? ? ? ?这些builtin tranches对应的一部分被保存在MainLWLockArray数组中,另一部分在使用它们的结构体中。
2. 轻量锁定义轻量锁的结构体定义如下:
? ? ? ?State变量有32位,其中低24位作为共享锁的计数器,因此一个轻量锁最多可以有2^24个共享锁持锁者。有1位作为排他锁的标记,因为同一时间最多只能有一个持锁者。 3. 轻量锁的申请假设一个新会话申请共享锁(如果持续有共享锁申请插队,排他锁申请者可能会饿死) 假设一个新会话申请排他锁 如果等待队列中第一个申请的是排他锁,则只有这一个申请者被唤醒,其他申请者继续等待。 如果等待队列中第一个申请的是共享锁,则所有共享锁申请者都被唤醒,其他排他锁申请者继续等待。 参考 《PostgreSQL技术内幕:事务处理深度探索》第2章 《PostgreSQL数据库内核分析》第7章 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:24:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |