我是一名机械英语学生,我无法理解他们如何能够针对以下问题找到解决方案。如果有人可以帮助我理解,他们如何得到这样的解决方案对我有用。
给出两个进程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;
答案 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
之前重新进行迭代。