【问题标题】:Bounded-Waiting Mutual Exclusion with Compare-and-Swap带比较和交换的有界等待互斥
【发布时间】:2019-03-07 02:22:50
【问题描述】:

据我所知,我在每一行都添加了 cmets,但我仍然不明白为什么我们在最后设置 waiting[j] = false; 而不运行进程 j 的关键部分。在我看来,waiting[j] = false; 应该替换为i = j;,所以当它再次循环时,我们运行进程 j 的临界区。否则我们将一直运行进程 i 的关键部分!

【问题讨论】:

    标签: operating-system synchronization


    【解决方案1】:

    对于进入其临界区的进程,waiting[i] 必须为 false,但只有当进程通过调用 waiting[j] = false 离开其临界区时,waiting[i] 才能设置为 false,我认为这意味着现在进程j可以进入其临界区提示进程i等待。我仍在学习这些概念,所以我不能 100% 确定。 Abraham and Silberschatz 第 9 版对这些算法的解释不够透彻。

    【讨论】:

    • 我只是接受你的回答,因为在期末考试之后,我忘记了我在这门课程中学到的所有内容 LOL
    【解决方案2】:

    算法的有效性

    首先,需要注意的是,该算法解决了临界区问题 当有两个进程时(这里提到它们作为进程 0 和进程 1)。

    接下来,根据 Abraham 和 Silberschatz 的操作系统概念中的约定。彼得·B·加尔文。 Gerge Gagnei是指其中一个在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 恢复通过进入临界区执行。
    • 同时,进程 i 循环回到最外层的 while(true) 循环,setting waiting[i]truekey 1 并通过在 while(waiting[i] && key == 1) 循环中循环来等待

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2010-12-07
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多