进程同步 - 关键部分

时间:2015-07-05 13:43:35

标签: operating-system synchronization critical-section thread-synchronization

我正在学习操作系统的最终版本。目前正在进行流程同步章节 我们的书提供了以下算法来处理临界区。 它声称该算法解决了饥饿问题并提供了有限的等待。这是伪代码

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会解决饥饿问题。但我不明白这会发生什么。

我错了吗?有没有我在这里看不到的东西?谢谢。

1 个答案:

答案 0 :(得分:1)

想象我们有2个进程:1和2, process1想要去CS: 让我们从第一个过程开始:

Repeat
    flag[1] := true;
    turn := 2;

我想在你的代码中解释“while”:

  1. 如果falg [2]等于true:则表示process2具有 已经跑了它的代码的吹线

    flag [2]:= true;

  2. 但另一个问题:process2是否运行下一行?我的意思是:它跑了: “转:= 1;” ? 如是: 这意味着他们俩想要同时进入CS。

  3. 哪一个应该先去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。

    当一个过程不能使它成为CS时会发生什么?

    如果process2无法完成CS,那么process1将永远等待,但是当我们说解决方案没有饥饿时,没有解决方案,我们并不是说这种情况。我们的意思是 如果两个进程都正常工作并且在关键部分代码中没有任何问题 ,现在明星 WONT HAPPEN

    算法如何工作?

    有两个人,他们想进入一个房间,这个房间是CS 两者都应该在那里举旗,告诉我们要进入CS
    但是,只有一个人可以进入 他们都有一张票,在票上写了一个号码。这个号码是另一个人的身份。
    有一个包只有票据空间的包 当person1想进入时,他应该把票放在那里 所以现在有一张号码为“2”的票 此时person2将来 他必须把票放在那个小包上,因为没有任何空间。他会把它放在第一张票上 所以现在当你查看数据包时,你只看到第二张票 在第二张票上,1号已写入 所以,person1可以进入。
    并且他不能再次进入,因为person2站在门前,当person1出来时,它的旗帜将是假的(在他的旗帜将是假的cs之后)并且while(对于person2)将停止所以他可以进入

    如果不清楚告诉我,我会解释更多