进程同步 - 临界区
Process synchronization - Critical section
我正在为 OS 的期末学习而学习。目前在进程同步章节。
我们的书提供了以下算法来处理临界区。
它声称该算法解决了饥饿问题并提供有限等待。这是伪代码
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
可以解决饥饿问题。但我不知道这里会发生什么。
我错了吗?有什么我在这里没有看到的吗?谢谢。
假设我们有 2 个进程:1 和 2,
process1 想去 CS:
让我们从第一个过程开始:
Repeat
flag[1] := true;
turn := 2;
我想解释一下你代码中的"while":
如果falg[2]等于true:这意味着process2有
已经运行它的代码
标志[2] := 真;
但另一个问题:process2 运行 是下一行吗?我的意思是:做到了 运行:
"turn := 1;" ?
如是:
说明他们俩同时想进CS
哪个先去CS?
如果turn值等于number 2表示process1 运行 process2之后的"turn:=2"代码,因为turn变量是process1设置的值表示process2 运行它更早,所以轮到 process2 了。
当 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.
此解决方案中是否发生饥饿?
饥饿是一个资源管理问题,其中一个进程长时间(可能是无限的)无法获得它需要的资源,因为资源正在分配给其他进程。
但是在这个解决方案中process2无法再次获取资源,因为它设置了它的标志值为0,它应该再次运行 "flag[2]=1"才能进入CS,但是process1当时在CS中,而process2应该等待进入 CS。
当一个进程没有完成它的 CS 时会发生什么?
如果process2不能完成CS,process1将永远等待,但是当我们说一个解决方案没有饥饿时,这个没有解决方案,我们并不是说这种情况。我们的意思是 如果两个进程都正常工作并且在关键部分代码 中没有任何问题,现在饥饿 不会发生
算法是如何工作的?
有两个人,他们想进入一个房间,这个房间是CS。
两者都应该有标志,告诉我们要进入 CS
但是,只能一个人进入
他们都有一张票,票上写着一个号码。这个号码是另一个人的id。
有一个包 space 只是为了票。
当person1想进去的时候,他应该把票放在那里。
所以现在有一张编号为“2”的票
这时候person2会来
他必须把他的票放在那个包裹上,因为没有 space。他会把它放在第一张票上
所以现在当你查看数据包时,你只看到第二张票
在第二张票上,数字 1 写着
所以,person1可以进入了。
他不能再次进入,因为 person2 站在门前,当 person1 出来时,它的标志将是假的(在 cs 之后他的标志将是假的)并且 while(对于 person2)将停止所以他可以进入
如果不清楚告诉我,我会解释更多
我正在为 OS 的期末学习而学习。目前在进程同步章节。 我们的书提供了以下算法来处理临界区。 它声称该算法解决了饥饿问题并提供有限等待。这是伪代码
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
可以解决饥饿问题。但我不知道这里会发生什么。
我错了吗?有什么我在这里没有看到的吗?谢谢。
假设我们有 2 个进程:1 和 2, process1 想去 CS: 让我们从第一个过程开始:
Repeat
flag[1] := true;
turn := 2;
我想解释一下你代码中的"while":
如果falg[2]等于true:这意味着process2有 已经运行它的代码
标志[2] := 真;
但另一个问题:process2 运行 是下一行吗?我的意思是:做到了 运行: "turn := 1;" ? 如是: 说明他们俩同时想进CS
哪个先去CS?
如果turn值等于number 2表示process1 运行 process2之后的"turn:=2"代码,因为turn变量是process1设置的值表示process2 运行它更早,所以轮到 process2 了。 当 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.
此解决方案中是否发生饥饿?
饥饿是一个资源管理问题,其中一个进程长时间(可能是无限的)无法获得它需要的资源,因为资源正在分配给其他进程。 但是在这个解决方案中process2无法再次获取资源,因为它设置了它的标志值为0,它应该再次运行 "flag[2]=1"才能进入CS,但是process1当时在CS中,而process2应该等待进入 CS。
当一个进程没有完成它的 CS 时会发生什么?
如果process2不能完成CS,process1将永远等待,但是当我们说一个解决方案没有饥饿时,这个没有解决方案,我们并不是说这种情况。我们的意思是 如果两个进程都正常工作并且在关键部分代码 中没有任何问题,现在饥饿 不会发生
算法是如何工作的?
有两个人,他们想进入一个房间,这个房间是CS。
两者都应该有标志,告诉我们要进入 CS
但是,只能一个人进入
他们都有一张票,票上写着一个号码。这个号码是另一个人的id。
有一个包 space 只是为了票。
当person1想进去的时候,他应该把票放在那里。
所以现在有一张编号为“2”的票
这时候person2会来
他必须把他的票放在那个包裹上,因为没有 space。他会把它放在第一张票上
所以现在当你查看数据包时,你只看到第二张票
在第二张票上,数字 1 写着
所以,person1可以进入了。
他不能再次进入,因为 person2 站在门前,当 person1 出来时,它的标志将是假的(在 cs 之后他的标志将是假的)并且 while(对于 person2)将停止所以他可以进入
如果不清楚告诉我,我会解释更多