操作系统精髓与设计原理(四)——并发性:互斥和同步

并发的原理

在单处理多道程序设计系统中,进程交替执行,表现出一种同时执行的外部特征。在多处理器系统中,不仅可以交替执行进程,而且可以重叠执行进程。

进程间的资源竞争

程序的资源临界区,使用一个不可共享的资源的程序。
互斥的要求,资源分配一给一个进程,其他进程不能获取。
死锁,两个进程相互等待对方拥有的资源,造成无限等待。
饥饿,一个进程无限期被拒绝访问资源。

进程间通过共享合作

进程间通过通信合作

通信提供了同步和协调各种活动的方法。
不需要互斥。

互斥的要求

  1. 必须强制实施互斥,在与相同资源或共享对象的临界区有关的所有进程中,一次只允许一个进程进入临界区。
  2. 在非临界区停止的进程不能干涉其他进程。
  3. 不允许需要访问临界区的经常被无限延迟。
  4. 没有进程在临界区时,任何需要进入的进程可以立即进入。

互斥:硬件的支持

中断禁用

临界区不能被中断,所以可以保证互斥。但是会降低程序的执行效率。在多处理器系统中,禁用中断是不能保证互斥的。

专用机器指令

提出机器指令,保证两个动作的原子性。

信号量

定义:用于进程间传递信号的一个整数值。只有三种操作:初始化、递减和增加。都是原子操作。递减用于阻塞进程,增加用于接触阻塞。
基本原理:两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。

  1. 信号量初始化为非负数;
  2. semWait操作使信号减一,如果变成负数,则执行semWait的进程被阻塞,否则进程继续执行;
  3. semSignal操作使信号量加一,如果值大于等于零,则被semWait操作阻塞的进程被解除阻塞。
    负值等于正在解除阻塞的进程数量。

互斥

通过信号量来解决互斥问题的方法。每个进程中进入临界区前执行semWait如果s为负数,则进程被挂起,如果值为1,则s被减为0,进程立即进入临界区,由于s不再为正,其他进程都无法进入临界区。

生产者消费者问题

管程

管程是一个而程序设计语言结构,它提供了与信号量同样的功能,但更易于控制。
管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块,特点:

  • 局部变量只能被管程访问,任何外部过程都不能访问。
  • 一个进程通过调用管程的一个过程进入管程。
  • 只能由一个进程进入管程中执行,其他调用管程的进程都被阻塞。

消息传递

进程交互必须满足同步和通信。为了实施互斥,进程必须同步。为了合作,进程必须进程交换数据。

原文地址:https://www.cnblogs.com/lippon/p/14117719.html