技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统运维 --> 锁是怎么实现的?

锁是怎么实现的?

浏览:2942次  出处信息

    这是一个同事问我的问题。我并非专家,只是有基本的原理理解。首先排除上层的各种花里胡哨的锁的机制,基本的锁应该有如下的几种实现方式。

    1.OS提供的内核对象方式提供的异步锁实现

    这种方式下,锁的实现是内核对象,对外提供API,之所以说是异步是因为试图加锁的进程如果无法获取这个锁,内核的操作方式是将进程加入这个锁的等待队列之中。当该锁被释放之后,OS对于等待队列中的进程进行唤醒。

    2.对于单CPU的IntMask方式的同步的锁实现

    之所以说是同步是因为这种方式关中断,停止CPU的任务调度,这样我们可以保证互斥操作。

    3.对于多CPU的处理器,多个CPU之间的Spin Lock

    每个CPU只能关自己的中断,因此这个时候关中断无法保证全局互斥,需要找到一个全局的统一互斥点。我们依赖的是总线,各个CPU通过锁总线来进行竞争(据说Intel多核CPU提供了避免锁总线的机器指令)。锁总线之后,用一个全局变量来标识是否锁被占用。然后用deadloop的方式死等。

    对于第一种情况,如果是统一调度,内核在多CPU的情况下也可以实现相应的内核锁对象。INTMASK是特权指令用户态不可使用,进程可以使用CPU提供的原子指令例如xchg自己实现锁。这也是一些用户态应用在多核环境中实现自定义lock的基础。

    上述都是我没有深入code的原理性理解,可能不完全正确。

建议继续学习:

  1. 无锁消息队列    (阅读:12822)
  2. 并发编程系列之一:锁的意义    (阅读:5906)
  3. 无锁HashMap的原理与实现    (阅读:5353)
  4. MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等)    (阅读:4503)
  5. DYNAMO平台的独门绝技: 利用NWR模型与vector clock解决锁问题    (阅读:3928)
  6. 并行编程中的“锁”难题    (阅读:3764)
  7. MySQL 中 QueryCache 的锁模型    (阅读:3358)
  8. Linux下互斥量加锁与解锁操作的C代码实现    (阅读:3239)
  9. php中读写文件时锁的使用    (阅读:2938)
  10. lock free的理解    (阅读:2381)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1