Skip to content

Latest commit

 

History

History
57 lines (40 loc) · 1.66 KB

locks.md

File metadata and controls

57 lines (40 loc) · 1.66 KB

Locks in Linux

  • 原子操作atomic
  • 自旋锁spin_lock
  • 信号量semaphore
  • 互斥信号量mutex
  • 读写锁rw_lock
  • RCU(ReadCopyUpdate)
  • seqlock

Atomic

  • atomic在操作执行完毕前不会被任何事务打断,是最小的执行单元,不可能有比它更小的执行单元
  • 通常用于实现资源的引用计数

SpinLock

  • 持锁时间一般比较短,持锁期间是抢占失效的
  • 不会引起调用者休眠(busy-waiting)
  • 不可重入,适用于任何上下文

Semaphore/rw_semaphore(读写信号量)

  • 内核中的信号量在概念和原理上和用户态的System V的IPC机制是一样的
  • 持锁时间一般比较长,持锁期间是可以被抢占的
  • 适用于进程上下文
  • 信号量用于线程的同步
  • 加锁和解锁可以被不同线程操作

互斥(信号量)mutex

  • 唯一排它
  • 用于线程的互斥
  • 信号量在创建时设置的初始值为1就是mutex
  • 加锁和解锁是被同一个线程操作

互斥和信号量的根本区别

互斥用于线程的互斥,信号量用于线程的同步

rw_lock(特殊的自旋锁)

  • 对访问分为读和写
  • 相对于spin_lock有更好的并发性(可多读锁,每个逻辑cpu可已有一个)

RCU

  • 共享资源大部分以读为主,写少
  • RCU保护的代码也不允许进入睡眠
  • 是rw_lock的改进,读不需要锁,无同步开销
  • 允许多读者和多写者,读无同步开销,写同步开销大
  • 受保护的资源必须用指针访问

Seqlock

  • 对rw_lock的优化,读者可以在写者操作是访问,不必等待写者操作完成
  • 要求被保护的临界资源不包含指针,因为写者可能使指针失效,而读者去访问可能造成错误