跳至内容

Minix 3/MINIX 3 架构与设计

来自 Wikibooks,开放世界中的开放书籍

内核是大多数计算机操作系统中的核心部分,它管理系统的资源以及硬件和软件组件之间的通信。 作为操作系统的基本组件,内核为硬件提供抽象层,特别是为内存、处理器和 I/O 提供抽象层,使硬件和软件能够通信。 它还通过进程间通信机制和系统调用,为用户空间应用程序提供这些功能。

这些任务由不同的内核以不同的方式完成,具体取决于它们的设计和实现。 单内核将尝试通过在同一个地址空间中执行所有代码来实现这些目标,从而提高系统的性能,而微内核将大多数服务运行在用户空间,旨在提高代码库的可维护性和模块化。

大多数(但并非全部)操作系统依赖于内核概念。 内核作为一个软件,负责硬件和软件之间的通信,其存在是由于与性能、内存效率、安全性以及处理器架构相关问题的复杂折衷方案导致的。

在大多数情况下,引导加载程序以超级用户模式启动内核作为一个进程,但在初始化之后,它不会像我们所知的进程那样保留,而是作为一组完整的函数,这些函数可以被用户空间应用程序调用以执行需要更高权限级别的操作,例如磁盘访问。 内核执行流是用户空间进程执行流的延续,当执行系统调用时,这些执行流会暂停,并在这些系统调用返回时恢复。 最初的主内核流保留为“空闲进程”,并“收集”未使用的处理器时间。

内核开发被认为是编程中最复杂、最困难的任务之一。 它在操作系统中的核心地位意味着需要良好的性能,这将内核定义为一项关键软件,并使它的正确设计和实现变得困难。 内核甚至可能不被允许使用它为其他软件提供的抽象机制。 许多原因阻止内核使用它提供的功能,例如:中断管理、内存管理以及缺乏可重入性,从而使软件工程师的开发变得更加困难。

不同的内核设计方法

[编辑 | 编辑源代码]

当然,上面列出的任务和功能可以通过多种方式提供,这些方式在设计和实现上有所不同。 单内核在其所有代码在同一个地址空间(内核空间)中运行,以提高系统的性能,而微内核则尝试将其大多数服务运行在用户空间,旨在提高代码库的可维护性和模块化。 大多数内核并不完全属于其中任何一种类别,而是位于这两种设计之间。 这些被称为混合内核。 更奇特的方案,例如纳米内核和外核,主要由研究人员进行研究,并未得到广泛使用。

单内核

[编辑 | 编辑源代码]

在单内核中,所有操作系统服务都与主内核线程一起运行,因此也驻留在同一个内存区域。 这种方法提供了丰富而强大的硬件访问权限。 单内核系统比其他解决方案更容易设计和实现,而且如果编写良好,效率极高。 单内核的主要缺点是系统组件之间的依赖关系——设备驱动程序中的错误可能会导致整个系统崩溃——以及大型内核变得非常难以维护的事实。

微内核

[编辑 | 编辑源代码]

微内核方法包括在硬件之上定义一个简单的抽象层,使用一组原语或系统调用来实现最小的操作系统服务,例如内存管理、多任务处理以及进程间通信。 其他服务,包括通常由内核提供的服务,例如网络,都在用户空间程序中实现,称为服务器。 微内核比单内核更容易维护,但大量的系统调用和上下文切换可能会减慢系统速度,因为它们通常比普通函数调用产生更多的开销。

微内核通常比传统设计性能差,有时甚至差很多。 这是因为进入和退出内核(上下文切换)以在各个应用程序和服务器之间移动数据的开销很大。 最初人们认为,仔细调整可以显着减少这种开销,但到 1990 年代中期,大多数研究人员放弃了这种方法。 最近,针对性能优化的较新微内核已经解决了这些问题。

单内核与微内核

[编辑 | 编辑源代码]
单内核、微内核和混合内核的示例结构。

随着计算机内核的增长,一些问题变得明显。 最明显的问题之一是内存占用率增加。 这在一定程度上可以通过完善虚拟内存系统来缓解,但并非所有计算机架构都支持虚拟内存。 为了减小内核的占用率,必须对内核进行大量的编辑以仔细删除不需要的代码,对于具有数百万行代码的内核来说,这可能是非常困难的,因为内核的各个部分之间存在非显而易见的相互依赖关系。

由于单内核带来的问题,它们在 1990 年代初被认为已经过时。 结果,Linux 使用单内核而不是微内核的设计成为了 Linus Torvalds 和 Andrew Tanenbaum 之间一场著名口水战的主题。 在 Tanenbaum/Torvalds 辩论中提出的论点双方都有一定的道理。

最常见的内核是单内核;Windows NT、Linux 和 Apple 的 XNU 内核(Mac OS X 背后的内核)只是一些例子,但还有更多。 大多数微内核要么是研究内核,要么是仅用于嵌入式系统以执行一项任务的内核。

单内核往往更容易设计正确,因此可能比基于微内核的系统增长得更快。 但是,单内核系统中的错误通常会导致整个系统崩溃;如果系统设计正确,那么在微内核中,服务器独立于主线程运行,就不会出现这种情况。 单内核的支持者认为,不正确的代码不属于内核,并且微内核在正确代码之上提供的优势微乎其微。 这两个阵营都有成功案例。 微内核通常用于嵌入式机器人或医疗计算机,在这些计算机中,容错能力很重要,并且大多数操作系统组件都驻留在它们自己的专用、受保护的内存空间中。 对于单内核来说,即使是现代模块加载的单内核,这也是不可能的。 但是,单内核模型通过使用共享内核内存往往更加高效,而不是微内核设计中更慢的消息传递系统。

华夏公益教科书