锁是怎么实现的?
浏览:2938次 出处信息
这是一个同事问我的问题。我并非专家,只是有基本的原理理解。首先排除上层的各种花里胡哨的锁的机制,基本的锁应该有如下的几种实现方式。
1.OS提供的内核对象方式提供的异步锁实现
这种方式下,锁的实现是内核对象,对外提供API,之所以说是异步是因为试图加锁的进程如果无法获取这个锁,内核的操作方式是将进程加入这个锁的等待队列之中。当该锁被释放之后,OS对于等待队列中的进程进行唤醒。
2.对于单CPU的IntMask方式的同步的锁实现
之所以说是同步是因为这种方式关中断,停止CPU的任务调度,这样我们可以保证互斥操作。
3.对于多CPU的处理器,多个CPU之间的Spin Lock
每个CPU只能关自己的中断,因此这个时候关中断无法保证全局互斥,需要找到一个全局的统一互斥点。我们依赖的是总线,各个CPU通过锁总线来进行竞争(据说Intel多核CPU提供了避免锁总线的机器指令)。锁总线之后,用一个全局变量来标识是否锁被占用。然后用deadloop的方式死等。
对于第一种情况,如果是统一调度,内核在多CPU的情况下也可以实现相应的内核锁对象。INTMASK是特权指令用户态不可使用,进程可以使用CPU提供的原子指令例如xchg自己实现锁。这也是一些用户态应用在多核环境中实现自定义lock的基础。
上述都是我没有深入code的原理性理解,可能不完全正确。
建议继续学习:
- 无锁消息队列 (阅读:12819)
- 并发编程系列之一:锁的意义 (阅读:5903)
- 无锁HashMap的原理与实现 (阅读:5352)
- MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等) (阅读:4500)
- DYNAMO平台的独门绝技: 利用NWR模型与vector clock解决锁问题 (阅读:3926)
- 并行编程中的“锁”难题 (阅读:3762)
- MySQL 中 QueryCache 的锁模型 (阅读:3358)
- Linux下互斥量加锁与解锁操作的C代码实现 (阅读:3238)
- php中读写文件时锁的使用 (阅读:2937)
- lock free的理解 (阅读:2379)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:关于PHP加速器APC的使用
后一篇:利用HTK工具包快速建立一个语音命令识别系统 >>
文章信息
- 作者:appleleaf 来源: kernelchina blogs
- 标签: 锁
- 发布时间:2012-06-19 23:47:09
建议继续学习
近3天十大热文
- [55] Oracle MTS模式下 进程地址与会话信
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 如何拿下简短的域名
- [53] 图书馆的世界纪录
- [53] android 开发入门
- [52] Go Reflect 性能
- [49] 【社会化设计】自我(self)部分――欢迎区
- [49] 读书笔记-壹百度:百度十年千倍的29条法则
- [38] 程序员技术练级攻略
- [32] 视觉调整-设计师 vs. 逻辑