首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux调度器

linux调度器
EN

Stack Overflow用户
提问于 2013-01-10 14:56:19
回答 1查看 438关注 0票数 3

在我的内核配置中,没有设置CONFIG_PREEMPT。由于中断处理程序中不允许使用schedule(),因此如何在linux内核中实现轮询类型的调度。即谁如此频繁地调用调度器。在entry_32.S中,只有在设置了CONFIG_PREEMPT的情况下才会调用preempt_schedule_irq。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-10 15:04:52

CPU上的计时器被设置为每隔一段时间就中断内核。但是我们不能仅仅从中断上下文调用调度,对吗?所以内核所做的是一个巧妙的把戏。它在执行处理程序时更改当前正在执行的任务,然后返回。这有效地将上下文从处理程序的底层切换出来,以便处理程序完成,但同时,要运行的下一个上下文现在是将执行的下一个任务。读一读do_context_switch (我认为它就是这么叫的),你会看到它从当前执行的底层切换它的堆栈和上下文,并在另一个上下文中恢复相同的函数。

并且CONFIG_PREEMPT仅适用于内核上下文中的内核代码抢占。用户空间任务将始终被抢占。这意味着任何开始执行的内核代码都会一直运行到完成(除非您自己调用schedule()或阻塞等待I/O,等等)。通常,内核可以抢占,只要它不持有任何锁,除非在某些情况下,获取锁可以使线程进入休眠状态。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14252377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档