同步机制

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原子操作。

posted @ 2010-01-07 11:43  napoleon_liu  阅读(272)  评论(0编辑  收藏  举报