lock-base 机制
semaphore(P 减操作, V是加操作)
semaphore 在SMP中都要用到 memory barrier , 通过唯一的内存访问来保证一致性。
mutex( 资源为 1 的semaphore)
read/write lock (semaphore的衍生, reade pv: 1, write pv :一个极大值)
condition(posix应用程序) 和 completion(内核) 对 semaphore 休眠的优化(semaphore假定大多数时候不会休眠,但condition每次都会导致context switch)。
spinlock SMP 中 spinlock 就是不断轮询,这对在 临界区中 操作时间比较少的优化,省去了context switch. 但用不好就会 cpu 100% (spinlock 只在内核中有,用户层代码会被打断,没办法保证原子性)
spinlock 也有 rw_lock, 还有针对 irq 的 soft_irq的优化。
锁机制的本质就是P、V,其它都是基于不同使用场景的优化。
Linux 内核可用 lock_meter 测量 锁竞争的性能损失。
Lock-Free
Lock-Free: 保证任何时候都有一个线程在运行(这不要求线程不能休眠,spin_lock需要)。
Wait-Free: 线程执行时间不会受其它线程的干扰。
atom interger or bit 操作(x86 cpu 指令支持, 本来整数操作是原子的,但SMP中多个CPU,每个CPU都有 cache(L1,L2, register), 这就会导致不一致)。
一个读者和一个写者,使用一个循环缓冲区,不需要加锁。
kfifo 内核通用的fifo队列机制,writer使用spin_lock来互斥.(要求写操作可以redo)
seqlock 写者可以立马写(更新序号),但读者需要判断,临界区前和后读到的seq序号是否一致,不一致就要重读。读者需要容忍数据的不一致,出现不一致就重试。写者使用spin_lock来互斥。(写者优先,要求读操作可以redo, writer 是 wait-free, reader是lock-free)
RCU 是 写时拷贝,per-cpu 数据结构的结合。(对读者优化,要求写操作可以redo, reader 是 wait-free)
lock-free , 要求部分操作是可重复的(commit-retry), 和CAS原子操作。