我正在阅读“理解Linux内核,第3版”,在第5章“内核抢占”一节中,它说:

All process switches are performed by the switch_to macro. In both preemptive
and nonpreemptive kernels, a process switch occurs when a process has finished
some thread of kernel activity and the scheduler is invoked. However, in nonpreemptive kernels, the current process cannot be replaced unless it is about to **switch
to User Mode**.

我仍然没有看到非抢占式内核和抢占式内核之间的区别,因为您需要等待当前进程切换到用户模式的任何方式.

假设有一个进程p在内核模式下运行,并且其时间量到期,则调用scheduler_tick(),并设置p的NEED_RESCHED标志.
但是只有当p切换到用户模式时才调用schedule()(对吗?).

那么如果p永远不会切换到用户模式怎么办?


如果它切换到用户模式但是在设置NEED_RESCHED的时刻和实际切换到用户模式的时刻p之间需要“很长”的时间 – 那么它使用的不仅仅是它的量子?

解决方法:

在非抢占式内核中,在返回用户空间时(以及系统调用阻塞的任何地方,也在空闲任务上)调用schedule().

在抢占式内核中,schedule()也可以在从任何中断返回时调用,也可以在其他一些地方调用,例如: on mutex_unlock()慢速路径,在接收网络数据包的某些条件下,…

例如,假设一个进程A发出一个由设备生成的中断中断的系统调用,然后由一个定时器中断中断:

 process A userspace → process A kernelspace → device ISR → timer ISR
                  syscall               device IRQ    timer IRQ

当计时器ISR结束时,它返回到另一个ISR,然后返回到内核空间,然后返回到用户空间.抢占式内核会检查是否需要在每次返回时重新安排进程.非抢占式内核仅在返回用户空间时进行检查.

标签: linux, kernel, operating-system, linux-kernel, preemption

相关文章推荐

添加新评论,含*的栏目为必填