Chinaunix

标题: 信号量释放时,等待信号量的进程会立即被唤醒吗? [打印本页]

作者: Huntsmen    时间: 2014-02-25 16:06
标题: 信号量释放时,等待信号量的进程会立即被唤醒吗?
本帖最后由 Huntsmen 于 2014-02-25 16:13 编辑

假设是UP系统,有2个进程A和B,B的优先级比A的高,但是B因为在等待信号量,所以处于pending状态,进程A有机会执行;

当进程A发送B正在等待的信号量时,B是会被立即唤醒执行,还是需要等A的时间片用完了才可以有机会调度B?

即下面的例子,当进程A发送了信号量之后,是会接着执行operation A-2呢 ?还是先执行operation B-2?

进程A:
……
operation A-1;
发送信号量;
operation A-2;
……


进程B:
……
operation B-1;
等待信号量;
operation B-2;
……

这个是不是要分内核是可抢占和非抢占的,
对于可抢占的,发送信号量之后,就会有一个调度点,所以进程B被唤醒,然后先执行operation B-2;
对于非可抢占的,发送信号量之后,内核只是标记进程B为就绪态,只有等进程A的时间片用完,或者主动释放cpu之后,进程b才能执行;所以这里是先执行operation A-2;
作者: linggang_123    时间: 2014-02-25 17:31
应该是等a执行完了之后吧,a发送信号量给B只是把B执行状态转为可运行状态,只有等到进程调度时才会切到B中。。。。个人理解,欢迎拍砖。
作者: 瀚海书香    时间: 2014-02-26 08:16
回复 1# Huntsmen
send_signal--->__send_signal--->wake_up_state

从这个流程来看,发送完信号后,只是将目标进程放到可调度队列,并不会马上调度目标进程。

   
作者: liuiang    时间: 2014-02-26 09:45
对于实时系统来说,都是内核可抢占的,所以一般来说,信号量的唤醒必然导致高优先级任务的调度。

对于非实时系统来说,不管是否开启内核抢占,都不能保证这一点。

只是开启内核可抢占的情况下,不管进程处于内核态或是应用态,时间片用完都会被抢占,关闭内核抢占的则是必须返回到应用态的时候才会被抢占。
作者: kkddkkdd11    时间: 2014-02-26 09:49
b如果打算立即被调度,要a手动schedue调度)
作者: Huntsmen    时间: 2014-02-26 10:49
回复 4# liuiang
谢谢回复!
还想请教几个问题:
1,假如是关闭内核抢占的,那么是在返回用户态时就被抢占了,还是说返回用户态后也要等时间片用完了才能被抢占?
2,如果是2个内核线程,它们没有用户态,它们之间是如何抢占的呢?
3,内核代码什么地方可以查看系统调度的时间片长度是多少?


   
作者: liuiang    时间: 2014-02-26 12:04
从我所能看到的:
1,等时间片,时间片用完触发调度。
2,主动放弃
3,HZ这个宏
作者: humjb_1983    时间: 2014-02-26 13:42
释放信号量后,只是唤醒等待进程,使其进入可运行队列,具体调度时机取决于调度器和是否支持抢占。
作者: linuxfellow    时间: 2014-02-27 08:43
回复 1# Huntsmen
取决于send signal是如何实现的。
调度器总是发生在从中断/软中断/系统调用上下文返回内时候(不管返回内核态,还是用户态)。
如果send signal函数是通过系统调用实现的,该函数从系统调用返回时就会触发调度器重新调度。如果send signal函数没有触发主动中断/软中断/系统调用, 那就要等到下一个调度点。

曾经开发过一个powerpc下的实时操作系统,为了保证实时性,所有可能改变进程优先级的事件都同过系统调用实现:
event_post/event_pend/semphore_post/semaphore_pend 等等, 实现这些函数时, 要调用powerpc 的"sc"指令进入系统上下文,这些功能在系统上下文执行。从系统上下文返回任务上下文时,调度器就会被触发,引起进程切换。基本上这个函数一返回任务切换就发生, 保证实时性。

   
作者: Huntsmen    时间: 2014-03-05 00:43
如果2个进程都是SCHED_FIFO,应该是发送信号量之后,就立即执行等待该信号的进程吧
作者: humjb_1983    时间: 2014-03-05 09:07
你说的“信号量”,有歧义,不知是信号量还是信号。
是否立刻调度B执行,取决于是否有调度时机。
作者: Huntsmen    时间: 2014-03-05 20:42
回复 11# humjb_1983

就以Linux系统,互斥锁mutex或者semaphore为例吧,A和B都是SCHED_FIFO的实时任务,B优先级比A的高,B在等待mutex/sem,当A释放这个资源的时候,B应该立即激活不?

   
作者: humjb_1983    时间: 2014-03-06 08:34
Huntsmen 发表于 2014-03-05 20:42
回复 11# humjb_1983

就以Linux系统,互斥锁mutex或者semaphore为例吧,A和B都是SCHED_FIFO的实时任务, ...

如之前所说,取决于在释放信号量时是否有调度时机,具体代码没看~~,理论上如果释放信号量时,有wakeup等待进程的操作,那么在wakeup时会有调度时机,但还取决于内核抢占的配置,如果开了内核抢占,那么此时会进行调度,如果没有,如果当前处于内核态的话,还是不能调度~~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2