在内核中,可能出现多个进程(通过系统调用进入内核模式)访问同一个对象,进程和硬中断访问同一个对象,进程和软中断访问同一个对象,多个处理访问同一个对象,此时需要使用互斥技术,确保在给定的时刻只有一个主体可以进入临界区访问对象。
如果临界区执行的时间比较长或者可能睡眠,可以使用下面这些互斥技术:
- 信号量,大多数情况下使用互斥信号量
- 读写信号量
- 互斥锁
- 实时互斥锁
如果临界区执行的时间很短,并且不会睡眠。那么使用上面的锁不太合适,因为进程切换的代价很高,可以使用下面这些互斥技术:
- 原子变量
- 自旋锁
- 读写自旋锁。对自旋锁的改进,允许多个读者同时进入临界区。
- 顺序锁。对读写自旋锁的改进,读者不会阻塞写者。
申请这些锁的时候,如果锁被其他进程占有,进程自旋锁等待(也称为忙等待)。
进程还可以使用下面的互斥技术。