免费注册 查看新帖 |

Chinaunix

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

关于抢占的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-24 12:40 |只看该作者 |倒序浏览
本帖最后由 tomkedy 于 2011-06-24 12:41 编辑

具体如下:

假设时钟中断的间隔为 10ms ,进程A的运行时长为 15ms, 且获得CPU并在 time 0 的时候开始运行。当时间到达 6ms 时,拥有更高优先级的进程B到达就绪态,这时:

==========================================================

------
方案1:
------
进程A马上停止运行并切换至进程B,具体为,假设上下文切换需 1ms ,则进程B会在第 7ms 的时候开始运行。

------
方案2:
------
进程B将只是放在就绪队列的列首,当下一次时钟中断到来时(如:10ms),则调度进程B运行。

==========================================================

按照某资料所说,方案1为“可抢占“的例子,方案2为“非可抢占“的例子。我就有些疑惑,在印象中,是否可抢占跟时钟中断是分不开的。如果没有时钟中断的存在,如何中断当前进程而切换到另一个进程呢?如果 方案1 可行,那系统又是如何检测到进程B比进程A的优先级高呢(进程B就绪可是发生在进程A占用CPU期间的,假设之前进程B可能进行了DMA等I/O操作)?且系统又是如何中断进程A转而切换至进程B呢?

个人感觉 方案2 才是“可抢占“的(实际)例子,不知各位的看法怎样?

论坛徽章:
0
2 [报告]
发表于 2011-06-24 12:42 |只看该作者
回复 1# tomkedy


    顶

论坛徽章:
1
射手座
日期:2013-11-07 09:19:48
3 [报告]
发表于 2011-06-24 17:36 |只看该作者
条件有问题吧,时钟中断的间隔是10ms,那么如果进程A在开始运行后的10ms时间内,CPU除了运行A进程之外在这段时间内什么都不会做,因为系统没有更小的时间粒度了。所以条件中的A进程开始执行后的6ms这个时间点,对这个系统来说是不存在的。

论坛徽章:
1
射手座
日期:2013-11-07 09:19:48
4 [报告]
发表于 2011-06-24 17:40 |只看该作者
当然如果在10ms之内有中断的话,那么抢占会发生在中断处理函数退出的时候。

论坛徽章:
1
射手座
日期:2013-11-07 09:19:48
5 [报告]
发表于 2011-06-24 17:41 |只看该作者
回复 4# guocslock
sorry,这个中断是指除了时钟中断之外的中断。

论坛徽章:
0
6 [报告]
发表于 2011-06-24 20:22 |只看该作者
本帖最后由 tomkedy 于 2011-06-24 20:27 编辑
条件有问题吧,时钟中断的间隔是10ms,那么如果进程A在开始运行后的10ms时间内,CPU除了运行A进程之外在这段时间内什么都不会做,因为系统没有更小的时间粒度了。所以条件中的A进程开始执行后的6ms这个时间点,对这个系统来说是不存在的。
guocslock 发表于 2011-06-24 17:40


没记错的话,DMA除了开始连接之外,都不需要CPU的参与,因此进程B如果之前执行的是DMA操作的话,那它有可能在 time 6ms 的时候执行完DMA操作 而就绪的........

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
7 [报告]
发表于 2011-06-24 23:00 |只看该作者
可抢占时OS可以强行切换进程;协作时,除非进程自愿放弃CPU,不然可以一直执行到底。可抢占时,进程切换契机一般是中断返回时,不一定非是时钟中断。至于具体细节,那就依赖于实现了。最简单的实现:所有中断返回时执行同一段代码,代码扫描所有存在的进程描述符,如果找到比当前进程优先级更高的进程,切换之。

论坛徽章:
0
8 [报告]
发表于 2011-06-29 21:52 |只看该作者
可抢占时OS可以强行切换进程;协作时,除非进程自愿放弃CPU,不然可以一直执行到底。可抢占时,进程切换契机一般是中断返回时,不一定非是时钟中断。至于具体细节,那就依赖于实现了。最简单的实现:所有中断返回时执行同一段代码,代码扫描所有存在的进程描述符,如果找到比当前进程优先级更高的进程,切换之。
tempname2 发表于 2011-06-24 23:00


同意你的说法,但有些问题还是不太清晰,如下:

还是用之前的例子,如果按照你的实现方式(上文里提到的“最简单的实现:所有中断返回时执行同一段代码,代码扫描所有存在的进程描述符,如果找到比当前进程优先级更高的进程,切换之“),那到底是进程A中断返回还是进程B中断返回而导致进程切换呢?似乎都不太现实......

另,我查了一下ULK3,但里面也没有详细说明。

附:在ULK3的第七章里“进程的抢占“这一小节里(260页,中文版),原文为“......Linux的进程是抢占式的。如果进程进入TASK_RUNNING状态,内核检查它的动态优先级是否大于当前正在运行进程的优先级。如果是,current的执行中断,并调用调度程序选择另一个进程运行(通常是刚刚变为可运行的进程)。当然,进程在它的时间片到期时也可以被抢占........”。(ULK3里也没有说明 内核是“如何检测“到进程的动态优先级比current的大(到底谁占CPU且在检查比较优先级?)).............

论坛徽章:
0
9 [报告]
发表于 2011-06-30 11:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2011-06-30 11:45 |只看该作者
关键是如果cpu都不知道B就绪了,那这个“就绪”有什么意义。
换句话说就是什么是就绪,什么时候会就绪
为什么删我贴 发表于 2011-06-30 11:39



说的有道理,但好像还有另外意思,能否说明白一下?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP