免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7937 | 回复: 12
打印 上一主题 下一主题

[进程管理] 信号量释放时,等待信号量的进程会立即被唤醒吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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;

论坛徽章:
7
2015年亚洲杯之约旦
日期:2015-03-05 17:03:522015亚冠之山东鲁能
日期:2015-09-29 13:01:2115-16赛季CBA联赛之四川
日期:2016-01-18 15:47:0215-16赛季CBA联赛之广夏
日期:2016-02-24 11:47:1515-16赛季CBA联赛之辽宁
日期:2016-11-01 09:45:4115-16赛季CBA联赛之青岛
日期:2017-02-15 10:02:182016科比退役纪念章
日期:2017-02-16 17:25:35
2 [报告]
发表于 2014-02-25 17:31 |只看该作者
应该是等a执行完了之后吧,a发送信号量给B只是把B执行状态转为可运行状态,只有等到进程调度时才会切到B中。。。。个人理解,欢迎拍砖。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2014-02-26 08:16 |只看该作者
回复 1# Huntsmen
send_signal--->__send_signal--->wake_up_state

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

   

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
4 [报告]
发表于 2014-02-26 09:45 |只看该作者
对于实时系统来说,都是内核可抢占的,所以一般来说,信号量的唤醒必然导致高优先级任务的调度。

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

只是开启内核可抢占的情况下,不管进程处于内核态或是应用态,时间片用完都会被抢占,关闭内核抢占的则是必须返回到应用态的时候才会被抢占。

论坛徽章:
0
5 [报告]
发表于 2014-02-26 09:49 |只看该作者
b如果打算立即被调度,要a手动schedue调度)

论坛徽章:
0
6 [报告]
发表于 2014-02-26 10:49 |只看该作者
回复 4# liuiang
谢谢回复!
还想请教几个问题:
1,假如是关闭内核抢占的,那么是在返回用户态时就被抢占了,还是说返回用户态后也要等时间片用完了才能被抢占?
2,如果是2个内核线程,它们没有用户态,它们之间是如何抢占的呢?
3,内核代码什么地方可以查看系统调度的时间片长度是多少?


   

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
7 [报告]
发表于 2014-02-26 12:04 |只看该作者
从我所能看到的:
1,等时间片,时间片用完触发调度。
2,主动放弃
3,HZ这个宏

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
8 [报告]
发表于 2014-02-26 13:42 |只看该作者
释放信号量后,只是唤醒等待进程,使其进入可运行队列,具体调度时机取决于调度器和是否支持抢占。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [报告]
发表于 2014-02-27 08:43 |只看该作者
回复 1# Huntsmen
取决于send signal是如何实现的。
调度器总是发生在从中断/软中断/系统调用上下文返回内时候(不管返回内核态,还是用户态)。
如果send signal函数是通过系统调用实现的,该函数从系统调用返回时就会触发调度器重新调度。如果send signal函数没有触发主动中断/软中断/系统调用, 那就要等到下一个调度点。

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

   

论坛徽章:
0
10 [报告]
发表于 2014-03-05 00:43 |只看该作者
如果2个进程都是SCHED_FIFO,应该是发送信号量之后,就立即执行等待该信号的进程吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP