我正在学习操作系统的最终版本。目前正在进行流程同步章节 我们的书提供了以下算法来处理临界区。 它声称该算法解决了饥饿问题并提供了有限的等待。这是伪代码
var flag: array [0..1] of Boolean;
Turn: 0..1;
Repeat
flag[i] := true;
turn := j;
while (flag[j] and turn=j) do no-op;
critical section
flag[i] := false;
remainder section
until false;
根据我的理解,当进程处于其关键部分并且另一个进程需要访问它时会发生饥饿,但第一个进程将无法完成。所以第二个过程必须永远等待。我记得在CPU调度中,例如,在算法中实现aging
会解决饥饿问题。但我不明白这会发生什么。
我错了吗?有没有我在这里看不到的东西?谢谢。
答案 0 :(得分:1)
想象我们有2个进程:1和2, process1想要去CS: 让我们从第一个过程开始:
Repeat
flag[1] := true;
turn := 2;
我想在你的代码中解释“while”:
如果falg [2]等于true:则表示process2具有 已经跑了它的代码的吹线
flag [2]:= true;
但另一个问题:process2是否运行下一行?我的意思是:它跑了: “转:= 1;” ? 如是: 这意味着他们俩想要同时进入CS。
如果转弯值等于数字2,则意味着process1在process2之后运行了“turn:= 2”代码,因为转换变量是值process1 set,这意味着process2之前运行它,所以它是process2转。 n当process2在CS中我们什么都不做
while (flag[2] and turn=j) do no-op;
critical section
flag[i] := false;
remainder section
until false;
process2在CS和process1正在等待,process2在完成他的CS部分之后完全错误了。 因此,process1将转到CS。
Starvation是一个资源管理问题,由于资源被分配给其他进程,因此进程无法长时间获得所需资源(可能无限制)。 但是在这个解决方案中,进程2无法再次获取资源,因为它将其标志设置为值0,并且它应该再次运行“flag [2] = 1”以进入CS,但是process1在那时处于CS中,而process2应该等待进入CS。
如果process2无法完成CS,那么process1将永远等待,但是当我们说解决方案没有饥饿时,没有解决方案,我们并不是说这种情况。我们的意思是 如果两个进程都正常工作并且在关键部分代码中没有任何问题 ,现在明星 WONT HAPPEN
如果不清楚告诉我,我会解释更多