互斥量与条件变量

凡涉及到内存共享、共享文件以及共享任何资源的情况都会引起竞争条件。我们需要阻止多个进程同时读写共享数据,换言之,我们需要的是互斥,即已某种手段确定当一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作。

避免竞争条件的问题也可以用一种抽象的方式进行描述。一个进程的一部分时间做内部计算或另外一些不会引起竞争条件的操作,另一部分时间可能需要访问共享内存或共享文件,或执行另外一些可能导致竞争条件的操作。我们把对共享内存进行访问的程序片段称作临界区。如果我们能够适当的安排,使得两个进程不可能同时处于临界区,就能够避免竞争条件。

一个好的解决方案,需要满足以下四个条件:

  1. 任何两个进程不能同时出去其临界区
  2. 不应对 CPU 的速度和数量做任何假设
  3. 临界区外运行的进程不得阻塞其他进程
  4. 不得使进程无期限等待进入临界区

原子操作:是指一组相关联的操作要么都不间断地执行,要么都不执行。 信号量:使用一个整型变量来累计唤醒次数。对一信号量执行 down 操作,则是检查其值是否大于 0,若是则减一,否则进程将睡眠,检测数值、修改变量值以及可能的睡眠操作需要确保是原子操作。up 操作对信号量的值增 1。如果一个或多个进程在该信号上睡眠,无法完成一个先前的 down 操作,则有系统选择其中的一个并允许该进程完成它的 down 操作。于是,对一个有进程在其上睡眠的信号量执行了一次 up 操作之后,该信号量的值仍旧是 0,但在其上睡眠的进程却少了一个。信号量的值增 1 和唤醒其他进程操作也是不可分割的,是原子操作。 互斥量:一个可以处于两态之一的变量,解锁和加锁