云原生架构:从技术演进到最佳实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 内核

在操作系统中最核心的部分就是内核模块。内核是多段计算机程序的有机结合,其直接管理系统中的多种资源,包括 CPU、内存空间、I/O 资源等,然后将资源抽象后提供给上层应用来使用。反之,计算机的操作也要通过内核传递给硬件。其主要功能有:

中断响应。

进程管理。

进程间通信。

内存管理。

1.3.1 组成模块化

内核中的各个模块都作为单独的进程运行,模块之间通过消息传递进行通信。不同模块的功能,通过如下两种方式整合到内核中。

静态编译:在编译阶段将所有功能都编译进内核。这样虽然不会有兼容性问题,但会导致生成的内核很大。此外,新加入功能时需要重新编译内核。

动态加载:将功能编译成模块,在需要时再动态加载。这样可以减小内核的大小,并增加内核模块的弹性,且在修改内核后,无须编译整个内核。

有了模块动态化之后,就可以根据需要将对应的模块编译进内核,并且可以动态地加载和卸载,这样对模块的维护及使用就得到了很大程度的简化。

1.3.2 单内核

单内核也叫“大内核”,是一个单独的二进制映像。操作系统的所有功能都可以被做到内核中,包括进程调度、文件系统、网络服务、设备驱动、存储管理等。应用程序可以通过系统调用来使用内核功能,内核则通过硬件完成相应的工作。单内核设计模式如图1-5所示。

图 1-5

当单内核运行时,内核本身作为一个很大的进程存在,进程内所有服务都运行在同一块地址空间中,内核模块之间的通信是通过函数调用来实现的。这样虽然保证了结构简单,提高了操作系统的工作效率,但也导致模块之间调用繁杂,系统修改、升级时相互影响,后期维护成本较高。大部分UNIX(包括Linux)系统都采用单内核模式。

1.3.3 微内核

微内核设计模式是一种精简形式,能将模块功能尽可能从内核中剥离出来,只保留一些十分必要的服务,剥离出的模块功能以服务扩展件的形式存在,用户可以根据不同的诉求加载相应的服务扩展件。使用微内核设计模式对系统进行升级,只需要用新模块替换旧模块,不需要改变整个操作系统。

微内核设计模式如图1-6 所示。微内核自身提供一组“最基本”的服务,包括调度计算资源、管理内存资源、I/O资源存储及I/O设备管理。其他服务,如进程间通信、设备驱动、文件管理、网络支持等都通过服务扩展件的形式在微内核之外实现。

微内核具有很好的扩展性,并可简化应用程序开发。用户只运行其需要的服务,这有利于减少应用对磁盘空间和存储器的需求。

图 1-6

1.3.4 外内核

麻省理工学院(MIT)提出一种内核概念,其设计理念是尽可能减少抽象化的层次,让应用程序的开发人员决定硬件接口的设计。用这个概念实现的内核,被称为“外内核”。外内核设计模式如图1-7所示。

图 1-7

通常外内核只负责系统保护和系统资源复用相关服务,运行在核心空间的唯一进程就是外内核,它唯一的工作就是负责分配系统资源,并防止使用者进程存取其他进程的资源。这就使得外内核变得很小。

在传统的内核设计中,硬件和设备驱动以一种隐藏的形态存在于硬件抽象层中,上层服务通过硬件抽象层与硬件进行交互。应用程序不会直接与硬件的物理空间进行交互。外内核的目标是让应用程序直接请求一块特定的物理空间、一个特定的磁盘块等,它本身只保证被请求的资源当前是空闲的。

当前,外内核设计还停留在研究阶段。但理论上,可以让各种操作系统(如 Windows 和UNIX)运行在一个外内核之上,并且设计人员可以根据运行效率调整系统的各部分功能。在应用外内核的情况下,每个应用都可以自带一个定制内核的操作系统。比如在图1-7中,名为Emacs的应用可以自带定制内核的操作系统 ExOS,应用 Water 可以自带一个定制内核的操作系统PhOS,而任意的应用(Application)都能为自己定制一个匹配内核的操作系统XX OS。

综上所述,我们简单介绍了操作系统的主要功能和结构,还介绍了CPU指令集原理,以及内核相关知识。可以说,操作系统的最终目的是为应用提供一个标准的运行时环境,封装底层硬件,为应用提供一个统一的底层物理资源调用接口。

如图 1-8 所示,应用主要包括后端服务(客户端和调用代码)、开发框架及类库等,应用主要满足两类需求:业务需求和非业务需求。操作系统和硬件作为底层支撑,向上提供基本能力,如计算能力、存储能力、网络连接能力等。

图 1-8

通过本章的学习,读者应该可以理解操作系统核心知识,并为接下来的内容打下基础。