进程同步:共享变量与信号量的应用
1. 共享变量同步
1.1 基本原理
共享变量同步是一种为进程间提供同步的基础方法。它仅依靠共享变量来实现同步,无需特殊的语言机制。其核心在于,进程通过设置和测试共享变量来表明自身状态。若一个进程发现另一个进程的状态会阻碍其继续执行,它会进入忙等待状态,即通过循环不断测试状态是否改变。
1.2 临界区问题
临界区问题涉及 N 个进程,每个进程重复执行包含临界区和非临界区的代码。临界区中,进程可能会更新共享变量、使用打印机或写入文件等,这些操作需要独占共享资源;非临界区则不访问任何共享资源。
一个典型的临界区问题解决方案的通用形式如下:
- 每个进程执行 S 个会话。
- 每个会话包含非临界区代码和临界区代码。
- 临界区代码前有获取访问权限的入口协议,后有释放访问权限的出口协议。
为使示例更具体,代码中引入了共享变量 x,临界区代码仅将 x 加 3。由于无控制地访问 x 可能导致竞态条件,因此对 x 的访问需在临界区内进行“保护”。
临界区问题的解决方案应具备以下特性:
|特性|描述|
|----|----|
|CS1:互斥性|任何时候,最多只有一个进程在其临界区内执行。|
|CS2:无活锁|若有两个或更多进程试图进入其临界区,其中一个将成功。|
|CS3:无不必要延迟|试图进入临界区的进程仅会被正在执行临界区的其他进程或也在尝试进入临界区的进程阻止。|
|CS4:最终进入|试图进入临界区的进程最终将被允许进入。|