首页 > 其他分享 >cmu15545-索引并发控制(Concurrent Indexes)

cmu15545-索引并发控制(Concurrent Indexes)

时间:2024-11-14 11:29:21浏览次数:1  
标签:Slot 结点 Latches T2 Indexes Concurrent 读锁 cmu15545 T1

目录

Overview

Lock和Latch辨析

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

本节主要探讨Latch

image-20241114092741280

设计目标

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

大致分类

  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 资源消耗高,锁持有时间长时效率低 上下文切换开销较高 写者饥饿问题

image-20241114094213574

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

image-20241114095322180

image-20241114095559863

Hash Table Latches

两种粒度:Page Latches和Slot Latches

Page Latches

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

Slot Latches

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

image image image image
  • 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+树并发的难点在于树的结构会发生分裂或合并。

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

Latch Crabbing/Couping

具体步骤:

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

例:查询

image image image image

例:删除

image image image image

例:插入

image image

Optimistic Coupling(乐观锁)

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

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

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

步骤:

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

Leaf Node Scan

叶子结点扫描顺序:

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

扫描方向冲突:

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

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

image-20241114113049848

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

image-20241114113141531

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

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

为什么水平方向不能强制一个方向扫描:影响效率,在数据规模变大时更为明显。
比如where子句是 where id > 100000,如果强制从左到右,得扫描100000条数据

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

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

标签:Slot,结点,Latches,T2,Indexes,Concurrent,读锁,cmu15545,T1
From: https://www.cnblogs.com/timothy020/p/18545665

相关文章

  • cmu15545-数据访问方式:B+树(B+Tree)
    目录基本概念基于磁盘的B+树查询与索引设计选择结点大小(NodeSize)合并阈值(MergeThredshold)变长键(Variable-lengthKeys)结点内部搜索(Intra-NodeSearch)优化手段PointerSwizzlingBε-treesBulkInsertPrefixCompressionDeduplicationSuffixTruncation基本概念基于磁盘的B+树......
  • 谈谈ConcurrentHashMap的扩容机制
    ​​ConcurrentHashMap​​​是Java中一种线程安全且高效的哈希表实现,它在Java8之后的版本中采用了与早期版本不同的扩容机制。在Java8及以后的版本中,​​ConcurrentHashMap​​利用了分段锁(Segment,直到Java8)和之后的CAS(CompareandSwap)操作以及节点的树化来实现高效的并发读......
  • cmu15545-哈希表(Hash Table)
    基本概念哈希和树一样,是数据库系统中用于访问数据的方法。空间复杂度:$O(n)$时间复杂度:$O(1)~O(n)$权衡:更大的哈希空间(碰撞减少),还是更少的哈希空间(碰撞处理)?哈希函数CRC-64(1975)MurmurHash(2008)GoogleCityHash(2011)FacebookXXHash(2012)【最常用】Goo......
  • 【Oracle】How Do Indexes Become Unusable
    遇到的场景:Oracle数据库的分区表出现UNUSABLEINDEX,下述文档用于解决相关问题。SymptomsDescriptionofwhichoperationsmarkindexpartitionsasINDEXUNUSABLE.描述那些操作使得索引不可用CauseTherearesixtypesofmaintenanceoperationsandaddingapartition......
  • 从源码解读为什么使用ConcurrentHashMap,而不使用Hashtable与HashMap
    目录1问题2答案2.1 锁机制不同:ConcurrentHashMap提升并发性能2.2迭代的安全性2.3更好的扩展性3带着答案理解源码3.1 HashMap的putVal()方法:3.2 HashTable的put()方法3.3  ConcurrentHashMap的putVal()方法4总结 1问题我们都知道Hashmap线程不安全,......
  • java ConcurrentHashMap源码分析
    目录一、一些重要属性常量sizeCtl属性Node类TreeNode类TreeBin类ForwardingNode类二、Unsafe类方法三、构造方法无参构造方法带参构造方法四、put()方法大致分析具体分析1.第一阶段spread()方法initTable()方法2.第二阶段helpTransfer()方法3.第三阶段tr......
  • C#使用线程安全队列ConcurrentQueue处理数据
    usingSystem;usingSystem.Collections.Concurrent;usingSystem.Collections.Generic;usingSystem.Globalization;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApp10{internalclassProg......
  • ConcurrentHashMap是怎么实现的?
    1.是什么    ConcurrentHashMap 是Java并发包(java.util.concurrent)中的一个线程安全的哈希表实现。与 HashMap 相比,ConcurrentHashMap 在并发环境下具有更高的性能,因为它允许多个线程并发地进行读写操作而不会导致数据不一致。以下是 ConcurrentHashMap 实现的一......
  • HashMap和ConcurrentHashMap的区别
    1.是什么    HashMap和ConcurrentHashMap都是Java集合框架中的成员,它们用于存储键值对,但它们在并发场景下的表现和行为有很大的不同。以下是它们之间的一些主要区别:1.并发安全性HashMap: HashMap不是线程安全的。如果多个线程同时访问HashMap,并且至少有一个线程在结......
  • C# Parallel ConcurrentBag
    usingSystem.Collections.Concurrent;usingSystem.Diagnostics;namespaceConsoleApp85{internalclassProgram{staticvoidMain(string[]args){try{Stopwatchwatch=newStopwatch();......