【GP学习笔记三】锁与死锁

news2024/11/19 20:46:51

一、概述

在GP中,定义了三种锁

  • 自旋锁(Spinlocks)
  • 轻量级锁(LWLocks)
  • 普通锁(Regular locks,也叫重量级锁)

自旋锁

与互斥锁有点类似。针对某一项资源,在任何时刻,最多只能有一个保持者。对于互斥锁,如果资源已经被占用,资源申请者进入睡眠状态。但自旋锁会一直循环查看当前保持者是否已经释放锁,这个循环查看的状态就被形象地称之为自旋。

自旋锁一般是短期持有的,等待竞争的锁不需要做内核态和用户态之间的切换,他们只需要等一等,等到持有自旋锁的保持者释放即可获取。所以长时间上锁是非常耗费性能的,它阻止了其他进程或线程的运行和调度。所以会有一个自旋时间,时间一到立即释放自旋锁。自旋锁没有死锁检测和出错释放,一般由内核调用。

轻量级锁

为共享内存中需要并发访问的结构体提供锁保护。 轻量级锁通过做一个标记来记录此时是否有人在使用该资源。在没有锁竞争的情况下,获取和释放一个轻量级锁都是很快的。当一个进程必须等待一个轻量级锁时,会阻塞在一个SysV信号量上,因此等待过程并不消耗CPU时间。等待进程按照申请锁的先后顺序获得授权,没有超时机制,也没有死锁检测机制。

普通锁

也叫做重量级锁,用于对数据库对象,比如表、数据记录等加锁。普通锁支持多种不同的加锁模式,同时也支持死锁检测以及在事务结束时自动释放。

我们平时接触到的都是普通锁,简单总结下:自旋锁等待时间短,消耗CPU;轻量级锁通过信号量控制,不消耗CPU,是一种乐观锁,在竞争时会升级为重量级锁;普通锁可以长期持有,是一种悲观锁。

二、普通锁的数据结构

1.锁方法

在Greenplum数据库中,有三种锁方法:DEFAULT、USER和RESOURCE。

  1. DEFAULT锁方法是系统默认的加锁方法,用于对常见数据对象加锁
  2. USER锁方法主要用于意向锁(Advisory Locks)
  3. RESOURCE锁方法用于对资源队列的访问加锁

锁方法由结构体LockMethodData来表示。 其中有个叫锁模式冲突表的属性值得注意。锁模式冲突表定义了各个锁模式之间的冲突关系。理论上,各个锁方法可以定义自己的锁模式以及锁模式冲突表,但目前这三种锁方法使用相同的锁模式和锁模式冲突表。

锁模式:

img

锁模式冲突表:

img

2.锁结构体

内存中,普通锁由机构体LOCK表示,记录了一个可加锁对象的锁信息。

img

除了LOCK结构体外,还会使用另一个结构体PROCLOCK 。多个进程可能会同时持有或是等待同一个可加锁对象,对于每一个锁持有者或是等待者,我们会将其信息保存在一个结构体PROCLOCK中。

img

死锁

一、单节点死锁(本地死锁)

常规的本地死锁非常容易理解,两个并发的会话1和2,对应着两个后端进程。进程1持有锁A,进程2持有锁B。接着进程1要获取锁B,而进程2要获取锁A。由于锁通常在事务结束才释放,两个进程互相竞争于是发生本地死锁。

二、PostgreSQL死锁检测器解决单节点死锁

Postgres 有一个死锁检测器,负责检测死锁并在发生死锁时打破死锁。检测器使用等待图(wait-for graph)为进程之间的等待关系建模,图节点由进程标识符pid标识,图的一条边表示一个锁的等待关系。

工作过程:

  • 进程获取锁失败,进入睡眠模式等待
  • 如果等待超时(GP中该计时器是一秒),运行死锁检测算法
  • SIGALARM 处理程序构建等待图,以当前进程为起点,检查等待图是否存在环,环意味着发生死锁。当前进程主动退出打破死锁

三、分布式集群中的死锁(全局死锁)

全局死锁也容易理解,两个分布式事务1和2,分别运行在A,B两个节点上。接下来,1要去B节点上运行,但B节点正被2阻塞,因此事务1被挂起,等待2的执行完成;不巧事务2也要申请A节点的资源,由于A节点正在执行事务1,事务2也被挂起,等待1的执行完成。这时候发生死锁。与本地死锁不同的是,节点A和节点B上都没有死锁,但在整个集群看来,死锁真实发生了。

全局死锁检测器仍然使用等待图为锁等待关系建模,但是是基于整个集群。将每个节点上的本地等待图合并起来生成全局图。图中的节点不再是进程ID,而是一个进程组,代表一个分布式事务。

GP的WFG图还存在另外一种边,如果进程1和2同时在一个锁的等待队列里,并且1在2的后面,那么2总是先被唤醒,此时就存在1等待2的情况,这种等待边为soft edge。由soft edge构成的环是假死锁,可以尝试调整等待队列里的顺序,使得环不存在,那么就不需要撤销事务来破锁了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Dubbo源码剖析与实战》学习笔记 Day6

问题引出,从dubbo2升级到了dubbo3版本,出现了一些消费方调用超时的现象,通过日志发现异常信息中的timeout竟然是1000ms,明明在暴漏接口的时候指定了超时时间,为什么没有生效。 经过debug分析调试后,找到了…

基础2-用卷积神经网络进行颅内和头皮脑电图数据分析的广义癫痫预测

A Generalised Seizure Prediction with Convolutional Neural Networks for Intracranial and Scalp Electroencephalogram Data Analysis 为了改善耐药癫痫和强直性癫痫患者的生活,癫痫预测作为最具挑战性的预测数据分析工作之一已引起越来越多的关注。许多杰出的…

excel图表整形:如何提升条形图的颜值

提交给老板的报告总少不了要用到图表,比如下面这个业务员销售增长率的报表,老板要求用条形图来呈现出每个人的增长率:直接用Excel自带的图表模板做出来是这样的效果:这个图看起来总有点别扭,如果能做成下面这个样子就好…

《HTML简单入门》

目录 前言 HTML基本知识 简单示例 HTML标签 单标签 HTML元素 HTML属性 HTML入门知识 HTML头部 title style meta link script noscript base HTML标题 h HTML段落 p HTML文本格式化 加粗 加重 倾斜 强调 下划线 删除线 小号字体 下标 上标 水…

Android组件——Service

一、多任务实现的基本原理 默认情况下,同一个应用程序的所有组件都运行在同一个进程中,大部分应用程序是按这种方式运行的在具体应用中需要通过设置mainifest文件中组件的android:process属性,是该组件运行在不同的进程中元素也支持android:…

strapi系列-如何创建一个定时任务-Cron Jobs

Cron 是什么? Cron 有多种用途。 Cron Jobs 用于安排服务器上的任务运行。它们最常用于自动化系统管理或维护。然而,它们也与 Web 应用程序的构建相关。 Web 应用程序可能需要在各种情况下定期执行特定操作。 为什么使用 Cron ? 定期进行的计划活动,C…

【SpringMVC】异常处理

目录 一、基本介绍 二、局部异常 三、全局异常 四、自定义异常 五、统一处理异常 六、异常处理流程 相关文章(可以关注我的SpringMVC专栏) SpingMVC专栏SpingMVC专栏一、基本介绍如果我们对异常不做任何处理的话,那么他就会返回500错误&…

list底层实现

目录 引言 结构形式 整体框架 插入删除接口实现 析构函数、拷贝构造、赋值重载 const迭代器实现 取得链表长度的方式 迭代器前置\后置operator -- 以及operator-> 引言 list是非常常用的一个容器,数据结构是链表,数据空间是以链式结构存储的…

QT中控件不满足要求那么为你的控件做“提升”吧

我们在VisualStudio中例如VC或者C#中写一些个性化比较强的项目都会对控件有更高的要求,那么当我们的要求得不到满足时就需要考虑用到自定义控件了,其中自定义控件有两种方式,一种是完全重写,另一种简单的方法是继承自现有的控件。…

指针深度解剖,从内存详细了解指针

目录 🚕第一组:一维数组 🚌第二组:字符数组 🚐字符数组1.0 🚎字符数组1.1 🚑字符数组2 🚚字符数组3 🚜第三组:二维数组 🚗在上次的博客之中我们…

INVS里的DanglingWire的自动化清理实战

在上一讲中一起了解了INVS里的DanglingWire(innovus中的DanglingWire(悬垂线)的理解和处理),常言道理论联系实际,在理解原理的基础上,那一定是要服务项目的,这篇后续火速跟进&#x…

中国第一个 Apache 顶级开源项目的突围之路!

【CSDN 编者按】近些年开源大热,开源创业之风随之四起。作为近两年特别火的商业方向,开源创业者如何才能在一片红海中乘风破浪,在行业中占据一席之地?第一个由中国人主导贡献到 ASF 的顶级开源项目 Apache Kylin 做出了有效探索&a…

字节序,主机字节序与网络字节序

📌————本章重点————📌 🔗了解字节序的概念; 🔗了解大小端的概念;🔗了解主机字节序和网络字节序的区别;🔗学习主机字节序和网络字节序相机转化的接口; ✨————————————✨字节序 概念&am…

人工智能助力古彝文识别,推动传统文化传承

人工智能助力古彝文识别,推动传统文化传承0. 前言1. 古彝文1.1 古彝文介绍1.2 古彝文识别的重要意义1.3 古彝文识别的挑战2. 古彝文识别国内外研究进展3. 基于深度学习的古彝文识别3.1 深度学习简介3.2 基于深度学习的古彝文识别模型架构4. 古彝文识别进展与展望小结…

HTML小游戏19 —— html5版开心斗地主小游戏(附完整源码)

💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】本节教程我会带大家使用 HTML…

【练习】Day05

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 跳跃游戏[贪心算法]2. 寻找重复数[注意思路!]答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 HASH 函数冲突处理方式不包括以下哪一项:(&…

YOLOv5源码详解——项目目录

YOLOv5 目录 .github .github相关,不重要 datasets 存放数据集,刚下载下来的源码是不包含这个文件夹的 classify 图像分类模块,包含以下4个文件 predict.py —— 图像分类预测脚本train.py ——图像分类训练脚本val.py —— 图像分类验证脚本tutorial.…

Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发

一、标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBatisPlus入门案例与简介中使用的环境 二、新增 在进行新增之前,我们可以分析下新增的方法…

马蹄集 公式计算

公式计算 难度&#xff1a;青铜 01 时间限制&#xff1a;1秒巴占用内存&#xff1a;64M 计算公式 (1/2)*(a*xc(ac)/(4*a)》 格式 输入格式&#xff1a;输入为整型x,a,空格分隔 #include <bits/stdc.h> using namespace std; int main() {int x, a;cin >> x >&g…

1、JDK17安装

目录 一、简介 二、安装步骤 三、在Windows 10系统中配置环境变量 四、运行jdk 一、简介 JDK全称Java SE Development kit(JDK)&#xff0c;即java标准版开发包&#xff0c;是Oracle提供的一套用于开发java应用程序的开发包&#xff0c;它提供编译&#xff0c;运行java程…