我是OS课程的新手,我正在研究OS中的同步技术。我遇到了信号量,发现两个操作wait()和signal()为:
wait(S)
{
while( S <= 0)
{
;
}
S--;
}
signal(S)
{
S++;
}
好的,我可以理解忙于等待以下实现的问题,因此新定义如下:
typedef struct
{
int value;
struct process *list;
}semaphore;
wait(semaphore *S)
{
S->value--;
if(S->value <= 0)
{
add this process in S->list;
block();
}
}
signal(semaphore *S)
{
S->value++;
if(S->value <= 0)
{
remove a process P from S->list;
wakeup(P);
}
}
现在,我读到“我们没有删除繁忙的等待,而是将它从入门级代码转移到关键部分。”
现在有人可以告诉我为什么忙着等待新的定义,我想我们正在把进程放在等待名单中,所以不应该忙着等待?
答案 0 :(得分:0)
您的代码中没有繁忙的等待。
但是,要使用上述wait()
和signal()
方法,您必须为S-->value++;
方法wait()
中的操作s->values--;
进行进一步开发。在signal()
方法中访问共享变量S
,因此它成为一个关键部分问题。这引发了解决此关键部分问题的繁忙等待。