Answers:
在抢占式内核上,以内核模式运行的进程可以在内核功能中间被另一个进程替换。
这仅适用于以内核模式运行的进程,在用户模式下执行进程的CPU被视为“空闲”。如果用户模式进程想要从内核请求服务,则他必须发出内核可以处理的异常。
举个例子:
进程A
执行异常处理程序,进程B
被IRQ请求唤醒,内核将其替换A
为B
(强制进程切换)。流程A
未完成。调度程序随后确定进程是否A
获得CPU时间。
在非抢占式内核上,进程A
将只用完所有处理器时间,直到他完成操作或自愿决定允许其他进程打扰他(计划中的进程切换)。
当今基于Linux的操作系统通常不包含完全抢占式内核,仍然有一些关键功能必须不间断地运行。因此,我认为您可以将其称为“选择性抢先内核”。
除此之外,还有一些使Linux内核(几乎)完全抢占的方法。
抢占是->操作系统抢占或停止当前计划的任务以支持更高优先级的任务的能力。调度可以是但不限于进程或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/
抢占式内核允许进程在内核模式下运行时被抢占。非抢占式内核不允许抢占以内核模式运行的进程。内核模式进程将一直运行,直到退出内核模式,阻塞或自愿放弃对CPU的控制为止。显然,非抢占式内核基本上没有内核数据结构上的竞争条件,因为一次仅一个进程在内核中处于活动状态。关于抢占式内核,我们不能说相同的话,因此必须仔细设计它们,以确保共享的内核数据不受争用条件的影响。对于SMP架构,抢占式内核特别难以设计,因为在这些环境中,两个内核模式进程可能同时在不同处理器上运行。抢占式内核更适合实时编程,因为它将允许实时进程抢占内核中当前正在运行的进程。此外,抢占式内核可能具有更高的响应能力,因为在将处理器释放给等待的进程之前,内核模式进程运行任意长时间的风险较小。当然,可以通过设计不以这种方式运行的内核代码来最小化这种影响。在本章的后面,我们将探讨各种操作系统如何管理内核中的抢占。通过设计不以这种方式运行的内核代码,可以将这种影响最小化。在本章的后面,我们将探讨各种操作系统如何管理内核中的抢占。通过设计不以这种方式运行的内核代码,可以将这种影响最小化。在本章的后面,我们将探讨各种操作系统如何管理内核中的抢占。