【发布时间】:2019-03-07 02:22:50
【问题描述】:
据我所知,我在每一行都添加了 cmets,但我仍然不明白为什么我们在最后设置 waiting[j] = false; 而不运行进程 j 的关键部分。在我看来,waiting[j] = false; 应该替换为i = j;,所以当它再次循环时,我们运行进程 j 的临界区。否则我们将一直运行进程 i 的关键部分!
【问题讨论】:
标签: operating-system synchronization
据我所知,我在每一行都添加了 cmets,但我仍然不明白为什么我们在最后设置 waiting[j] = false; 而不运行进程 j 的关键部分。在我看来,waiting[j] = false; 应该替换为i = j;,所以当它再次循环时,我们运行进程 j 的临界区。否则我们将一直运行进程 i 的关键部分!
【问题讨论】:
标签: operating-system synchronization
对于进入其临界区的进程,waiting[i] 必须为 false,但只有当进程通过调用 waiting[j] = false 离开其临界区时,waiting[i] 才能设置为 false,我认为这意味着现在进程j可以进入其临界区提示进程i等待。我仍在学习这些概念,所以我不能 100% 确定。 Abraham and Silberschatz 第 9 版对这些算法的解释不够透彻。
【讨论】:
首先,需要注意的是,该算法解决了临界区问题 仅当有两个进程时(这里提到它们作为进程 0 和进程 1)。
接下来,根据 Abraham 和 Silberschatz 的操作系统概念中的约定。彼得·B·加尔文。 Gerge Gagne,i是指其中一个在0和1之间的过程,j是指其他 strong> 过程。
话虽如此,必须注意这段代码是为进程i。 进程 j 的代码将通过在给定代码中交换 i 和 j 获得。 (在我看来,这就是让您感到困惑的原因,因为您说了以下内容)
应该替换为 i = j;所以当它再次循环时,我们运行进程 j 的临界区。否则我们将一直运行进程 i 的关键部分!
waiting[j] = false 的后果(发生在进程 i 中)现在,这两个代码都将作为系统中的两个不同进程执行。因此,只要您在 Process i 的最后一行设置 waiting[j] = false,就会发生以下事件:
while(waiting[j] && key == 1) 中 进程 j 的代码 的条件(请注意,进程 j 的代码是通过将 i 替换为 j 获得的,如上一个标题“右映射”中所述正确进程的代码)结果是false,因此进程 j 恢复通过进入临界区执行。while(true) 循环,setting waiting[i] 为 true,key 到 1 并通过在 while(waiting[i] && key == 1) 循环中循环来等待。【讨论】: