信号量wait()和signal()

Aka*_*uja 8 synchronization operating-system process

我正在进行流程同步,并且在理解信号量方面面临困难.所以这是我的疑问:

消息来源说

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

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

wait(Semaphore S)
{
   while S<=0
     ; //no operation
   S--;
}
Run Code Online (Sandbox Code Playgroud)

signal()的定义

signal(S)
{
   S++;
}
Run Code Online (Sandbox Code Playgroud)

设信号的初始值为1,并说有两个并发进程P0和P1不应同时执行其临界区的操作.

现在说P0处于其关键部分,因此信号量S必须具有值0,现在说P1想要进入其临界区以便执行wait(),并且在wait()中它连续循环,现在从循环中退出信号量值必须递增,但它可能是不可能的,因为根据源,wait()是原子操作并且不能被中断,因此进程P0不能在单个处理器系统中调用signal().

我想知道,到目前为止我的理解是否正确.如果正确,那么当进程P1在循环中被攻击时,进程P0如何调用signal()?

G_k*_*eep 7

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

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

如果多个进程同时尝试 P(S),则仅允许一个进程继续进行(不受竞争条件影响的非抢占式内核)。

为了使上述实现工作,抢占是必要的(抢占式内核)

了解信号量操作的原子性 http://personal.kent.edu/~rmuhamma/OpSystems/Myos/semaphore.htm https://en.wikibooks.org/wiki/Operating_System_Design/Processes/Semaphores


Som*_*ame 6

我认为您的来源不正确。Atomic因为该wait()操作表示每次迭代为atomic,表示S--执行没有中断,但是在每次循环S--内部完成之后,整个操作都可以被中断while