首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号量等待()和信号()

信号量等待()和信号()
EN

Stack Overflow用户
提问于 2012-11-23 12:08:04
回答 6查看 83.9K关注 0票数 8

我正在经历过程同步,并且在理解信号量方面面临困难。我对此表示怀疑:

消息人士说

“信号量S是一个整数变量,可通过标准的原子操作(即wait()和signal() )访问。

它还提供了wait()的基本定义。

代码语言:javascript
复制
wait(Semaphore S)
{
   while S<=0
     ; //no operation
   S--;
}

信号()的定义

代码语言:javascript
复制
signal(S)
{
   S++;
}

假设信号量的初始值为1,并且假设存在两个并发进程P0和P1,它们不应该同时执行关键部分的操作。

现在假设P0在它的关键部分,所以信号量S必须有值0,现在假设P1想要进入它的关键部分,因此它执行wait(),并且在wait()中它连续循环,现在从循环中退出信号量值必须增加,但是这可能是不可能的,因为根据源,wait()是一个原子操作,不能被中断,因此进程P0不能在单个处理器系统中调用信号()。

我想知道,到目前为止,我的理解是否正确。如果正确,那么在进程P0循环中构造P1时,如何处理P1调用信号()?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-11-23 13:17:34

我觉得你的消息来源不准确。Atomic用于wait()操作意味着它的每一次迭代都是atomic,这意味着S--是不间断地执行的,但是在while循环中S--每次完成之后,整个操作是可中断的。

票数 5
EN

Stack Overflow用户

发布于 2021-01-13 03:03:58

我认为最高投票的答案是不准确的!

操作wait()和signal()必须是完全原子化的;没有任何两个进程可以同时执行wait()或signal()操作,因为它们是在内核中实现的,并且不能抢占内核模式下的进程。

如果多个进程同时尝试一个P(S),则只允许一个进程继续进行(没有种族条件的非抢占内核)。

要使上面的实现工作,抢占是必要的(抢占内核)

阅读有关信号量操作http://personal.kent.edu/~rmuhamma/OpSystems/Myos/semaphore.htm Design/Processes/Semaphores的原子性的文章

票数 6
EN

Stack Overflow用户

发布于 2014-01-03 03:54:35

我不认为,在wait()操作中保持无限时间循环是明智的。我会支持Stallings的例子;

代码语言:javascript
复制
void semWait(semaphore s){
    s.count--;
    if(s.count<0)
        *place this process in s.queue and block this process
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13528860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档