【问题标题】:Peterson's Algorithm - Preemptive or Non preemptive?彼得森算法——抢占式还是非抢占式?
【发布时间】:2015-11-04 22:22:17
【问题描述】:

我在网上找peterson的算法,好像分不清是不是抢占式的。

抢占式 - 非自愿调度,操作系统决定何时停止进程

非抢占式 - 进程完成后自愿放弃 CPU

我觉得彼得森的算法似乎是非抢占式的,因为没有提到进程的优先级。

正确吗?有人能解释一下吗?

【问题讨论】:

  • 你从哪里得到这些定义的?它们看起来 - 不完整 - 充其量。
  • 我在一个在线示例中找到了这个 - 只是想看看我对上述代码的回答是否正确?
  • "somewhere" 对于重要的定义来说确实是一个很好的参考。您应该继续使用此类引用(免责声明:评论可能包含讽刺)。算法通常两者都不是。那是执行的问题。请使用可靠的参考资料进行更多研究。您似乎混淆了一些短语和概念。
  • 并且:除非问题需要,否则不要发布图片!
  • 离题:彼得森的算法是在 1981 年开发的,当时处理器还很原始,即简单。您不应该尝试在现代处理器上使用 Peterson 算法。见lockless multithreading

标签: c algorithm process preemptive


【解决方案1】:

彼得森算法既不是抢占式也不是非抢占式

Preemption 是底层操作系统的概念,更准确地说是调度程序。调度程序的任务是以及时(双关语)的方式为进程分配时隙。

调度程序可以中断等待状态的进程。

但是,通过利用等待状态向调度程序发出现在是让另一个进程运行的好时机的信号是“谨慎的”。

对于彼得森算法,此信号应位于 while 循环内。一个简单的sleep 就足够了。

Wikipedia 还提到:

while 条件即使在抢占的情况下也有效

所以在我们开始的时候总结一下:
彼得森算法既不是抢占式也不是非抢占式

【讨论】:

    【解决方案2】:

    Peterson 的解决方案适用于抢占式流程。对于非抢占式进程,它可能会失败。

    假设两个进程都希望进入临界区。

    do {
       flag[0] = 1; 
       turn = 1;
       while(flag[1] && turn == 1);
       CS
       flag[0] = 0;
       RS
       } while(1);
    
    do {
       flag[1] = 1; 
       turn = 0;
       while(flag[0] && turn == 0);
       CS
       flag[1] = 0;
       RS
       } while(1);
    

    如果 turn = 1 进程 0 将处于自旋锁中。它在浪费 CPU 周期。它被抢占,以便其他进程(即进程 1)获得机会。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 2011-11-23
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多