【发布时间】:2017-03-05 09:49:48
【问题描述】:
我正在阅读“了解 Linux 内核,第 3 版”,在第 5 章“内核抢占”一节中,它说:
所有进程切换都由
switch_to宏执行。在双方抢先 和非抢占式内核,进程切换发生在进程完成时 一些内核活动线程和调度程序被调用。但是,在非抢占式内核中,当前进程不能被替换,除非它即将切换 到用户模式。
我仍然看不出非抢占式内核和抢占式内核之间的区别,因为您需要等待当前进程切换到用户模式。
假设有一个进程p在内核模式下运行,并且其时间片到期,则调用scheduler_tick(),并设置p的NEED_RESCHED标志时间>。
但是schedule() 仅在 p 切换到用户模式时调用(对吗?)。
如果 p 永远不会切换到用户模式怎么办?
如果它切换到用户模式,但在 scheduler_tick() 设置 NEED_RESCHED 和 p 实际切换到用户模式之间需要“很长时间” - 那么它使用的时间超过它的量子?
【问题讨论】:
-
当你说“从不切换到用户模式”时,你是怎么想的?一个进程不太可能在内核模式下运行很长时间,要么被阻塞,要么处于等待状态,要么运行时间很短(或者内核设计不当)。
-
"但 schedule() 仅在 p 切换到用户模式时调用(对吗?)。 , 没有错。这就是重点,在内核中执行的进程不仅可以在返回用户空间时被抢占。
-
@nos 但它只是设置了一个标志,不调用 schedule()
-
@ManoMini 有很多地方检查了该标志。
-
@nos "当前进程无法被替换,除非它即将切换到用户模式"
标签: linux linux-kernel operating-system kernel preemption