一个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
之前不能重新迭代。
非常好。整齐地解释。非常感谢你。 – Max
如果您觉得有用,请不要忘记接受该答案。 –