没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
在⼤多数DBMS的实际使⽤场景中,会有多个线程在向哈希索引或B+树索引⾥插⼊数据或修
改其中的数据,或者是读数据(也有少部分DBMS是只允许单线程的,⽐如说旧版本的
Redis,诸多⽤户的增删改查只能串⾏执⾏),因此需要⼀套策略能够使得对索引的各种操
作是thread-safe的
本Lecture所介绍的主要是并发控制协议中的Physical Correctness的实现策略,也就是让多
线程共享的对象在被并发访问时,其内部的数据结构能够保持稳定
Logical Correctness会在后⾯介绍事务并发时提到
Latches Overview
再次回顾⼀下之前提到过的Latch/Mutex与Lock在概念上的区别,Lock经常指代逻辑上的宏
观的锁,⽤于保护数据库⾥⾯⼀些逻辑内容不被其他的线程/事务所修改,⽐如说锁上表⾥
的某⼀⾏数据,让别的事务不去改它,这就叫Lock,Lock⼀般是被事务所持有的,⽽且
Lock还有⼀个特性,它在需要回滚的时候可以回滚,⽐如说我们先锁上某⼀⾏数据,然后
修改了它,之后如果想回到修改前的状态就可以回滚
Latch⼀般⽤来保护DBMS内部的具体数据结构,⽐如说想锁数据库⾥的某⼀⾏数据,DBMS
可能会给对应的tuple所在的B+树的节点上⼀个Latch,Latch被具体的操作过程所持有,⽐
如说往B+树中插⼊⼀个数据,这个操作过程中间可能会持有很多的Latch,最后还会⼀步步
地把这些Latch释放掉,Latch往往不是整个事务过程当中所持有的,可能是在⼀个操作,⽐
如某次的插⼊操作中持有的,插⼊完成后便不再持有,Latch也不需要考虑事务回滚的问题
本Lecture主要探讨Latch相关的话题
Latch有读模式与写模式这两种模式,在读模式下又被称为“读锁”,在写模式下又被称为“写
锁”,读锁存在的意义是,当某个线程要读某个数据时,需要读锁不让别的线程写这个数
据;写锁存在的意义是,当某个线程要修改某个数据时,需要写锁确保别的线程既不能读也
不能写这个数据,将这个数据完全地锁住
锁之间还有兼容的问题,很多类型的锁都有读锁和写锁两种模式,它们之间的兼容性问题如
下图右侧2x2矩阵所⽰,只有两个读锁的话,它们两个是可以兼容的,⼀个线程给⼀个对象
上了⼀个读锁,别的线程可以过来给这个对象再上⼀个读锁,即多个线程可以给⼀同个对象
上读锁,但只要这个对象被上了读锁,别的线程只能给它再上读锁,不能再上写锁;如果⼀
个对象被上了写锁,那么其他的线程不能对这个对象做任何的操作,加读锁/写锁都不⾏,
因为上了写锁就表⽰这个对象被独占了
有的时候读锁也叫共享锁,因为加了读锁后仍然可以和其他线程共享对应的对象或变量,只
是其他线程不能修改它;写锁也叫独占锁,加了写锁之后相关的对象或变量就被当前线程所
独占了
Latch有如下的实现⽅式:
Blocking OS Mutex
翻译成中⽂就是,“阻塞式的操作系统互斥锁”,它⽐较容易使⽤,因为这是操作系
统原⽣⽀持的,但不能应对⼤规模并发竞争的场⾯,⽐如说C++的 std::mutex 就
属于这种锁,具体的实现原理和xv6的 sleeplock 差不多:⽤最基本的⾃旋锁保护
⼀个条件变量,获取该锁时检查这个条件变量,如果满⾜条件则修改条件变量从⽽
获得该互斥锁,否则进⼊睡眠状态,直到该互斥锁被释放时条件变量被修改回来,
释放互斥锁的线程唤醒已经睡眠的线程(详情参考xv6源码)
互斥锁和⾃旋锁相⽐,争⽤锁的时候,得不到锁的线程不会⼀直⾃旋,浪费CPU资
源,⽽是会进⼊睡眠,但是相应的睡眠与后续的唤醒操作由于会修改线程的状态,
因此也有⼀定的开销
Test-and-Set Spin Latch
这个简单来说,就是⾃旋锁,好处是可以通过⼀个指令就能获取/释放锁,实现简
单,但也不能应对⼤规模的并发竞争,⽽且对缓存和操作系统不友好
实现⽅式和xv6的 spinlock 差不多
Linus曾说过,在⽤户态不要使⽤⾃旋锁,因为占⽤CPU⾃旋是效率极低的操作
Reader-Writer Latches
其实就是前⾯⼀开始提到的读写锁,读写锁底层是基于⾃旋锁来实现的,并且设有
等待队列,为了避免想要获取写锁的线程等待太久(即避免starvation),会限制
在同⼀时刻能够获取写锁的线程的数量:⾃从有线程开始排队等待获取写锁之后,
后⾯想要获取读锁的线程都要开始等待,直到想获取写锁的线程成功获取写锁并完
成相关操作,释放写锁为⽌
剩余15页未读,继续阅读
士多霹雳酱
- 粉丝: 22
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于FREERTOS、LCD1602、MCP3202(SPI接口)2通道ADC采集proteus仿真设计
- 基于 Java+NLP的微博舆情分析系统
- 基于Python+NLPIR的网易新闻舆情分析系统
- 基于STM32F103C8T6、LCD1602、MCP3204的 4通道12位ADC转换proteus仿真设计
- 字模转换软件,适用微雪汉字库
- 实现函数P197.4.ms11
- 基于python+flask的舆情分析系统,包括爬虫、可视化、数据分析、情感分析等模块
- 文本检测-基于Pytorch实现的可微分二值化实时场景文本检测算法-附项目源码-优质项目实战.zip
- 8.2.cpp
- 开源流媒体框架ZLMediaKit C API JAVA实现,打造属于自己的流媒体服务
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0