在(一)详解CPU中介绍了操作系统所基于的硬件CPU后,本部分学习操作系统的架构。在计算机系统中,操作系统的架构通常包括以下几个主要组件:
- 内核(Kernel)
- 进程管理(Process Management)
- 内存管理(Memory Management)
- 文件系统管理(File System Management)
- 设备管理(Device Management)
- 网络管理(Network Management)
其管理和交互形式如下图:
在某些情况下,可以将操作系统理解为内核。内核是操作系统的核心组件,它直接管理硬件资源并执行系统的底层任务。严格来说,操作系统不仅包括内核,还包括其他组件,如系统库、用户界面、应用程序、命令行工具等。
1. 操作系统分类
根据任务响应时间要求的不同可分为
- 实时操作系统:通常具有非常短的响应时间,可以满足对任务响应时间有严格要求的应用场景,如航空航天、工业控制、医疗设备等。比如VxWorks/RTLinux
- 必须在预定的时间范围内完成对事件的响应和处理,即使在高负载时也不能出现延迟。实时操作系统分为硬实时(Hard Real-Time)和软实时(Soft Real-Time)两类。硬实时系统绝对保证任务在规定时间内完成,而软实时系统在大部分情况下能够满足响应时间要求,但在极端情况下可能会发生延迟。
- 实时操作系统使用预定的调度算法,如固定优先级调度(Fixed Priority Scheduling)或最早截止时间优先调度(Earliest Deadline First Scheduling),以确保高优先级任务在规定的时间内得到处理。
- 非实时操作系统:适用于大多数普通应用,如个人计算机、服务器等。比如Linux、Android。
- 非实时操作系统对任务的响应时间没有严格的限制,它更关注任务的吞吐量和效率。非实时操作系统允许任务在不同的时间片中完成,任务的响应时间可能会有所波动,但在大多数情况下不会影响系统正常运行。
- 非实时操作系统采用通用的调度算法,如轮转调度(Round Robin Scheduling)、优先级调度(Priority Scheduling)等,以平衡任务之间的公平性和系统资源的利用率。
主要区别在于对任务响应时间的要求和任务调度方式的不同。
2. 操作系统内核
基本功能:
- 管理进程、线程,决定哪个进程、线程使用 CPU,也就是进程调度的能力;
- 管理内存,决定内存的分配和回收,也就是内存管理的能力;
- 管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬件通信能力;
PS:操作系统能够实现硬件管理,就是因为内核中包含了管理CPU的进程管理组件,管理memory的内存管理组件,管理其他外设存储的文件管理组件,管理其他设备的设备管理组件(设备驱动程序,在内核空间运行)
- 提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。
工作方式:按照程序工作时占用的内存空间地址划分。
- 内核空间,这个内存空间只有内核程序可以访问;内核空间的代码(感觉指令更准确)可以访问所有内存空间。当程序使内核空间时,程序则在内核态执行。
- 用户空间,这个内存空间专门给应用程序使用;用户空间的代码只能访问一个局部的内存空间。当程序使用用户空间时,常说该程序在用户态执行。
两种工作方式怎么切换:当应用程序使用系统调用时,会产生一个中断(软中断,因为是应用程序使用系统调用产生的)。然后 CPU 会中断(就是前面那个中断)当前在执行的用户程序,转而跳转到中断处理程序,也就是开始执行内核程序。内核处理完后,主动触发中断,把 CPU 执行权限交回给用户程序,回到用户态继续工作。
2.1 Linux内核
核心理念和技术:
- MultiTask,多任务:Linux支持多任务,能够在同一时间内运行多个应用程序,通过时间片轮转等调度算法来分配处理器时间。
- SMP,对称多处理:Linux采用SMP架构,允许多个处理器核心并行地执行任务。每个 CPU 的地位是相等的,多个 CPU 共享同一个内存,每个 CPU 都可以访问完整的内存和硬件资源。这一特点决定了每个程序都可以被分配到任意一个 CPU 上被执行。
- ELF,可执行文件链接格式:Linux 操作系统中可执行文件、共享库、目标文件等的存储格式。定义了文件的结构,包括程序代码、数据、符号表等信息。
代码首先通过「编译器」编译成汇编代码,接着通过「汇编器」变成目标代码,也就是目标文件,最后通过「链接器」把多个目标文件以及调用的各种函数库链接起来,形成一个可执行文件,也就是 ELF 文件。
执行 ELF 文件的时候,会通过「装载器」把 ELF 文件装载到内存里,CPU 读取内存中的指令和数据,于是程序就被执行起来了。 - Monolithic Kernel(宏内核):宏内核是一种操作系统内核架构,其中操作系统的大部分功能(如进程调度、内存管理、文件系统、设备驱动等)都实现在内核空间,即Linux 的内核是一个完整的可执行程序,且拥有最高的权限。Linux内核最初是一个宏内核,但随着时间的推移,它采用了一些微内核的概念(微内核架构的内核只保留最基本的能力,比如进程调度、内存管理、中断等,把一些应用放到了用户空间,比如驱动程序、文件系统等。这样服务与服务之间是隔离的,单个服务出现故障或者完全攻击,也不会导致整个操作系统挂掉,提高了操作系统的稳定性和可靠性),将一部分功能以模块的形式加载,实现了一种混合内核结构。
一些功能可以在运行时动态加载和卸载,而不需要重新编译内核,比如:
设备驱动程序:很多设备驱动程序可以作为模块加载,以支持新的硬件。
文件系统模块:一些不太常用的文件系统可以作为模块加载,以减小内核的大小。
网络协议栈:某些网络协议栈可以作为模块加载,以根据需要进行调整。
2.2 Windows内核
Windows 10 使用的内核叫 Windows NT,NT 全称叫 New Technology。Windows 和 Linux 一样,同样支持 MultiTask 和 SMP,但不同的是,Window 的内核设计是混合型内核,内核中有一个 MicroKernel 模块,而其他模块就在这个基础上搭建,整个内核实现是一个完整的程序。
- Windows 的可执行文件格式叫 PE,称为可移植执行文件,扩展名通常是.exe、.dll、.sys等。