Bootstrap

[操作系统OS]第八章:同步

一、基本概念

临界区:临界区是指进程中的一段需要访问共享资源并且当另一个进程处于相应代码区域时,就不会被执行的代码区域
互斥:当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并且访问任何相同的共享资源
死锁:两个或者两个以上的进程,在相互等待完成特定任务,而最终没有办法将自身任务进行下去
饥饿:一个可执行的进程,被调度器持续忽略,以至于虽然处于可执行状态却不被执行

二、临界区

  • 同一个时间临界区中最多存在一个线程
  • 如果一个线程想要进入临界区,那么最终它会成功
  • 如果一个线程处于入口区,那么在它的请求被接受之前,其他线程进入临界区的时间是有限制的
  • 如果一个进程在等待进入临界区,那么在它进入之前就会被挂起(不一定是挂起,也有可能会做其他的逻辑操作)

那么有些方法可以实现对临界区的保护呢?

方法一:禁用硬件中断

如果没有中断,那么就没有上下文切换,所以就不存在并发。所以只需要在进入临界区时禁用中断,并在离开临界区时开始中断。
可能会导致其他线程处于饥饿状态,无法限制响应中断所需的时间(可能存在硬件影响)。在多CPU的环境其实没什么卵用。

方法二:基于软件的解决方案

通过算法控制线程对于临界区的进入和处理的逻辑

方法三:更高级的抽象

可以通过硬件对锁抽象成原子操作指令,提供给系统进行使用。比如CAS的实现之类。
适用于单处理器或者共享主存的多处理器中任意数量的进程,简单并且容易证明,可以用于支持多临界区。执行开销也很小,所以现在被广泛使用。
但是忙等待会消耗CPU时间,当进程离开临界区并且多个进程在等待的时候可能会造成饥饿。
如果一个低优先级的进程拥有临界区,并且一个高优先级的进程也有需求进入临界区,那么高优先级进程会获得处理器并等待临界区,就有可能造成死锁。也可以使用动态优先级来解决这里产生的死锁现象。

;