我正在经历过程同步,并且在理解信号量方面面临困难。我对此表示怀疑:
消息人士说
“信号量S是一个整数变量,可通过标准的原子操作(即wait()和signal() )访问。
它还提供了wait()的基本定义。
wait(Semaphore S)
{
while S<=0
; //no operation
S--;
}信号()的定义
signal(S)
{
S++;
}假设信号量的初始值为1,并且假设存在两个并发进程P0和P1,它们不应该同时执行关键部分的操作。
现在假设P0在它的关键部分,所以信号量S必须有值0,现在假设P1想要进入它的关键部分,因此它执行wait(),并且在wait()中它连续循环,现在从循环中退出信号量值必须增加,但是这可能是不可能的,因为根据源,wait()是一个原子操作,不能被中断,因此进程P0不能在单个处理器系统中调用信号()。
我想知道,到目前为止,我的理解是否正确。如果正确,那么在进程P0循环中构造P1时,如何处理P1调用信号()?
发布于 2012-11-23 13:17:34
我觉得你的消息来源不准确。Atomic用于wait()操作意味着它的每一次迭代都是atomic,这意味着S--是不间断地执行的,但是在while循环中S--每次完成之后,整个操作是可中断的。
发布于 2021-01-13 03:03:58
我认为最高投票的答案是不准确的!
操作wait()和signal()必须是完全原子化的;没有任何两个进程可以同时执行wait()或signal()操作,因为它们是在内核中实现的,并且不能抢占内核模式下的进程。
如果多个进程同时尝试一个P(S),则只允许一个进程继续进行(没有种族条件的非抢占内核)。
要使上面的实现工作,抢占是必要的(抢占内核)
阅读有关信号量操作http://personal.kent.edu/~rmuhamma/OpSystems/Myos/semaphore.htm Design/Processes/Semaphores的原子性的文章
发布于 2014-01-03 03:54:35
我不认为,在wait()操作中保持无限时间循环是明智的。我会支持Stallings的例子;
void semWait(semaphore s){
s.count--;
if(s.count<0)
*place this process in s.queue and block this process
}https://stackoverflow.com/questions/13528860
复制相似问题