Overview

Lock和Latch辨析

  • Lock:抽象的,逻辑的,整体统筹
  • Latch:具体的,原语性的,自我管理

本节主要探讨Latch

设计目标

  • 内存占用少,无竞态时执行迅速
  • 等待时间过长时取消调度

大致分类

  1. 自旋锁(Test-and-Set Spin Latch)
  2. 阻塞互斥锁(Blocking OS Mutex)
  3. 读写锁(Reader-Writer Latches)
特性 Test-and-Set Spinlock Blocking OS Mutex Reader-Writer Locks
实现 基于原子操作的自旋等待 操作系统级阻塞 允许多读单写
锁争用时的处理 自旋等待,消耗 CPU 阻塞等待,减少 CPU 消耗 读操作可以并发,写操作排他
适用场景 短期锁、轻度锁争用 长期锁、重度锁争用 读多写少
优点 无上下文切换,性能高 避免自旋消耗,适合长时间等待 读写并发,适合读多写少
缺点 CPU 资源消耗高,锁持有时间长时效率低 上下文切换开销较高 写者饥饿问题

C++中的mutex -> pthread -> Linux futex(fast user mutex):先在用户空间用自旋锁,如果获取不到锁,陷入内核态调用阻塞锁进入阻塞队列。

Hash Table Latches

两种粒度:Page Latches和Slot Latches

Page Latches



  • T1给page1上读锁,T2等待(如左上图)
  • T1查看page2无读锁,给page2上读锁,释放page1读锁;T2访问page1,上写锁(如右上图)
  • T2访问page2,但由于有T1读锁,等待(如左下图)
  • T1释放page2读锁,T2结束等待,给page2上写锁,写入E|val(如右下图)

Slot Latches

整体过程和Page Latches类似,只不过粒度变了。



  • T1给Slot A上读锁,T2给Slot C上写锁
  • T1访问Slot C,但是由于有T2的写锁,释放Slot A写锁,在C等待(如左上图)
  • T2访问Slot D,释放Slot C写锁,给Slot D上写锁;T1可以访问Slot C,上读锁(如右上图)
  • 重复上述两个步骤(左下图和右下图)

B+Tree Latches

并发问题

相比于哈希表,B+树并发的难点在于树的结构会发生分裂或合并。



  • T1找到了需要删除的值44(如左上图)
  • 删除了值44,此时需要偷(steal)左兄弟的值41进行合并,保证叶子结点半满,但是T1被调度,进入休眠(如右上图)
  • T2找到了需要删除的值41,准备读取值41,但是此时T2被调度,进入休眠(如左下图)
  • T1唤醒,进行结点合并,41移动到了新的位置
  • T2被唤醒,读取41,但是数据已经被移动(如右下图)

Latch Crabbing/Couping

具体步骤:

  • 得到父结点的锁
  • 得到子结点的锁
  • 如果子结点是安全的,释放之前的锁,否则不释放
  • 安全的定义:
    • 对于查询:不做要求
    • 对于插入:不满
    • 对于删除:多于半满

例:查询



例:删除



例:插入


Optimistic Coupling(乐观锁)

观察:在插入和删除操作中,都会给根结点上写锁,造成系统在根结点处是串行的,有性能瓶颈。

实际上一个页存储一个结点,页大小很大,大多数时候不需要结点分裂,删除时结点也可以延迟合并,说明B+树结构大多数时候不会变化,上写锁的代价太大。

基本思想:上读锁,发现冲突后重新上写锁。

步骤:

  • 查询:不变
  • 插入/删除:
    • 和查询一样,在路径上加读锁,到达叶子结点后加写锁
    • 如果叶子结点不安全,重做;否则直接执行相关操作


Leaf Node Scan

叶子结点扫描顺序:

  • 垂直方向:自顶向底
  • 水平方向:没有限制

扫描方向冲突:

  1. 水平扫描方向不一致导致冲突
  2. 水平扫描和垂直扫描冲突

水平扫描方向不一致:读锁没有冲突,互换读锁即可。

水平扫描方向不一致:带写锁时会有冲突,选择自我终结。

为什么选择自我终结:根本原因是latch是低级原语,不涉及全局信息,唯一知道的只有自己的信息,所以选择自我终结。

  • 涉及到读写磁盘,等待时间不定
  • 不知道其他进程进行到什么程度,也不知道其他进程是什么状况

为什么水平方向不能强制一个方向扫描:影响效率,在数据规模变大时更为明显。

比如where子句是 where id > 100000,如果强制从左到右,得扫描100000条数据

水平扫描和垂直扫描方向不一致:

垂直到达叶子结点的操作,在遇到水平进行的操作时,同样会遇到上述问题,处理方式也相同。

