8_Index Concurrency
8-Index Concurrency
8.0 Concurrency control
8.1 Latch
8.1.0 LOCKS VS. LATCHES
8.1.1 Latch Modes
8.1.2 Latch implementations
Test-and-Set Spin Latch (TAS)
有效,不能支持大规模并发;对缓存不友好;对 OS 不友好
std::atomic
CPU 空转,因为 NUMA 之间的通信,会增加硬件通信流量成本
std::atomic_flag latch; |
Blocking OS Mutex:阻塞式实现;不能大规模并发;std::mutex
OS 支持,竞争线程进入内核态类似 sleep
涉及到 OS 的系统调用,可能会拖慢整个系统的速度
Reader-Writer Latches
允许并发读
依据 spin latches 实现
8.2 Hash table latching
- 对一个哈希结构加锁
- 对一个哈希槽进行加锁
Compare-and-swap (CAS)
原子操作,对变量地址中的值进行改变
8.3 B+ Tree Concurrency Control
latch crabbing/coupling
释放 Latch 时,我们希望尽可能将阻塞更多线程的 latch 释放,所以我们总是自顶向下释放 latch
Better Latching Algorithm
是乐观机制;在 split 和 merge 发生情况较少下效果更好。
先采用一路读锁到叶子节点的上一个节点,如果出现 split 或 merge,重新从头开始进行悲观锁加锁
multithread 并发冲突
T2 不知道 T1 发生了什么,确定 T1 的完成时间并等待是不现实的;实现线程间通信也是成本很高的;最佳选择是终止自己的事务并重新开始
这种竞态条件出现较为罕见;而且预防该种竞态条件成本高昂,一般方式采用双方事务都直接终止并重启
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LZY的Code生活!