互斥锁
解决临界区最简单的工具就是互斥锁(mutex lock)
一个进程在进入临界区的时候获得锁(函数acquire)
在退出临界区时释放锁(函数release)
每个互斥锁都有一个布尔变量available
表示锁是否可用
如果可用, 调用acquire会成功, 且锁不再可用
直到锁被释放后(调用release函数)其他进程才可以再次获得该锁
acquire()或release()的执行必须是原子操作
故通常采用硬件机制来实现
互斥锁的主要缺点: 忙等待
即违反了让权等待原则
当有一个进程在临界区中, 则其他任何进程在进入临界区前必须循环调用acquire()
浪费了CPU资源, 尤其是对于单处理器CPU
多处理器时其他一个线程可用在一个处理器上等待,
其他线程可以由其他处理器处理
需要连续循环忙等的互斥锁, 又可称为自旋锁(spin lock)
如TSL,
Swap指令,
单标志法
注意
- 需忙等
自旋锁忙等, 违法了让权等待, 浪费了处理器资源
但这并不意味着一直占用处理器
时间片用完了自然会下处理器 - 忙等代价一定大?
等待期间不需要进行进程切换,
多处理器系统,
上锁的时间短, 上锁操作简单, 则等待代价很低
而且等待期间有可能使用临界区的进程释放了临界区
但对于单处理机,
其等待期间只会执行该等待的进程, 无法执行其他进程
也就导致了占用临界区的进程并没有被执行, 也就无法释放临界区
那纯纯白等
所以自旋锁一般使用于多处理器系统