value <= 0"signal() 在没有忙等待的信号量中实现-6ren"> value <= 0"signal() 在没有忙等待的信号量中实现-以下是signal()的代码在没有忙等待的信号量中操作(没有忙等待) signal()的实现: signal (semaphore *S) { S->value++; if (S->v-6ren">
gpt4 book ai didi

synchronization - "S->value <= 0"signal() 在没有忙等待的信号量中实现

转载 作者:行者123 更新时间:2023-12-04 06:56:18 24 4
gpt4 key购买 nike

以下是signal()的代码在没有忙等待的信号量中操作(没有忙等待)
signal()的实现:

signal (semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P);
}
}

我有一个关于“if-condition”的问题。

我认为,事实是 S->value为零或负数表示没有可用资源,所以 wakeup()不应该被允许。
但正如你所见,每当 signal()调用操作时,无论 S->value 的状态如何,都会唤醒一个进程(在等待列表中)。 .

所以在我看来,
不平等的标志 S->value >= 0是自然而有意义的,因为 S->value > 0表示有可用资源。

有没有人可以用简单的英语向我解释?

最佳答案

您在这里混淆了信号量的队列和就绪队列。
这个解是为了满足有界等待条件。

当进程必须等待信号量 S 时,它会被阻塞并放入信号量的队列中。
信号()从队列中删除一个进程并将其移动到就绪队列。
因为 signal() 总是从刚刚完成其临界区的进程中调用。所以会有一个新进程添加到就绪队列中。

如果在信号量的值为正数时将进程添加到就绪队列中,则没有意义,因为您可以在那时和那里直接使用信号量,而无需加入就绪队列。

    signal (semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P); //move one process P from S->list to ready list
}
}

负值表示等待的进程数。
希望这可以帮助。

关于synchronization - "S->value <= 0"signal() 在没有忙等待的信号量中实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30838223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com