Bum*_*Cho 5 synchronization signals semaphore
以下是signal()无忙等待(无忙等待)信号量中的操作代码
实施signal():
signal (semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个关于“if-condition”的问题。
我认为,S->value零或负的事实意味着没有可用资源,所以wakeup()不应该被允许。但是正如您所看到的,无论何时signal()调用操作,无论S->value.
所以在我看来,不平等的迹象S->value >= 0是自然的,也是有道理的,因为S->value > 0意味着有可用的资源。
有人可以用简单的英语向我解释吗?
你在这里混淆了信号量的队列和就绪队列。\n这个解决方案是满足有界等待条件。
\n\n当一个进程必须等待信号量 S 时,它会被阻塞并放入信号量\xe2\x80\x99s 队列中。\nsignal() 从队列中删除一个进程并将其移至就绪队列。\n因为 signal() 始终是从刚刚完成其关键部分的进程调用。这样就会有一个新的进程添加到就绪队列中。
\n\n如果当信号量的值为正数时将进程添加到就绪队列中,则没有意义,因为您可以直接使用信号量,而无需加入就绪队列。
\n\n signal (semaphore *S) {\n S->value++; \n if (S->value <= 0) { \n remove a process P from S->list; \n wakeup(P); //move one process P from S->list to ready list\n } \n }\nRun Code Online (Sandbox Code Playgroud)\n\n负值表示有多个进程正在等待。\n希望这有帮助。
\n| 归档时间: |
|
| 查看次数: |
2457 次 |
| 最近记录: |