我正在阅读“理解Linux内核,第3版”,并在第5章“内核抢占”一节中说:
所有进程切换都由
switch_to
宏执行。在先发制人 和非抢占式内核,进程完成后会发生进程切换 调用一些内核活动线程和调度程序。但是,在非抢占式内核中,除非切换,否则无法替换当前进程 到用户模式。
我仍然没有看到非抢占式内核和抢先式内核之间的区别,因为您需要等待当前进程切换到用户模式的任何方式。
假设有一个进程 p 在内核模式下运行,其时间段到期,然后调用scheduler_tick()
,并设置NEED_RESCHED标志> p 的。
但只有在 p 切换到用户模式时才会调用schedule()
(对吗?)。
那么如果 p 永远不会切换到用户模式呢?
如果它切换到用户模式,但在scheduler_tick()
设置NEED_RESCHED
和 p 实际切换到用户模式的那一刻之间需要“很长”时间 - 那么它使用的不仅仅是量子?
答案 0 :(得分:1)
在非抢占式内核中,在返回用户空间时(以及系统调用阻塞的任何地方,也在空闲任务上)调用schedule()
。
在抢占式内核中,从任何中断返回时也会调用schedule()
,并且在其他一些地方也会调用mutex_unlock()
,例如在 process A userspace → process A kernelspace → device ISR → timer ISR
syscall device IRQ timer IRQ
慢速路径上,在接收网络数据包的某些条件下,......
作为一个例子,假设一个进程A发出一个被设备生成的中断中断的系统调用,然后由一个定时器中断中断:
{{1}}
当计时器ISR结束时,它返回另一个ISR,然后返回到内核空间,然后返回到用户空间。抢占式内核会检查是否需要在每次返回时重新安排进程。非抢占式内核仅在返回用户空间时进行检查。
答案 1 :(得分:-1)
有两种方法可以切换流程:
第一个发生在进程执行某些不允许它继续的操作时。例如,执行SLEEP类型的功能或执行I / O(例如,到磁盘或终端,并且必须等待用户响应)。
第二种情况发生在操作系统的内部定时器熄灭时,作为处理定时器中断的一部分,操作系统确定应该运行另一个进程。
仅处理第一类上下文切换的内核是非抢占式的。处理这两种类型的上下文切换的内核是抢占式的。
请注意,屈服需要执行系统服务。这需要触发异常来调用内核模式系统服务处理程序。
抢占需要中断。在大多数非英特尔系统中,异常和中断以相同的方式处理(英特尔提供多种方式来执行异常)。在大多数系统中,从中断和异常返回的过程是相同的。
两种情况下的上下文切换都发生在进程返回用户模式之前。当进程恢复执行时,首先要做的是从内核模式返回到用户模式。
但是,在非抢占式内核中,除非要切换到用户模式,否则无法替换当前进程。
这是一个定性陈述。正常的产量顺序是:
这本书的陈述是#7和#8之间没有或很少发生。这通常是正确的,但完全有可能系统服务可以在那里投入更多的工作。它没有正常发生。