【CMU15-445 Part-9】Multi-Threaded Index Concurrency Control

news2024/11/25 0:49:49

Part09-Multi-Threaded Index Concurrency Control

多线程下索引的并发控制

Concurrency Control

强制所有访问数据结构的线程都使用某种协议或者某种方式。并发控制协议的概念:并发控制协议是一种当并发操作作用在一个共享对象上时DBMS用来确保correct的method。关心的正确性:逻辑正确性和物理正确性

逻辑正确性:如果我正在访问该数据结构我希望看到的数据是我想看到的。

物理正确性:如何保护数据结构的内部表示。

segmentation falut 存储器区块错误,内存越界一般是。

| — | — | — |

Latch Modes

Read Mode

  • 允许多条线程在同一时间去读取同一个对象
  • 即使其他线程有read mode latch,new thread也可以获得read latch

Write Mode

  • exclusive latch,一次只有一个线程可以持有这个latch
  • 写写冲突、写读冲突

Latch Implementations

  1. Blocking OS Mutex

    1. std::mutex
    2. 具体在操作系统咋实现?Futex:fast userspace mutex,在用户空间中占据一点 1 bit 位置,来进行Compate And Swap操作,以获取这个latch,如果取到了就用,如果没取到就用OS层面mutex,速度相对慢。futex is spin latch
    std::mutex m;
    m.lock();
    // do something
    m.unlock();
    
  2. Test-and-Set Spin Latch(TAS)

    1. 即使用一个spin latch 或者 TAS Spin Latch,非常高效,super fast,因为可以通过modern CPUS的单条指令来完成TAS动作,

    2. api: std::atomic 简化:atomic_flag = atomic

      std::atomic_flag latch;
      // ...
      while(latch.test_and_set(...)){
      	// come in when you don't get latch
      	// retry? yiled? abort?
      }
      
  3. Reader-Writer Latch

    1. 涉及读写互斥以及读优先or写优先

      Untitled

Hash Table Latching

  1. 所有的线程move同一个方向,一次只获取一个page 或者 slot。
  2. 不会发生死锁
  3. resize table的时候,会对header page加一个全局latch on the entire table,以保证在resize调整结束之前,组织别人对该table进行读写操作。

latch 粒度:

  • Approach #1: Page Latches
    • 在每一个page上面使用一个reader writerlatch 来保护整个内容
    • 当线程访问page的时候,需要事先获得一个read or write latch
  • Approach #2: Slot Latches
    • 每个slot有一个自己的latch
    • 可以使用一个single mode latch来减少meta-data and 计算代价

B+ Tree Latching

可能会遇到的问题:

  1. 多个线程同时修改一个节点的内容
  2. 一个线程正在遍历,而另外一个则导致了树结构的变化。

解决方案:latch crabbing/ coupling

允许多线程访问修改B+ Tree。

基本思想:

  • 当我们使用一个节点的时候,就需要加一个latch,不管是write/read latch
  • 想要访问子节点,要拿子节点的latch(下一个访问的latch)
  • 如果移动到子节点是安全的,将父节点latch释放就是OK的
  • Safe Node:进行一次修改的话,我们所在的节点无需拆分或者合并
    • 该节点not full(可以插入)
    • more than half-full(可以删除)

Find:

  • 获得 Read Latch on child
  • unlatch parent

Delete:

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230906165118893.png

再到D的话,删除38,则D是安全状态,然后可以释放AB的latch

线程向下进行遍历的时候,会用stack来保存一路上所持有的latch。

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230906165328766.png

Insert:

对于插入来说 B是安全的,可以释放A的latch

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230906171214275.png

在D的时候不可以释放B,到最后插入的时候可以释放B and D。先B再D,提高效率

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230906171435540.png

what’s the first step that all the update examples did on the B+ Tree?在Root上使用独占模式的latch或者写模式的latch进行加锁。 独占性(exclusive)

