mutex为什么慢

Atomic VS Mutex

Atomic大概做的事情:原子指令修改内存,内存屏障保证修改对其他CPU可见,必要时锁总线

Mutex大概做的事情:原子指令compare-and-set,如果未成功上锁,使用futex相关系统调用,进入阻塞,直到lock值变化时唤醒

Futex

Futex,Fast Userspace Mutex,是Linux下系统级别的加锁机制。在Futex之前,想要对临界区加锁,一定需要系统调用来完成,而使用系统调用是需要进入内核态的,是一个相对比较耗时的过程

Futex希望实现一套机制,满足:

  • 大概率,在用户态通过原子操作完成加锁,这时开销等同于Atomic判断
  • 小概率,还是需要系统调用完成加锁,在内核中维护如下图所示的结构

Futex implementation diagram from LWN

一个任务,可以在一个地址上等待,内核中按照地址维护一张等待队列的哈希表。发现锁变量值的变化时,唤醒对应的等待队列中的一个任务。等待队列被更新过程中也会遭到争用,这时继续通过自旋锁保护