理解关于信号量的考试答案
Understanding an exam answer on Semaphores
这个问题是在模拟考试中出现的。我真的不明白他们是怎么得到他们说正确的答案的。
我希望得到一些帮助来理解这个问题以及如何回答它?
谢谢!
我想这一切都是这样的:
wait(P):如果semaphore变量的值不为负,则减1。如果semaphore变量现在为负,执行wait的进程被阻塞(即,添加到信号量的队列中)直到值大于或等于 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)由于(1)中A先于F执行,而F总是先于G执行,所以A总是先于G执行。
关于错误答案:
a)A先于E执行?也许,但并非总是如此。因为线程 1 和线程 2 必须等待一个信号量,线程 2 可以比 A 更快地执行 B、V(T) 和 E,所以在这种情况下句子 (a) 为假。
b) B先于F执行?也许,但并非总是如此。为什么?线程3要执行F,只依赖于线程1(信号量S),所以C和A可以执行的很快,然后转到F,而B可以继续执行,因为它很慢。
d) C先于D执行?也许,但并非总是如此。同样,C 可能需要很长时间才能执行,而线程 1,因为它不必等待任何信号量,可以在 C 完成之前非常快地执行它的所有指令。
这个问题是在模拟考试中出现的。我真的不明白他们是怎么得到他们说正确的答案的。
我希望得到一些帮助来理解这个问题以及如何回答它?
谢谢!
我想这一切都是这样的:
wait(P):如果semaphore变量的值不为负,则减1。如果semaphore变量现在为负,执行wait的进程被阻塞(即,添加到信号量的队列中)直到值大于或等于 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)由于(1)中A先于F执行,而F总是先于G执行,所以A总是先于G执行。
关于错误答案:
a)A先于E执行?也许,但并非总是如此。因为线程 1 和线程 2 必须等待一个信号量,线程 2 可以比 A 更快地执行 B、V(T) 和 E,所以在这种情况下句子 (a) 为假。
b) B先于F执行?也许,但并非总是如此。为什么?线程3要执行F,只依赖于线程1(信号量S),所以C和A可以执行的很快,然后转到F,而B可以继续执行,因为它很慢。
d) C先于D执行?也许,但并非总是如此。同样,C 可能需要很长时间才能执行,而线程 1,因为它不必等待任何信号量,可以在 C 完成之前非常快地执行它的所有指令。