答案 0 :(得分:1)
我认为一切都是这样的:
wait(P):如果信号量变量的值不是负数,则将其递减1. 如果信号量变量现在为负数,则执行等待的进程被阻止(即添加到信号量的队列)直到值大于或等于1.否则,进程继续执行,使用了资源的单位。
正确答案:
1)由于信号量最初等于0,因此线程3将在P(S)上阻塞,等待另一个线程执行V(S)。这只会在线程1上发生,并在A完成后发生。因此,无论语句A执行多长时间,线程3都将等待直到执行指令V(S)。所以A总是在F之前执行。
2)相同的概念适用于B和G.在G之前,你必须执行P(T),这将等待指令V(T)。这只发生在B执行之后。
3)由于A在F之前执行,如(1)所示,并且F总是在G之前执行,所以A总是在G之前执行。
至于错误答案:
a) A在E之前执行?也许,但并非总是如此。因为线程1和线程2必须等待信号量,所以线程2可以比A快地执行B,V(T)和E,所以在这种情况下句子(a)是假的。
b) B在F之前执行?也许,但并非总是如此。为什么?为了执行F,线程3仅依赖于线程1(信号量S),因此C和A可以非常快地执行,然后转到F而B仍然可以执行,因为它非常慢。
d) C在D之前执行?也许,但并非总是如此。同样,C可能需要很长时间才能执行并且线程1,因为它不必等待任何信号量,可以在C完成之前非常快地执行所有指令。