互斥锁(mutex lock)

互斥锁

解决临界区最简单的工具就是互斥锁(mutex lock)
一个进程在进入临界区的时候获得锁(函数acquire)
在退出临界区时释放锁(函数release)

每个互斥锁都有一个布尔变量available
表示锁是否可用
如果可用, 调用acquire会成功, 且锁不再可用
直到锁被释放后(调用release函数)其他进程才可以再次获得该锁
互斥锁(mutex lock)_第1张图片

acquire()或release()的执行必须是原子操作
故通常采用硬件机制来实现

互斥锁的主要缺点: 忙等待
即违反了让权等待原则
当有一个进程在临界区中, 则其他任何进程在进入临界区前必须循环调用acquire()
浪费了CPU资源, 尤其是对于单处理器CPU
多处理器时其他一个线程可用在一个处理器上等待,
其他线程可以由其他处理器处理

需要连续循环忙等的互斥锁, 又可称为自旋锁(spin lock)
如TSL,
Swap指令,
单标志法

注意

  1. 需忙等
    自旋锁忙等, 违法了让权等待, 浪费了处理器资源
    但这并不意味着一直占用处理器
    时间片用完了自然会下处理器
  2. 忙等代价一定大?
    等待期间不需要进行进程切换,
    多处理器系统,
    上锁的时间短, 上锁操作简单, 则等待代价很低
    而且等待期间有可能使用临界区的进程释放了临界区
    但对于单处理机,
    其等待期间只会执行该等待的进程, 无法执行其他进程
    也就导致了占用临界区的进程并没有被执行, 也就无法释放临界区
    那纯纯白等
    所以自旋锁一般使用于多处理器系统

你可能感兴趣的:(操作系统,系统架构,后端,算法)