切换到用户模式时,非抢占式内核和抢占式内核之间有什么区别?

时间:2016-10-23 15:15:24

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

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

  

所有进程切换都由switch_to宏执行。在先发制人   和非抢占式内核,进程完成后会发生进程切换   调用一些内核活动线程和调度程序。但是,在非抢占式内核中,除非切换,否则无法替换当前进程   到用户模式

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

假设有一个进程 p 在内核模式下运行,其时间段到期,然后调用scheduler_tick(),并设置NEED_RESCHED标志> p 的。 但只有在 p 切换到用户模式时才会调用schedule()(对吗?)。

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

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

2 个答案:

答案 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)

有两种方法可以切换流程:

  1. 该过程产生CPU;或
  2. 操作系统对流程说“你现在已经完成了。"
  3. 第一个发生在进程执行某些不允许它继续的操作时。例如,执行SLEEP类型的功能或执行I / O(例如,到磁盘或终端,并且必须等待用户响应)。

    第二种情况发生在操作系统的内部定时器熄灭时,作为处理定时器中断的一部分,操作系统确定应该运行另一个进程。

    仅处理第一类上下文切换的内核是非抢占式的。处理这两种类型的上下文切换的内核是抢占式的。

    请注意,屈服需要执行系统服务。这需要触发异常来调用内核模式系统服务处理程序。

    抢占需要中断。在大多数非英特尔系统中,异常和中断以相同的方式处理(英特尔提供多种方式来执行异常)。在大多数系统中,从中断和异常返回的过程是相同的。

    两种情况下的上下文切换都发生在进程返回用户模式之前。当进程恢复执行时,首先要做的是从内核模式返回到用户模式。

      

    但是,在非抢占式内核中,除非要切换到用户模式,否则无法替换当前进程。

    这是一个定性陈述。正常的产量顺序是:

    1. 触发异常
    2. 进入内核模式
    3. 发送给系统服务处理程序
    4. 做事
    5. 告诉O / S屈服。 上下文切换
    6. 告诉O / S进程可以再次运行,会发生一些事件。
    7. OS以内核模式恢复进程。
    8. 进程退出内核模式
    9. 进程以用户模式快捷方式恢复。
    10. 这本书的陈述是#7和#8之间没有或很少发生。这通常是正确的,但完全有可能系统服务可以在那里投入更多的工作。它没有正常发生。