同步和互斥:
所谓互斥,是指散步在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
Linux中的同步技术包括:
技术\作用 | 互斥 | 同步 |
---|---|---|
中断屏蔽 | √ |
|
原子操作 | √ |
|
自旋锁 | √ |
|
信号量 | √ | √ |
completion |
| √ |
互斥灯(mutex) | √ |
自旋锁与信号量
从严格意义上说,信号量和自旋锁属于不同层次的互斥手段,前者的实现依赖于后者。
自旋锁和信号量选用的3项原则:
1)当锁不能被获取时,使用信号量的开销是进程上下文切换时间Tsw,使用自旋锁的开销是等待获取自旋锁(由临界区执行时间决定)Tcs,若Tcs比较小,应使用自旋锁;若Tcs很大,应使用信号量。
2)信号量所保护的临界区可以包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区。因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一个进程企图获取本自旋锁,死锁就可能发生。
3)信号量存在于进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则在信号量和自旋锁之间只能选择自旋锁。当然,如果一定要使用信号量,则只能通过down_trylock()方式进行,不能获取就立即返回且不执行临界区代码,以避免阻塞。
信号量和complete
信号量和complete都可以用于同步,complete可算是对信号量用于同步的一种优化。
信号量和互斥灯mutex
信号量和互斥灯都可以用于互斥,信号量中也有专门用于初始化信号量来用作互斥的宏定义,但是在高版本中好像被移除了,所以要使用信号量实现互斥,现在得自己实现原来的宏定义。