IT技术博客大学习 共学习 共进步

锁是怎么实现的?

kernelchina blogs 2012-06-19 23:47:09 浏览 3,963 次

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

    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. 无锁消息队列 (阅读 14,125)
  2. 并发编程系列之一:锁的意义 (阅读 7,385)
  3. 无锁HashMap的原理与实现 (阅读 6,582)
  4. MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等) (阅读 5,723)
  5. DYNAMO平台的独门绝技: 利用NWR模型与vector clock解决锁问题 (阅读 5,205)
  6. 并行编程中的“锁”难题 (阅读 4,703)
  7. MySQL 中 QueryCache 的锁模型 (阅读 4,323)
  8. Linux下互斥量加锁与解锁操作的C代码实现 (阅读 3,861)
  9. php中读写文件时锁的使用 (阅读 3,762)
  10. lock free的理解 (阅读 3,264)