微内核和宏内核是什么? 有什么区别?

内容纲要

操作系统内核的几个重要的特点:

  1. 内核是操作系统的核心部分,它管理着系统的各种资源

  2. 内核可以看成连接应用程序和硬件的一座桥梁,是直接运行在硬件上的最基础的软件实体

  3. 在一些简单的硬件设备上可以没有内核或操作系统而直接运行程序,比方单片机等。这些设备通常只是用于特定的场合,也通常功能比较单一。而对于一般计算机来说操作系统是必不可少的。对不同的操作系统,其内核实现也是有所区别的。

  4. 目前从内核架构来划分,可分为微内核(Micro Kernel)和宏内核(Monolithic Kernel),“宏内核”这个翻译其实不是很好,翻译成“单内核”事实上更好一点。

  5. 对于微内核,用户服务和内核服务分别运行在不同的地址空间中;对于宏内核不管是用户服务还是内核服务事实上都是内核在统一管理,它们是运行在同一地址空间中的。

我们需要好好理解第5点,也就是用户服务和内核服务运行的地址空间的问题。大家都知道Linux采用的是宏内核,但是它也区分内核空间和用户空间,那不是有歧义了吗?我们先看一张图。

对于Linux来说,不管是应用还是内核都是由内存管理单元来做统一的内存管理的,用户空间的程序确实不能访问内核空间,但是对于内核来说,3GB-4GB的线性地址空间对整个内核都是共用的,同时内核中的VFS、System Call等模块被划分到内核中,它们之间的地址空间是相同的,这里的用户服务按照我的理解就是这几个内核模块所需要的报备,如上图所示。

我们来列张表来对比一下微内核和宏内核的具体区别:

微内核定义:

内核管理着所有的系统资源,在微内核中用户服务和内核服务在不同的地址空间中实现。在应用程序和硬件的通信中,内核进程和内存管理的极小的服务,而客户端程序和运行在用户空间的服务通过消息的传递来建立通信,它们之间不会有直接的交互,这样一来,微内核中的执行速度相对就比较慢了,这是微内核架构的一个缺点。

在内核架构中,用户服务是独立于内核服务的,因此任何用户服务崩溃都不会影响到内核服务,这就加强了操作系统的健壮性,这是微内核的优势所在。另一点,微内核的扩展性强,添加一个功能,只需要建立一个新的服务到用户空间当中,而内核空间不需要任何的修改。因此,微内核可移植性强、安全并且易于扩展。

宏内核定义:

宏内核同样管理着用户程序和硬件之间的系统资源,但是和微内核不一样的是,在宏内核架构中,用户服务和内核服务在同一空间中实现。具体一点,就是内核可以代表内核进程运行代码,就是通常的内核进程;当用户进程经过系统调用或者中断进入到内核态时,内核也可以代表它运行代码。这样一来,宏内核需要管理的资源多于微内核,其大小就相对大一些了。

在宏内核架构当中,内核管理着CPU调度,内存管理,文件管理和系统调用等各模块的的工作,由于用户服务和内核服务被实现在同一空间中,这样在执行速度上要比微内核快。然而,宏内核的劣势也是显而易见的,那就是当内核中的某个服务崩溃了,整个内核也会崩溃。另一点,想要在内核中添加新的功能就意味着内核中的各个模块需要做相应的修改,因此其扩展性很弱。

内存管理的区别:

宏内核在内核空间就实现了系统所有内存管理所需的一切业务,包括内存分配策略、虚拟内存管理分页算法等,如下图所示:

对于微内核的内存管理实现,有一个发展过程。在第一代的微内核架构中,内核代理了用户空间的内存管理,控制着内存访问的权限,如下图所示。

内核中的某个服务负责管理缺页异常并保存新分配的页,只要有缺页异常发生,请求就经过内核通知页管理器。页管理器必须进入特权模式下来获取内存的访问,然后回到用户模式下。然后发送一个返回结果来触发进程,当然这个过程也是需要经过内核的。处理缺页异常或者保存新分配页的整个过程是繁复而耗时的。

为了弥补性能上的损失,之后的微内核构架在内存管理上作了相应的改变。每个进程有3个内存管理原语(Primitves):map、grant和flush。如果进程想要共享它的内存页那么它的可以通过map来映射内存页给其它进程。当进程通过grant来让渡它的内存页给其它进程之后,该进程就丧失了这些内存页的访问权,直到让渡进程不再刷新它们。如此一来,整个系统运行过程就成了这样:在系统启动时,内核将所有内存保存到一个叫做基本的系统进程 (basic system process) 当中,当然这个所谓有基本进程是运行在用户空间中的,如果其它进程需要内存,就是再需要从内核中获取,它可以直接向这个基本的系统进程索取。如下图所示。

其它模块的区别:

微内核和宏内核在设计上还存在一些其它的区别,比方IO管理方面,宏内核的设备驱动直接在内核中实现,硬件中断也直接在内核中处理;但是在微内核中,内核是不直接处理IO中断管理的,来自硬件的请求将被重定向到用户服务中去,比方内核捕获了一个中断,那么内核发送给设备驱动服务就完事了,设备驱动服务会去处理这个中断。

总结:

微内核效率比宏内核慢,但在安全性、可靠性方面要比宏内核好,在扩展性方面微内核也有优势。

从内核构架发展趋势来说,将来或许会有比Linux更为强劲的基于微内核架构的OS出现,让我们拭目以待吧!

来源:https://zhuanlan.zhihu.com/p/53612117