进程同步:操作系统中的临界区问题
什么是进程同步?
进程同步 是协调进程执行的任务,以确保没有任何两个进程可以访问相同的共享数据和资源。
在多进程系统中,当多个进程同时运行时,如果一个以上的进程尝试同时访问同一共享资源或数据,则尤其需要进程同步。
这可能导致共享数据不一致。因此,一个进程所做的更改不一定会在其他进程访问相同共享数据时得到反映。为避免此类数据不一致,需要对进程进行同步。
进程同步如何工作?
例如,进程 A 在更改内存位置中的数据,而另一个进程 B 正在尝试从同一内存位置读取数据。在这种情况下,第二个进程读取的数据很可能出错。
程序段
这里,临界区的四个必要元素是:
- 入口段: 这是进程的一部分,用于决定特定进程的进入。
- 临界区: 这一部分允许一个进程进入并修改共享变量。
- 出口段: 出口段允许在入口段等待的其他进程进入临界区。它还检查已完成执行的进程是否应通过此段退出。
- 剩余段: 代码中不属于临界区、入口段和出口段的所有其他部分都称为剩余段。
什么是临界区问题?
临界区是可以在特定时间由单个进程访问的代码段。该部分包含需要其他进程访问的共享数据资源。
- 进入临界区的入口由 wait() 函数处理,并表示为 P()。
- 临界区的出口由 signal() 函数控制,表示为 V()。
在临界区中,只能执行一个进程。其他等待执行其临界区的进程需要等到当前进程完成执行。
临界区规则
临界区必须强制执行所有三个规则:
- 互斥: 互斥是一种特殊的二元信号量,用于控制对共享资源的访问。它包括优先级继承机制,以避免扩展的优先级反转问题。一次只有一个进程可以在其临界区内执行。
- 前进: 当没有人在临界区内,而有人想进入时,就会使用此解决方案。那些不在其剩余段中的进程应在有限的时间内决定谁可以进入。
- 有限等待: 当一个进程请求进入临界区时,允许进入其临界区的进程数量有限制。因此,当达到限制时,系统必须允许该进程的请求进入其临界区。
临界区解决方案
在进程同步中,临界区起着主要作用,因此必须解决该问题。
以下是解决临界区问题的几种常用方法。
Peterson 解决方案
Peterson 解决方案是临界区问题的常用解决方案。该算法由计算机科学家 Peterson 开发,因此得名为 Peterson 解决方案。
在此解决方案中,当一个进程在临界状态下执行时,其他进程只执行代码的其余部分,反之亦然。此方法还有助于确保在特定时间只有一个进程在临界区内运行。
示例
PROCESS Pi FLAG[i] = true while( (turn != i) AND (CS is !free) ){ wait; } CRITICAL SECTION FLAG[i] = false turn = j; //choose another process to go to CS
- 假设有 N 个进程(P1、P2、… PN),并且每个进程在某个时间点都需要进入临界区。
- 维护一个大小为 N 的 FLAG[] 数组,默认值为 false。因此,每当进程需要进入临界区时,它都必须将其标志设置为 true。例如,如果 Pi 想进入,它会设置 FLAG[i]=TRUE。
- 另一个称为 TURN 的变量指示当前等待进入 CS 的进程编号。
- 进入临界区并在退出时更改 TURN 的进程将从就绪进程列表中更改为另一个数字。
- 例如:turn 为 2,则 P2 进入临界区,退出时 turn=3,因此 P3 跳出等待循环。
同步硬件
有时,临界区的问题也可以通过硬件来解决。一些操作系统提供了锁定功能,进程在进入临界区时获取锁定,在离开后释放锁定。
因此,当另一个进程尝试进入临界区时,它将无法进入,因为它被锁定了。只有在通过获取锁来释放它时,它才能这样做。
互斥锁
同步硬件对每个人来说都不是简单的实现方法,因此也引入了严格的软件方法,称为互斥锁。
在此方法中,在代码的入口段,会对临界区内使用的临界资源进行锁定。在出口段,该锁定将被释放。
信号量解决方案
信号量 只是一个非负的、在线程之间共享的变量。它是临界区问题的另一种算法或解决方案。它是一种信号机制,等待信号量的线程可以被另一个线程发出信号。
它使用两个原子操作:1)wait,2)signal 进行进程同步。
示例
WAIT ( S ): while ( S <= 0 ); S = S - 1; SIGNAL ( S ): S = S + 1;
摘要
- 进程同步是协调进程执行的任务,以确保没有任何两个进程可以访问相同的共享数据和资源。
- 临界区的四个要素是:1)入口段 2)临界区 3)出口段 4)剩余段
- 临界区是可以在特定时间由单个进程访问的代码段。
- 临界区必须强制执行的三个规则是:1)互斥 2)进程解决方案 3)有限等待
- 互斥是一种特殊的二元信号量,用于控制对共享资源的访问。
- 当没有人在临界区内,而有人想进入时,就会使用进程解决方案。
- 在有限等待解决方案中,在进程请求进入其临界区后,其他进程可以进入其临界区的数量是有限制的。
- Peterson 解决方案是临界区问题的常用解决方案。
- 临界区的问题也可以通过同步硬件来解决。
- 同步硬件对每个人来说都不是简单的实现方法,因此也引入了严格的软件方法,称为互斥锁。
- 信号量是临界区问题的另一种算法或解决方案。