2014-01-05 87 views
1

我是一名机械工程师,我无法理解他们如何才能在以下问题中解决此问题。如果有人能帮助我理解,那对我来说真的很有帮助,至于他们如何得到这样的解决方案。了解信号灯

给定两个进程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; 

回答

2

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

这相当于信号灯up()down()(在你的代码是signal()wait()

说我们的信号是保镖:

我们将初始化它通过调用init (Bouncer, 500)

一个人进入俱乐部会让保镖称它为wait(Bouncer)的方法,使得更少的空间可用。 210离开俱乐部的人会让保镖称它为signal(Bouncer)方法,使得更多的房间可用。

当保镖调用500多个wait总比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; 

这些循环将展开这个序列(假设我们从初始状态开始):

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

环路P2 等待两次,(wait在循环的开始调用了两次),只有环路P1后达到1.3发生两次(两个资源为P1访问?检查!)

然后循环用于P1绝等待来自P2的循环信号,它在1.4和1.5上。这两个信号允许两次循环访问P1,这在实践中将系统“重置”为初始状态,因此符合练习标准(只需循环我的解释,然后再...然后吃一些冰淇淋)

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

+1

非常好。整齐地解释。非常感谢你。 – Max

+0

如果您觉得有用,请不要忘记接受该答案。 –