Liunx锁机制:原子操作、互斥锁、信号量、大内核锁、自旋锁,各自的特点,区别和联系。
锁的作用:使程序以串行方式对资源进行访问
A:原子操作:不能被分割的指令(对整数、对位进行操作)
一般用于增减变量值,操作简单,单条指令即可完成。
B:自旋锁:Linux中最常见的锁机制,它最多只能被一个可执行线程持有,用于处理较为复杂的情形,但由于请求它的线程在等待锁重新可用时处于忙等待状态,故自旋锁一般用于短时期内进行轻量级加锁,能够快速完成临界区,并释放锁。自旋锁不可递归
C:读-写自旋锁:将锁的用途明确地分为读取和写入两个场景,
D:信号量:类似睡眠锁,请求它的线程在等待锁可用时会处理休眠状态,加入等待队列,待信号量可用时再被唤醒。适用于锁会被长时间持有的情况。它可以同时允许任意数量的锁持有者,而自旋锁在一个时刻只能允许一个任务持有它。
E:读-写信号量:与读-写自旋锁类似,只有唯一一个写者能获得锁。
F:互斥体:信号量的特例化,使用技术永远为1.
G:大内核锁:全局自旋锁,可以递归,可以睡眠。
H:顺序锁:用于读写共享数据,常用于读者较多,写者较少的情况,通过维持一个序列计数器来判定是否有写操作存在。
参考文献:
《Linux 内核设计与实现 第三版》