Man*_*ini 5 linux operating-system kernel linux-kernel preemption
我正在阅读“了解 Linux 内核,第 3 版”,在第 5 章“内核抢占”部分,它说:
所有进程切换都由
switch_to宏执行。在抢占式和非抢占式内核中,当进程完成内核活动的某个线程并调用调度程序时,会发生进程切换。但是,在非抢占式内核中,除非即将切换到用户模式,否则无法替换当前进程。
我仍然没有看到非抢占式内核和抢占式内核之间的区别,因为无论如何您都需要等待当前进程切换到用户模式。
假设有一个进程p在内核模式下运行,并且其时间片到期,然后scheduler_tick()调用 ,并设置p的NEED_RESCHED标志。但是只有在p切换到用户模式时才会调用(对吧?)。schedule()
那么如果p永远不会切换到用户模式呢?
如果它切换到用户模式,但在scheduler_tick()设置NEED_RESCHED的时刻和p实际切换到用户模式的时刻之间需要“很长”的时间——那么它使用的比它的量子还多?
在非抢占式内核中,schedule()在返回用户空间时调用(以及系统调用阻塞的任何地方,也在空闲任务上)。
在抢占式内核中,schedule()在从任何中断返回时以及在其他一些地方(例如在mutex_unlock()慢速路径上、在接收网络数据包时的某些条件下)也会被调用,...
举个例子,假设进程 A 发出一个系统调用,该系统调用被设备生成的中断中断,然后又被定时器中断中断:
\n\n process A userspace \xe2\x86\x92 process A kernelspace \xe2\x86\x92 device ISR \xe2\x86\x92 timer ISR\n syscall device IRQ timer IRQ\nRun Code Online (Sandbox Code Playgroud)\n\n当定时器ISR结束时,它返回到另一个ISR,然后该ISR返回到内核空间,然后内核空间返回到用户空间。抢占式内核会在每次返回时检查是否需要重新调度进程。非抢占式内核仅在返回用户空间时进行该检查。
\n