大多数的线程不需要对叶子节点进行拆分或者合并操作,所以拿read latch 而不是 write latch,在叶子节点使用write latch,判断需不需要拆分,不需要则拿read latch。如果在拆分或者merge的时候出错,abort在根节点重启,向下遍历这次获取write latch。

到达节点过程只拿read latch,执行删除的时候才去获取当前节点的write latch。

read latch会阻止任何人对这些节点进行写入和拆分操作

write latch则是阻止除了我之外的人对这些节点进行修改

通常情况下 在Page上使用悲观锁 效果比较好

Leaf Node Scans

这些线程都是从上到下(Top-down)遍历,所以不会产生死锁。

如果是一条线程从上到下扫描,另外一条做叶子结点扫描。

和之前的crabbing一样,获得了下一个latch才释放之前拥有的。

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230907210135450.png

find 这种 read latch 不会deadlock

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230907210318959.png

再来看T1 : delete 4 T2: find keys > 1

使用的是乐观锁机制latch coupling/crabbing 所以T1 T2都能拿到A的read latch。

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230907210641405.png

当子节点读锁和写锁冲突的时候,T2最好不要等待T1结束,因为不知道T1要多久也不知道会不会增加形成死锁的可能,所以最好的解决方案是abort and restart. /! 可能会遇到starvation的问题。

Delayed Parent Updates

处理overflow情况下可以使用的一种额外优化手段(BlinkTree 才加了兄弟指针,现在B+ tree基本都加兄弟指针了)

当任意时刻 某个叶子节点出现overflow情况,延迟对父节点的更新操作。只需要更新树中全局信息表中的一点内容,当有人遍历这棵树,再去更新父节点。

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230907213745920.png

添加一个该树的全局表,有人用的时候再去执行这个ADD 31调整结构。拆分玩并且添加完新节点之后,紧接着要进行下次修改的线程会接受这个改变并且对内容进行更新。

https://vvtorres.oss-cn-beijing.aliyuncs.com/image-20230907213826438.png

notoriously 出名的

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

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

相关文章

【杂记】git管理工具的相关应用

这里记录一些用git管理工具进行开发的命令,便于自己查看,我认为下面两篇博客写的很详细,但是为了自己方便查看,所以自己写了一些命令供自己进一步理解。gitee相对git来说更方便一些(毕竟国内的不用担心墙)&…

JavaEE 网络原理——TCP的工作机制(初篇 包含 UDP 协议的再次阐述)

文章目录 一、再次简述 UDP 协议二、再次简述 TCP 协议三、描述部分 TCP 内部的工作机制1. 确认应答2. 超时重传 前提: 在前面的文章中,我向大家分别简单介绍了 TCP 协议和 UDP 包装一个数据形成数据报发送信息。 除此之外,还通过代码编写了 …

QT中摄像头的使用

QT中摄像头相关类 摄像头的使用 QT中摄像头的使用主要分为三个方面,显示画面、抓取图片和视频录制。这三个方面对应着摄像模块的三种模式。模式如下: ConstantValueDescriptionQCamera::CaptureViewfinder0相机仅配置为显示取景器。QCamera::CaptureSt…

React入门

一、react开始 1、react是什么 用于构建用户界面的JavaScript库 操作DOM呈现页面 (发送请求获取数据和处理数据不由react处理)fessbook开发 2、为什么要学 原生js操作DOM繁琐、效率低 使用原生js直接操作DOM,浏览器会进行大量重绘重排 原…

计算机视觉面试题整理

1、介绍目标检测网络yolo系列以及ssd系列的原理,yolo对小目标检测不好的原因,除了缩小anchor外还可以如何改善? Yolo目标检测:YOLO是一种实时目标检测算法,其核心思想是将目标检测问题归为一个回归问题,直…

Android毕业设计,基于Android 语音朗读书籍管理系统

视频演示: 基于Android 语音朗读书籍管理系统 基于 Android 的语音朗读书籍管理系统可以提供用户管理书籍、朗读书籍的功能。以下是一个简单的步骤和功能列表: 用户注册和登录功能: 用户可以注册新账号或使用现有账号登录系统。用户信息可以包…

