在进入操作系统的临界区之前处理多个等待操作?
Handling Multiple wait operation before entering into critical section in operating system?
我在解决操作系统主题中的计数信号量问题时卡住了。
S is a semaphore initialized to 5.
count = 0 (shared variable)
Assume that the increment operation in line #7 is not atomic.
现在,
1. int counter = 0;
2. Semaphore S = init(5);
3. void parop(void)
4. {
5. wait(S);
6. wait(S);
7. counter++;
8. signal(S);
9. signal(S);
10. }
如果五个线程并发执行函数parop,下面哪个程序行为is/are可能?
A.所有线程成功执行完parop后counter的值为5
B.所有线程成功执行完parop后counter的值为1
C.所有线程成功执行完parop后counter的值为0
D.所有线程都死锁了
到目前为止我的理解是答案是 A 和 D,因为如果所有过程都一一执行怎么办(T1->T2->T3->T4 ->T5) 最终保存的值为 5(所以 A 是正确的选项之一)
现在,为什么是 D,因为如果所有进程在第 6 行之前执行第 5 行并且会被阻塞怎么办。
现在,请任何人帮助我理解为什么 B 是另一个正确答案。 ?
提前致谢,
希望你尽快来这里
任何帮助将不胜感激。
假设 thread 1
在任何其他线程之前到达第 7 行,并且第 7 行被实现为三个指令:
7_1: load counter, %r0
7_2: add , %r0
7_3: store %r0, counter
由于某种原因(例如中断、被抢占),thread 1
在指令 7_2
处停止;所以它将值 0 加载到寄存器 %r0
.
接下来,thread's 2..5
所有 运行 通过这个序列,将计数器留在说 4
。
Thread 1
被重新安排,将 %r0
递增到值 1
并将其存储到 counter
.
我在解决操作系统主题中的计数信号量问题时卡住了。
S is a semaphore initialized to 5.
count = 0 (shared variable)
Assume that the increment operation in line #7 is not atomic.
现在,
1. int counter = 0;
2. Semaphore S = init(5);
3. void parop(void)
4. {
5. wait(S);
6. wait(S);
7. counter++;
8. signal(S);
9. signal(S);
10. }
如果五个线程并发执行函数parop,下面哪个程序行为is/are可能?
A.所有线程成功执行完parop后counter的值为5
B.所有线程成功执行完parop后counter的值为1
C.所有线程成功执行完parop后counter的值为0
D.所有线程都死锁了
到目前为止我的理解是答案是 A 和 D,因为如果所有过程都一一执行怎么办(T1->T2->T3->T4 ->T5) 最终保存的值为 5(所以 A 是正确的选项之一) 现在,为什么是 D,因为如果所有进程在第 6 行之前执行第 5 行并且会被阻塞怎么办。
现在,请任何人帮助我理解为什么 B 是另一个正确答案。 ?
提前致谢,
希望你尽快来这里
任何帮助将不胜感激。
假设 thread 1
在任何其他线程之前到达第 7 行,并且第 7 行被实现为三个指令:
7_1: load counter, %r0
7_2: add , %r0
7_3: store %r0, counter
由于某种原因(例如中断、被抢占),thread 1
在指令 7_2
处停止;所以它将值 0 加载到寄存器 %r0
.
接下来,thread's 2..5
所有 运行 通过这个序列,将计数器留在说 4
。
Thread 1
被重新安排,将 %r0
递增到值 1
并将其存储到 counter
.