理解信号量

时间:2014-01-05 12:31:21

标签: semaphore

我是一名机械英语学生,我无法理解他们如何能够针对以下问题找到解决方案。如果有人可以帮助我理解,他们如何得到这样的解决方案对我有用。

给出两个进程P1和P2访问共享资源ShR。使用信号量确保P1,P1,P2(即P1,P1,P2(第一周期),P1,P1,P2(第二周期),...)到ShR的循环访问顺序。您还应该为使用的。

提供初始值

解决此问题的方法是:

/* semaphore initialization */
init (S1,2)
init (S2,0)

/* process P1 */
loop
    wait(S1)
    access(ShR);
    signal(S2)
end loop;

/* process P2 */ 
loop
    wait(S2)
    wait(S2)
    access(ShR);
    signal(S1)
    signal(S1)
end loop;  

1 个答案:

答案 0 :(得分:2)

semaphore用于限制对资源的同时访问。如果,比方说,我想让500人进入俱乐部,我可以列出一个进出的人员。

这相当于信号量up()down()(在您的代码中为signal()wait()

假设我们的信号量是保镖:

我们会通过调用init (Bouncer, 500)

对其进行初始化

进入俱乐部的人会让保镖称之为wait(Bouncer)方法,减少一个空间。

离开俱乐部的人会让保镖称之为signal(Bouncer)方法,再提供一个房间。

如果Bouncer比wait多召唤500 signal s,那么俱乐部就没有空间,没有人可以进去。

在您的问题中:

/* semaphore initialization */
1. init (S1,2); /* make two rooms available for P1 in shared resource */
2. init (S2,0); /* make no room for P2 */

/* process P1 */
1. loop
1.1. wait(S1); /* make one less room available for P1 */
1.2. access(ShR); /* access resource... */
1.3. signal(S2) /* make one more room for p2 */
1. end loop;

/* process P2 */
1. loop
1.1. wait(S2); /* wait for room to clear for P2 on resource */
1.2. wait(S2); /* wait for room to clear for P2 on resource */
1.3. access(ShR); /* access resource... */
1.4. signal(S1); /* make one more room to P1 */
1.5. signal(S1); /* make one more room to P1 */
1. end loop;

这些循环将按此顺序展开(假设我们从 init-state 开始):

P1的循环迭代两次,因为它有两个允许访问资源的许可。

循环P2 等待两次,(wait在循环开始时调用两次)并且仅在P1的循环发生两次后才达到1.3(p1的两次资源访问?检查!)< / p>

然后P1的循环必须等待来自P2的循环信号,该信号在1.4和1.5上。这两个信号允许再循环P1两次,在实践中将系统“重置”为初始状态,从而满足运动标准(再次循环我的解释,再次。 ..然后吃一些冰淇淋)

重要: 循环不一定以这个特定的顺序展开,但解释应该足以理解程序流程。 P2的循环在从P1的两个循环中获得两个signal之前无法访问资源,并且循环1无法在Loop的两个signal之前重新进行迭代。