非占先式内核(Non-preemptive Kernel)是一种操作系统内核调度方式,也称为协作式内核(Cooperative Kernel),与之相对的是抢占式内核(Preemptive Kernel),两者的区别主要在于进程调度时对 CPU 的掌控程度。
在非占先式内核中,进程需要明确地让出 CPU 使用权,才能够让其他进程使用 CPU,因此进程的调度更多是由应用程序自行管理,一般来说,进程的调度可以使用协程(Coroutine)和另一种称为 Fibers 的编程技术来实现,每当进程陷入 I/O 或者阻塞等待时,应用程序会选择并继续运行另外一个进程。
相比抢占式内核,非占先式内核的特点是可以减少 CPU 周期的浪费,因为其他进程只能在当前进程显式让出 CPU 之后,才能够继续执行。但是,这类内核容易受到单个进程的垄断,因为一个长时间运行的进程,在其不停止或让出 CPU 的情况下,其他进程将无法运行。
在性能方面,非占先式内核相对于抢占式内核,有更高的效率和更少的延迟。由于 CPU 的使用完全由进程控制和管理,使得操作系统的本身的调度机制更加简单,避开了繁琐的上下文切换和锁的问题。
但是,这种调度方式的问题在于,如果一个进程由于其实现不当或出现了除以零的错误等异常情况,它可能会占用 CPU 资源长时间不释放,影响其他程序的运行。并且进程间的协作需要更加严格的规范容错机制,否则容易因为某个进程的意外停止而导致整个操作系统的崩溃。
目前,非占先式内核主要应用于一些嵌入式设备的操作系统,例如 Palm OS 和 Symbian OS。这些设备一般具有很强的实时性和响应速度需求,所以需要对 CPU 的调度和抢占进行严格的控制和优化,以保证操作系统的运行稳定性和性能及用户的体验感。
除此之外,一些操作系统也会使用协同式内核进行用户界面的管理,例如 macOS 中的 Quartz Compositor 和 Windows 的 Desktop Window Manager。
通过对非占先式内核的介绍,我们可以看到其相比抢占式内核的优缺点,以及在实际应用中的体现。虽然这种类型的内核在一些嵌入式设备和操作系统领域仍然有应用,但对于更多的大型 PC 和云计算的操作系统而言,抢占式内核则成为了主流的内核类型,因为它可以更好地支持多任务处理和实时性的挑战。