非抢占式、抢占式和选择性抢占式内核有什么区别?

非抢占式、抢占式和选择性抢占式内核有什么区别?

“非抢占式”、“抢占式”和“选择性抢占式”内核之间有什么区别?

希望有人能对此有所启发。

答案1

在抢占式内核上,在内核模式下运行的进程可以在内核函数执行过程中被另一个进程替换。

这仅适用于在内核模式下运行的进程,在用户模式下执行进程的 CPU 被视为“空闲”。如果用户模式进程想要向内核请求服务,他必须发出内核可以处理的异常。

举个例子:

进程A执行异常处理程序,进程B被 IRQ 请求唤醒,内核AB(强制进程切换)替换进程。过程A尚未完成。调度程序随后决定进程是否A获得 CPU 时间。

在非抢占式内核上,进程A将使用所有处理器时间,直到完成或自愿决定允许其他进程中断他(计划的进程切换)。

当今基于Linux的操作系统通常不包括完全抢占式的内核,仍然有一些关键功能必须不间断地运行。所以我认为你可以称之为“选择性抢占内核”。

除此之外,还有一些方法可以使 Linux 内核(几乎)完全抢占。

答案2

抢占是 -> 操作系统抢占或停止当前计划任务以支持更高优先级任务的能力。调度可以是但不限于进程或I/O调度等之一。

在 Linux 下,用户空间程序始终是可抢占的:内核使用常规时钟滴答中断用户空间程序以切换到其他线程。因此,内核不会等待用户空间程序显式释放处理器(协作多任务处理就是这种情况)。这意味着用户空间程序中的无限循环不会阻塞系统。

然而,在 2.6 内核之前,内核本身并不是可抢占的:一旦一个线程进入内核,它就不能被抢占来执行其他线程。然而,内核中缺乏抢占导致了延迟和可扩展性方面的一些问题。因此,内核抢占已在 2.6 内核中引入,并且可以使用 CONFIG_PREEMPT 选项启用或禁用它。如果启用 CONFIG_PREEMPT,则内核代码可以在任何地方被抢占,除非代码已禁用本地中断。代码中的无限循环不能再阻塞整个系统。如果 CONFIG_PREEMPT 被禁用,则恢复 2.4 行为。

重新引用并格式化自: http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/

答案3

抢占式内核允许进程在内核模式下运行时被抢占。非抢占式内核不允许运行在内核模式下的进程被抢占;内核模式进程将一直运行,直到退出内核模式、阻塞或自愿放弃对 CPU 的控制。显然,非抢占式内核本质上不受内核数据结构上的竞争条件的影响,因为内核中一次只有一个进程处于活动状态。我们不能对抢占式内核说同样的话,因此必须仔细设计它们,以确保共享内核数据不受竞争条件的影响。针对 SMP 架构设计抢占式内核尤其困难,因为在这些环境中,两个内核模式进程可能同时在不同的处理器上运行。抢占式内核更适合实时编程,因为它允许实时进程抢占当前在内核中运行的进程。此外,抢占式内核的响应速度可能更快,因为内核模式进程在将处理器让给等待进程之前运行任意长一段时间的风险较小。当然,可以通过设计不以这种方式运行的内核代码来最小化这种影响。在本章后面,我们将探讨各种操作系统如何管理内核中的抢占。

相关内容