为什么在此代码中没有删除忙等待?

时间:2014-03-18 16:34:35

标签: operating-system

我是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);
    }
}

现在,我读到“我们没有删除繁忙的等待,而是将它从入门级代码转移到关键部分。”

现在有人可以告诉我为什么忙着等待新的定义,我想我们正在把进程放在等待名单中,所以不应该忙着等待?

1 个答案:

答案 0 :(得分:0)

您的代码中没有繁忙的等待。

但是,要使用上述wait()signal()方法,您必须为S-->value++;方法wait()中的操作s->values--;进行进一步开发。在signal()方法中访问共享变量S,因此它成为一个关键部分问题。这引发了解决此关键部分问题的繁忙等待。