微内核与宏内核区别

52 阅读6分钟

内核

操作系统是运行计算机的总控制程序。它的主要功能就是高效地利用硬件。每个操作系统都以一个内核为基础,向外提供服务,既为使用计算机的用户提供界面,也为正在执行的程序提供接口。

当计算机启动时,计算机要经历一系列的动作,这些动作构成引导过程。该过程的最后一个动作是启动一个非常复杂的程序,这个程序就是内核(kernel)。

内核的作用是控制计算机,充当操作系统的核心。正因为是操作系统的核心,所以内核总是一直运行的。除非关闭了计算机,内核一直可用,并在需要时提供基本的服务。

内核是操作系统的核心,它非常重要。尽管内核的本质可能根据操作系统的不同而有所区别,但是内核所提供的基本服务在各个操作系统之间都基本相同,这些服务包括:

  • 内存管理(虚拟内存管理,包括分页)
  • 进程管理(进程创建、终止、调度)
  • 进程间通信(本地、网络)
  • 输入 / 输出(通过设备驱动程序,即实现与物理设备实际通信的程序)
  • 文件管理
  • 安全和访问控制
  • 网络访问(如 TCP/IP)

不过这里只需要知道,内核是操作系统最重要的部分。

内核有许多种类型,但是它们基本可以分为两大类,规模较大的一类称为单内核(monolithic kernel),规模较小的一类称为微内核(microkernel)。

单内核与微内核

目前,大多数操作系统都使用单内核(monolithic kernel,也称为宏内核)​,操作系统的基本功能由该内核提供,包括进程和线程管理、文件系统、设备驱动、网络和存储管理等。宏内核通常是作为一个单一的、巨大的程序在内核态下运行,其所有服务运行在同一内核地址空间内,这也正是其高性能但高风险的原因。

而微内核(micro kernel)则让内核执行一些最基本的功能,如基本调度和进程间通信等,其他服务由守护进程(也称为服务器)提供,这些进程和其他应用程序都在用户态下运行。

目前主流的 Linux 发行版都使用宏内核,且大量 UNIX 系统,例如 BSD 家族,也是使用宏内核。而 macOS 的 XNU 内核和 Windows 的 NT 内核则都是基于微内核思想发展起来的混合式内核。混合式是宏内核和微内核的折中方案。将一些关键服务放在内核空间,但允许其他模块(如驱动程序)在用户空间运行或作为可选模块加载,以平衡性能和稳定性。

而使用微内核的操作系统就比较少了,例如:Minix(用于教育)、QNX、Fuchsia OS(Google)。

两种内核的比较

微内核在设计上更为先进,采用微内核设计可以让内核的功能开发和守护进程分开,这样就可以为应用程序的特定需求定制服务程序,使得开发更为简单和灵活。而单内核则是整体式设计,只要修改了内核中的任何一个部分,在生效前,所有的模块都要重新链接和安装,因此修改和维护会相对困难。

早在Linux操作系统发布初期,Minix操作系统的开发人员安德鲁教授曾评价道:​“Linux操作系统已经过时”​,“单内核在整体设计上是有害的”​。而托瓦兹则展开反击,回复道:​“我承认微内核的设计更为先进,但是Linux操作系统的各方面性能都优于Minix操作系统”​。这场辩论由两人开始,很多技术专家、开发爱好者逐渐加入其中。

至于两者到底孰优孰劣,也许UNIX操作系统的主要设计者肯·汤普森的评价最为中肯:

​“如果从设计的眼光来审视,我们用的许多(即便说不上绝大多数)软件都是过时的。但是对广大用户来说,他们可能不怎么关心自己用的操作系统内部的设计是不是过时的,他们更关心的是性能和用户级的兼容性。总的来说,我还是赞同 “微内核可能会是未来的潮流” 这样的说法。但是,我觉得还是实现一个单内核的系统更容易些。当然,在改动的过程中单内核也更容易变成一团糟。​”

事实上,由于 Linux内核在后续的升级中采用了动态链接等技术,内核中的模块(如文件系统、设备驱动等)都可以被动态加载,这样在给某个模块修改代码时就不会影响内核的其他组件,大大减轻了维护的难度,这让作为单内核的 Linux操作系统也具备了部分微内核系统的优点。

选择

单内核与微内核往往伴随着设计理念的纷争,但是设计理念这东西也是随着应用场景的不同而有所差异。单内核与微内核很像在 Web开发中的单体架构和微服务架构。单内核或单体架构选择了高性能和高集成度,而微内核或微服务架构则是选择了高稳定性和高可扩展性。这也是为什么 Windows 和 macOS 选择了混合式内核,因为它试图在这两者之间找到一个最佳的平衡点,就像许多企业在实践中也会选择模块化的单体或部分微服务化一样。

任何事情都有其两面性,更先进的设计虽然提供了一种更适应现代分布式、高并发和高变化环境的设计框架,但其应用于实际场景,却带来了性能下降、调试困难、以及巨大的开发成本和维护挑战。在大量的弊端面前,微内核的优势也只剩下先进的设计了。这种停留在理论上的先进不能给系统带来更多的价值,因此大多数系统都选择了宏内核。

之前 Web开发中,都在说微服务架构有多先进,很多公司都盲目进行了微服务化的改造,甚至在伴随着微服务架构的兴起而产生了中台概念。但随着微服务架构的弊端显现出来,又形成了一股回归务实的单体架构的潮流。但这并不是说微服务是失败的,而是这种设计不适用于大多数公司的业务场景。因此,在软件开发中,搞清楚自己要解决的问题,才是最重要的。