抢占式内核仅意味着没有大内核锁。
从一开始,Linux就具有抢占式多任务处理(即用户代码是抢占式的)(据我所知,Linus上载到funet ftp服务器上的第一个Linux 0.0.1早已是抢先式多任务处理)。例如,如果执行了多个压缩或编译过程,则它们从第一刻起便并行执行。
与当时-广泛使用的Win31相反。在Win31上,如果任务是从“内核”获得CPU的,则默认情况下,它有责任确定何时将控制权交还给OS(或其他任务)。如果某个进程对此功能没有特殊支持(需要额外的编程工作),则在执行该功能时,所有其他任务都将被挂起。甚至集成到Win31中的大多数基本应用程序都可以正常工作。
抢占式多任务处理意味着任务无法根据需要分配CPU。相反,如果它们的时隙到期,则内核会将CPU移开。因此,在抢占式操作系统中,编写错误或运行不正常的进程不能冻结OS,也不能避免其他进程运行。Linux总是抢占用户空间进程。
Big Kernel Lock表示在某些情况下,在内核空间内,仍然可能会有一些锁,从而阻止其他进程运行受保护的代码。例如,您不能同时挂载多个文件系统-如果您提供了多个挂载命令,它们仍将连续执行,因为挂载需要分配大内核锁。
要使内核具有抢占性,就必须消除此大内核锁定,即使挂载和任何其他任务能够同时运行。这是一项艰巨的工作。
从历史上看,这通过增加对SMP(多CPU支持)的支持变得非常紧迫。第一次有真正的多CPU主板。后来将多个CPU(“核心”)集成到一个芯片中,今天真正的多CPU主板已经很少了(它们通常在昂贵的服务器系统中)。真正真正的单核系统(只有一个cpu,只有一个核)也很少见。
因此,您的问题的答案不是“什么是非抢占性的原因”,因为它始终是抢占性的。真正的问题是,是什么使抢先式内核执行真正必要。答案是这样的:多CPU多核系统的比例在增加。