首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >信号量满足有界等待吗?

信号量满足有界等待吗?
EN

Stack Overflow用户
提问于 2010-12-03 11:00:19
回答 1查看 3.1K关注 0票数 7

信号量是满足有界等待,还是它们只是为了提供互斥??

EN

回答 1

Stack Overflow用户

发布于 2011-04-29 23:45:06

答案

从理论上讲,它可能打破有界的等待条件,如下所示。实际上,这在很大程度上取决于使用哪种调度算法。

wait()signal()原语的经典实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//primitive
wait(semaphore* S)
{
    S->value--;
    if (S->value < 0)
    {
        add this process to S->list;
        block();
    }
}

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

当进程调用wait()并失败"if“测试时,它会将自己放到等待列表中。如果多个进程在同一个信号量上被阻塞,它们都会被放到这个列表中(或者像您想象的那样,它们以某种方式链接在一起)。当另一个进程离开关键部分并调用signal()时,等待列表中的一个进程将被选择唤醒,准备再次争夺CPU。然而,是调度程序决定从等待列表中选择哪个进程。例如,如果调度是以LIFO(最后先出)的方式实现的,那么可能会有一些进程被饿死。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T1: thread 1 calls wait(), enters critical section
T2: thread 2 calls wait(), blocked in waiting list
T3: thread 3 calls wait(), blocked in waiting list
T4: thread 1 leaves critical section, calls signal()
T5: scheduler wakes up thread 3
T6: thread 3 enters critical section
T7: thread 4 calls wait(), blocked in waiting list
T8: thread 3 leaves critical section, calls signal()
T9: scheduler wakes up thread 4
..

正如您所看到的,虽然您正确地实现/使用了信号量,但是线程2有一个无限制的等待时间,甚至可能是饥饿,这是由于不断输入新进程造成的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4348908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文