2016-11-18 164 views
-3

任何人都可以为我解释这个吗?4个进程的信号量执行

在以下代码中,四个进程使用printf产生输出,并使用三个信号量R,ST进行同步。我们假设printf不会导致上下文切换。

/* initialization */ 
Semaphore R=1, S = 3, T = 0; 

/* process 1 */ 
while(true) { 
    P(S); 
    printf('A'); 
} 

/* process 2 */ 
while(true) { 
    P(T); 
    printf('B'); 
    printf('C'); 
    V(T); 
} 

/* process 3 */ 
while(true) { 
    P(T); 
    printf('D'); 
    V(R); 
} 

/*process 4 */  
while(true) { 
    P(R);  
    printf('E');  
    V(T); 
} 

当这组进程运行时会打印多少个A和B?

+3

请格式化您的代码。这是'c'还是'java'? –

+0

这是一种伪代码 –

+0

认真!很难阅读和理解你在说什么。请看看[如何创建一个最小化,完整和可验证的示例](http://stackoverflow.com/help/mcve) – mmushtaq

回答

0

进程1与其他进程无关,因为它只是获取S,并且什么都不释放。它会打印'A'3次,并且会永久睡眠。

方法2 & 3将立即在启动睡眠,因为Ť源不可获得在起动。过程4将获取最后一个R并释放一个T.此释放将唤醒进程2或3.在下一个循环中,进程4将休眠,因为没有R。

到目前为止,我们有:R = 0,S = 0,T = 1

假设T的释放唤醒的进程2,然后将收购回来的T,打印 'BC',会释放回一个T.这释放将唤醒睡眠过程3在接下来的循环中,处理2将睡眠,因为流程3取得的T.

方法3将使用T,将打印一个“d”,会释放一个R. R的这个版本将把第二,第三和第四个进程放到无限循环中。因为R和T永远不会同时被完全获得。

我们无法知道有多少烧烤将被打印出来,但是我们可以说“A”将被打印3次。

+1

非常清楚。非常感谢。 –

+0

不客气。 –