我正在网上寻找彼得森的算法,我似乎无法区分它是否是先发制人的。
抢先 - 非自愿安排,操作系统决定何时停止流程
非先发制人 - 一旦流程完成,自愿放弃CPU
我觉得彼得森的算法似乎没有先发制人,因为没有提到过程的优先级。
这是对的吗?有人能够对此有所了解吗?
答案 0 :(得分:1)
Preemption是基础操作系统的概念,更确切地说是调度程序。调度程序的任务是及时(双关语意图)方式为进程分配时隙。
调度程序可以中断有关等待状态的进程。
然而,它是谨慎的"通过利用等待状态向调度程序发出现在是让另一个进程运行的好时机的信号。
对于Peterson的算法,此信号应位于while
- 循环内。一个简单的sleep
就足够了。
Wikipedia也提到:
while条件即使有抢占也适用
所以我们开始时总结:
彼得森的算法既不是抢先,也不是非先发制人。
答案 1 :(得分:0)
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)获得机会。