【rust/egui】(十一)使用rfd选择文件并使用serde_json进行序列化

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 rfd-Rusty File Dialogs 一个跨平台的…

只需3步部署Django项目到Kubernetes上

1. 目标 本文讲述了如何通过3步,把Django项目部署在K8S上。 本文适用读者: 了解Django项目的开发。了解K8S的用途。 2. 具体步骤 把一个Django项目部署在Kubernete环境上,只需以下3步: 创建镜像部署在Kubernetes环境上配置MyS…

linux命令查看谁在使用服务器的GPU

命令:查看GPU使用情况 nvidia-smi 可以知悉GPU占用情况和主要使用GPU的进程,如下图所示: 实时查看gpu使用: nvidia-smi -l 1 表示每隔1s刷新一下,数字可更改。 查看进程的归属者 方法一:ps -f -p pid…

360极速浏览器X终极奥义之——更改划词工具条的搜索为百度搜索 2023更新版

原文为2019版本,具体已失效,2023更新。 1.需要将 https://www.so.com/s?q%s&src360csex_zoned字符串对应的十六进制码替换为 https://www.baidu.com/s?wd%s&src360csex_z对应的十六进制码。 2.需要删除后面的"oned"以保证转换出来…

冒泡排序~

1、对应长度len 数组,需要进行 len -1 趟冒泡,每趟冒泡,将最大(小)元素排列到最后无序位置 2、每趟冒泡从第一个元素开始,邻近两两比较,找出最大元素 每一趟冒泡,都进行元素交换&am…

基于频谱信息的图像去噪与恢复——使用约束最小二乘方滤波法

大家好,我是带我去滑雪! 随着科学技术的不断发展,信息的交流和获取已不再受到时空的限制,已经成为人们日常生活中不可或缺的一部分。图像作为人类信息交流中的重要载体,起着不可替代的作用。频谱图像去噪复原方法是一种…

Hive【Hive(一)DDL】

前置准备 需要启动 Hadoop 集群,因为我们 Hive 是在 Hadoop 集群之上运行的。 从DataGrip 或者其他外部终端连接 Hive 需要先打开 Hive 的 metastore 进程和 hiveserver2 进程。 Hive DDL 数据定义语言 1、数据库(database) 创建数据库 c…

YOLOv8『小目标』检测指南

前言 目前博主课题组在进行物体部件的异常检测项目,项目中需要先使用 YOLOv8 进行目标检测,然后进行图像切割,最后采用 WinCLIP 模型 进行部件异常检测 但是在实际操作过程中出现问题, YOLOv8 模型目标检测在大目标精确度不错&a…

Vue的详细教程--入门

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Vue是什么 二. Vue的特点及优势 三.使用…

IT运维:利用数据分析平台采集Windows event log数据

概述 本文将介绍如何借助Winlogbeat和Vector在鸿鹄里采集Windows event log数据,使技术人员能够在鸿鹄里更便捷和高效地分析Windows event log数据。 操作步骤 Winlogbeat是一个开源的日志数据采集器,专门用于采集Windows操作系统中的event log数据。它可…

【JAVA数据结构】包装类与认识泛型

作者主页:paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精…

解决 Cannot read property ‘key‘ of undefined

目录 问题解决1解决2最终 问题 现场环境分页查询某些条件项查询时,分页接口获取成功但是数据不渲染,页面像是卡住了: 报错 Cannot read property key of undefined 解决1 有人说 使用的el-pagination在格式化代码的时候layout属性的参数会多加…

vue基础知识十一:Vue组件之间的通信方式都有哪些?

一、组件间通信的概念 开始之前,我们把组件间通信这个词进行拆分 组件通信 都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,…

Gin 框架 解决 跨域问题

Gin 框架解决跨域问题 一点废话 在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的,然后又刚好会一点点 go,就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json 。 这是我的go代码…