cmu15545-索引并发控制(Concurrent Indexes)的更多相关文章

  1. mysql慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用

    mysql的“慢查询”指的是超过了允许的最大查询时间(long_query_time)的sql语句,而“未使用索引”查询顾名思义就是查询语句没有使用到索引的sql语句. 慢查询配置和使用 在msyql ...

  2. (译)MySQL 8.0实验室---MySQL中的倒序索引(Descending Indexes)

    译者注:MySQL 8.0之前,不管是否指定索引建的排序方式,都会忽略创建索引时候指定的排序方式(语法上不会报错),最终都会创建为ASC方式的索引,在执行查询的时候,只存在forwarded(正向)方 ...

  3. 浅谈MSSQL2012中的列存储索引(columnstore indexes)

    列存储索引为MSSQL2012版本中引进的一个新特性.所有版本MSSQL中标准查询处理模式采用一次一行模型,操作符每次处理一行数据.列存储索引中增加了一种新的基于向量的查询执行功能,通过这种功能,操作 ...

  4. ORACLE如何检查找出损坏索引(Corrupt Indexes)

      在Oracle数据库中如何找出损坏索引呢? 下面我们人为构造一个案例,将索引块损坏.如下案例所示: SQL> create tablespace test_data   2  datafil ...

  5. Mysql数据库的数据类型、索引、锁、事务和视图

    Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...

  6. MySQL引擎、索引和优化(li)

    一.存储引擎 存储引擎,MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术 ...

  7. MS SQL巡检系列——检查重复索引

    前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...

  8. 如何监控ORACLE索引使用与否

    在数据库管理与维护中,我们总会遇到一个问题:我们创建的索引是否会被某些SQL语句使用呢?换个通俗表达方式:我创建的索引是否是未使用的索引(unused Indexes),是否有价值呢?如果创建的某个索 ...

  9. [翻译] 聚集索引表 VS 堆表

    前言: 本文对这篇博客Clustered Tables vs Heap Tables 的翻译, 如有翻译不对或不好的地方,敬请指出,大家一起学习进步. 问题描述 创建一个新表时,一个非常重要的设计原则 ...

  10. MongoDB的学习--索引类型和属性

    索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field Indexes) 在一个键上创建的索引就是单键索引, ...

随机推荐

  1. JuiceFS 在多云架构中加速大模型推理

    在大模型的开发与应用中,数据预处理.模型开发.训练和推理构成四个关键环节.本文将重点探讨推理环节.在之前的博客中,社区用户 BentoML 和贝壳的案例提到了使用 JuiceFS 社区版来提高模型加载 ...

  2. PCIe简介

    PCIe简介 Peripheral Component Interconnect Express (PCI),高速串行计算机扩展总线标准,PCIe对外围设备的组织方式是树形结构. 拓扑结构 根: 树的 ...

  3. 【Python】Selenium自动化测试之动态识别验证码图片方法(附静态图片文字获取)

    目录 一.前提 二.获取验证码 三.获取4位验证码 四.判断验证码是否正确 五.输入验证码登录 六.登录页面类 七.完整的获取验证码类代码 八.附录:静态图片文字提取 一.前提 返回目录 经常会遇到登 ...

  4. YuebonCore:基于.NET8开源、免费的权限管理及快速开发框架

    前言 今天大姚给大家分享一款基于.NET8开源.免费(MIT License)功能强大的权限管理及快速开发框架,支持前后端分离,项目架构易于扩展,是中小企业的首选:YuebonNetCore. 核心设 ...

  5. 第二章:智能Agent

    第二章:智能Agent 本章讨论Agent的本质,Agent是否完美,环境的多样性,及由此带来的各种Agent分类. 1. Agnet和环境 Agent通过传感器感知环境并通过执行器对所处环境产生影响 ...

  6. 配置linux的远程登录操控 ssh 配置密钥

    1. 安装ssh服务 yum install openssh-server 启动服务 service ssh start ssh 的配置文件位置 ect/ssh/sshd_config 001. 把P ...

  7. vant2 List 组件 下拉加载 onLoad

    ps:loading finished onLoad 两个变量一个函数 : async onLoad() { console.log("onload"); // 异步更新数据 // ...

  8. 使用AndroidStudio开发cocos2d-x,以及可能会出现的问题

    1. 使用AndroidStudio开发cocos2d-x流程 1.1 通过cocos2d-x官网(https://www.cocos.com/)下载cocos2d-x文件 1.2 安装python环 ...

  9. HiT-SR:基于层级Transformer的超分辨率,计算高效且能提取长距离关系 | ECCV'24

    Transformer在计算机视觉任务中表现出了令人鼓舞的性能,包括图像超分辨率(SR).然而,流行的基于Transformer的SR方法通常采用具有二次计算复杂度的窗口自注意力机制,导致固定的小窗口 ...

  10. CSP模拟 小 trick 总结 (持续施工中)

    虽然这篇博客来的有点晚,但还是写了,欢迎dalao补充( (很杂,建议先浏览目录) 1.分块.莫队有关: \(\color{brown}(1)一个真正的回滚莫队(感谢\ Qyun\ 的讲解):\) $ ...