操作系统内核的几个重要的特点:
- 内核是操作系统的核心部分,它管理着系统的各种资源
- 内核可以看成连接应用程序和硬件的一座桥梁,是直接运行在硬件上的最基础的软件实体
- 在一些简单的硬件设备上可以没有内核或操作系统而直接运行程序,比方单片机等。这些设备通常只是用于特定的场合,也通常功能比较单一。而对于一般计算机来说操作系统是必不可少的。对不同的操作系统,其内核实现也是有所区别的。
- 目前从内核架构来划分,可分为微内核(Micro Kernel)和宏内核(Monolithic Kernel),“宏内核”这个翻译其实不是很好,翻译成“单内核”事实上更好一点。
- 对于微内核,用户服务和内核服务分别运行在不同的地址空间中;
- 对于宏内核不管是用户服务还是内核服务事实上都是内核在统一管理,它们是运行在同一地址空间中的。
我们需要好好理解第6点,也就是用户服务和内核服务运行的地址空间的问题。
大家都知道Linux采用的是宏内核,但是它也区分内核空间和用户空间,那不是有歧义了吗?我们先看一张图。
对于Linux来说,不管是应用还是内核都是由内存管理单元来做统一的内存管理的,用户空间的程序确实不能访问内核空间,但是对于内核来说,3GB-4GB的线性地址空间对整个内核都是共用的,同时内核中的VFS、System Call等模块被划分到内核中,它们之间的地址空间是相同的,这里的用户服务按照我的理解就是这几个内核模块所需要的报备,如上图所示。
我们来列张表来对比一下微内核和宏内核的具体区别:
在技术路线方面,车用操作系统存在着宏内核、微内核和混合内核三条技术路线。
- 宏内核优势是高性能,同时耦合度高,但是安全性与可扩展性不强。
目前常见的桌面系统(如Windows,MacOS,Linux 桌面发行版),服务器系统(如 Unix,Linux)和主流手机操作系统(Android,iOS)均是基于宏内核架构。
- 微内核的优点是高安全、高可靠,但缺少生态,不满足高性能。
- 混合内核是基于微内核路线进行的创新,把一部分跟性能相关的模块放到内核中,通过内核的线程及服务解决高安全和高性能的问题。
中国电动汽车百人会专访丨走向开源,普华基础软件要与产业共创新一代车用操作系统_懂车帝
微内核定义:
内核管理着所有的系统资源,在微内核中用户服务和内核服务在不同的地址空间中实现。
在应用程序和硬件的通信中,内核进程和内存管理的极小的服务,而客户端程序和运行在用户空间的服务通过消息的传递来建立通信,它们之间不会有直接的交互,这样一来,微内核中的执行速度相对就比较慢了,这是微内核架构的一个缺点。
在内核架构中,用户服务是独立于内核服务的,因此任何用户服务崩溃都不会影响到内核服务,这就加强了操作系统的健壮性,这是微内核的优势所在。
另一点,微内核的扩展性强,添加一个功能,只需要建立一个新的服务到用户空间当中,而内核空间不需要任何的修改。因此,微内核可移植性强、安全并且易于扩展。
宏内核定义:
宏内核同样管理着用户程序和硬件之间的系统资源,但是和微内核不一样的是:
在宏内核架构中,用户服务和内核服务在同一空间中实现。具体一点,就是内核可以代表内核进程运行代码,就是通常的内核进程;当用户进程经过系统调用或者中断进入到内核态时,内核也可以代表它运行代码。这样一来,宏内核需要管理的资源多于微内核,其大小就相对大一些了。
在宏内核架构当中,内核管理着CPU调度,内存管理,文件管理和系统调用等各模块的的工作,由于用户服务和内核服务被实现在同一空间中,这样在执行速度上要比微内核快。
然而,宏内核的劣势也是显而易见的,那就是当内核中的某个服务崩溃了,整个内核也会崩溃。另一点,想要在内核中添加新的功能就意味着内核中的各个模块需要做相应的修改,因此其扩展性弱。
内存管理的区别:
宏内核在内核空间就实现了系统所有内存管理所需的一切业务:
- 内存分配策略
- 虚拟内存管理
- 分页算法等
如下图所示:
对于微内核的内存管理实现,有一个发展过程。
在第一代的微内核架构中,内核代理了用户空间的内存管理,控制着内存访问的权限,如下图所示。
内核中的某个服务负责管理缺页异常并保存新分配的页,只要有缺页异常发生,请求就经过内核通知页管理器。页管理器必须进入特权模式下来获取内存的访问,然后回到用户模式下。然后发送一个返回结果来触发进程,当然这个过程也是需要经过内核的。处理缺页异常或者保存新分配页的整个过程是繁复而耗时的。
为了弥补性能上的损失,之后的微内核构架在内存管理上作了相应的改变。
微内核每个进程有3个内存管理原语(Primitves):map、grant和flush。
如果进程想要共享它的内存页那么它的可以通过map来映射内存页给其它进程。
当进程通过grant来让渡它的内存页给其它进程之后,该进程就丧失了这些内存页的访问权,直到让渡进程不再刷新它们。
如此一来,整个系统运行过程就成了这样:在系统启动时,内核将所有内存保存到一个叫做基本的系统进程 (basic system process) 当中,当然这个所谓有基本进程是运行在用户空间中的,如果其它进程需要内存,就是再需要从内核中获取,它可以直接向这个基本的系统进程索取。如下图所示。
其它模块的区别:
微内核和宏内核在设计上还存在一些其它的区别:
比方IO管理方面:
宏内核的设备驱动直接在内核中实现,硬件中断也直接在内核中处理;
在微内核中,内核是不直接处理IO中断管理的,来自硬件的请求将被重定向到用户服务中去,比方内核捕获了一个中断,那么内核发送给设备驱动服务就完事了,设备驱动服务会去处理这个中断。
总结:
微内核效率比宏内核慢,但在安全性、可靠性方面要比宏内核好,在扩展性方面微内核也有优势。
从内核构架发展趋势来说,将来或许会有比Linux更为强劲的基于微内核架构的OS出现,让我们拭目以待吧!
操作系统内核就是一个黑盒,用户不需要知道这个黑盒中是怎么实现,只需要使用该黑盒提供的服务就好了。
但要想学习操作系统,重中之重就是要去学习这个内核,知道这个内核中有什么,知道这个内核的结构是怎样的。
内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
从抽象的角度来看,内核其实就是计算机资源的管理者。计算机资源主要分为两大类
硬件资源
CPU、存储器(内存、硬盘等)、总线、各种I/O设备(键盘、鼠标等)……软件资源
系统软件、应用软件
而内核作为计算机资源的管理者,它一般有着如下的功能:
- 管理CPU,进程管理,决定哪个进程使用cpu,也就是进程调度
- 管理内存,决定内存的分配与释放
- 管理硬盘,即管理文件
- 管理各种I/O 设备
- 管理网络系统
……
内核决定着系统的性能和稳定性,是连接应用程序和硬件的桥梁。
那知道内核中有什么了,我们还得知道内核内部是如何去组织这些东西,让系统更加高效和稳定。这就引出了今天所要讲的内核的结构。
宏内核
宏内核简单理解其实就是把上面所有的功能都整合在一起。我们可以把进程管理、管理内存、管理硬盘、管理各种I/O设备……这些功能看作一个个模块。
在宏内核中,这些模块都是集成在一起的,运行在内核进程中,只有处于内核态下才能运行。
我们平常所使用的应用软件一般运行在用户态下,而运行操作系统程序,操作硬件则在内核态。
运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其 需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。
宏内核的结构图如下
内核层中的功能模块都是链接在一起的,并没有一定的层次关系。它们之间可直接通过方法调用进行交互。
那宏内核中是如何工作的呢?
假设现在有一个应用程序需要使用到内存分配的功能:
- 该应用程序会调用到系统提供的内存分配的接口(系统调用),此时CPU就会切换到内核态,并执行内存分配相关的代码。
- 内核里的内存管理代码按照特定的算法,分配一块内存。并将分配的内存块的首地址,返回给内存分配的接口函数。
- 当内存分配的接口函数返回时,此时CPU又会切换回用户态,应用程序会得到返回的内存块首地址,并开始使用该内存。
整个过程图如下:
宏内核结构的优点就是它的性能十分好,像Linux就是传统的宏内核结构。其性能极高,但其缺点也很明显,就是其耦合度高,一旦其中一个模块出现问题,其他所有的模块都可能会受到影响。
微内核
微内核则和宏内核结构相反,它提倡内核中的功能模块尽可能的少。内核只提供最核心的功能,比如任务调度,中断处理等等。其他实际的模块功能如进程管理、存储器管理、文件管理……这些则被移出内核,变成一个个服务进程,和用户进程同等级,只是它们是一种特殊的用户进程。
微内核的结构图如下
微内核中定义一种进程间通信的机制——消息。
当应用程序请求相关服务时,会向微内核发送一条与此服务对应的消息,微内核再把这条消息发送给相关的服务进程(特殊的用户进程),接着服务进程会完成相关的服务。
那么微内核是如何工作的呢?
还是刚刚内存分配的例子:
- 应用程序发送内存分配的消息,这个发送消息的接口函数是由微内核提供的。
- 此时CPU切换到内核态,开始执行该函数的代码,微内核的代码会使当前进程停止运行,并将消息发送给内存管理的服务进程。
- 内存管理服务进程收到该消息后,就会分配一块内存,并且也会通过消息的形式将分配的内存块的地址返回给内核。
- 微内核再将该消息返回给发送内存分配消息的应用程序。此时CPU切换到用户态,应用程序会得到返回的内存块首地址,并开始使用该内存。
对比宏内核中,微内核结构主要是多了接收和发送消息的这一过程,实际上也是系统调用,只是并不是直接调用内存管理的接口函数,因为微内核中内存管理功能模块已经不属于系统调用了。所以对比起宏内核,微内核结构的性能会差不少。
但微内核降低了耦合度,模块移除内核后后使得即使某一个模块出现问题,只要重启这个模块的进程即可,不会影响到其他模块,更加的稳定。并且微内核有相当好的伸缩性、扩展性,因为模块功能只是一个进程,可以随时增加或减少系统功能。
混合内核
宏内核和微内核各有优缺点,它们就如同两个极端。而将两者中和一下,就形成了混合内核。
混合内核的结构其实与微内核相似,但为了提高性能,混合内核中会将一些原本微内核中运行在用户层的功能模块放回内核中,而不常用的,或者需要的时间很长的功能模块还是放在用户层。
当然这只是其中的一种情况,混合内核往往还会有其他形式,等下在拓展中会看到其他形式的混合内核。总而言之,混合内核就是结合了宏内核和微内核的特点,记住这点就好。
总结
宏内核其实就是把所有的功能都耦合起来,放在内核中,这样的优势就是性能极高,因为各个功能模块之间是可以直接调用的。
缺点就是因为各个模块是相互关联,容易出现一错皆错的问题。
微内核则恰恰相反,它为了降低耦合,内核中只会允许一些核心功能的存在,而其余所有功能都会被移出内核,变成一种特殊的用户进程——服务进程。
其优点就是各个模块之间是独立的,不会相互影响,但其性能相比宏内核会大幅度下降。
混合内核则是结合上面二者的特点,它与微内核相似,只是会将一些功能模块又放回到内核中去,而不常用的功能模块还是放在用户层中。这样在微内核的基础上,又可以提高性能。
拓展
那现在用的最多的操作系统,Linux、Windows、Mac的内核结构是属于哪种呢?
Linux
Linux内核就是传统的宏内核结构,我们可以看下Linux内核的内部全景图
可以看到其内部是多模块耦合,其模块之间可以进行相互调用。所以这也是Linux的性能极高的原因。但可以看到图中各个模块的调用路劲从横交错,这就会出现一个地方出现问题,其他相关的地方可能都会出现问题,这是十分不安全的。
Windows
接下来是Windows的内核,Windows使用的是NT内核,来看下NT的内核结构图
我们主要看Kernel层,从下往上看
最下层是 硬件抽象层(HAL),HAL 层是帮助去适配各种不同的硬件平台;
在 HAL 层之上就是微软自己定义的小内核,也就是内核层中还包含着一个内核;
而在这个小内核之上就是各种执行体了,这些执行体提供了操作系统的文件系统缓存、对象管理、即插即用管理、虚拟内存、进程与线程、等服务。
每个执行体互相独立,只对外提供相应的接口,其它执行体要通过相应的接口才能和其它执行体通信或者请求其完成相应的功能服务。
这有点类似于微内核的结构,各模块功能能相互独立。但又不同于微内核,因为这些功能模块都是在内核层的。NT从设计架构上看应该属于微内核结构,HAL层之上的小内核属于微内核的核心,小内核之上的执行体属于内核级别的应用层。
而NT从权限的角度看属于宏内核,内核模式之下功能完备,并不像微内核那样功能稀少。这种设计兼顾了结构清晰和性能良好两个优点。所以NT应该算是混合内核。
Mac
MacOS使用的是Darwin-XNU内核,来看下其内核结构图
可以看到Darwin-XNU中有两个内核层,Mach层(微内核)和BSD层(宏内核)。
Mach内核提供简单的进程、线程、IPC 通信、虚拟内存设备驱动相关的功能服务
BSD则提供强大的安全特性,完善的网络服务,各种文件系统的支持,同时对Mach中的功能进行细化、扩展延伸。
Darwin-XNU 内核层也成为了多内核架构的代表。
那Darwin-XNU到底属于哪种内核结构呢?[1]https://zhuanlan.zhihu.com/p/394560786#ref_1
Mac OS X是基于NeXT公司1985年至1999年开发的NeXTSTEP系统开发的,NeXTSTEP是基于Mach的,虽然Mach一般认为是微内核架构,但NeXTSTEP的核心是基于自研XNU的Darwin系统,这是一种Hybrid kernel混合内核架构,它揉合了Mach和自研的设备驱动、输入输出等模块,即使只说这个Mach,也是卡内基梅隆大学基于BSD研发的包含了文件系统的宏内核版本。 所以说,当今苹果的iOS、macOS等操作系统都是起源于混合内核架构,不是微内核,也不是纯粹的宏内核。