# 操作系统

操作系统位于硬件层与应用层之间，是连接二者的关键中介。

操作系统通过系统调用接口为应用程序提供服务，同时通过设备驱动程序管理硬件资源，实现资源的抽象和虚拟化。

本部分将详细介绍操作系统的基本概念、定义和主要特征。

## 操作系统的概念

### 计算机系统

计算机系统是可以按用户的要求接收和存储信息、自动进行数据处理并输出结果信息的系统。广义上，计算机系统包含机械式系统和电子式系统两种。在电子式系统中，根据数据表示方式的差异，又可进一步分为模拟式计算机系统和数字式计算机系统两种。

模拟式电子计算机问世较早。其内部所使用的电信号用于模拟自然界的实际信号，因而称为模拟电信号。模拟电子计算机处理问题的精度较差，所有处理过程均需通过模拟电路来实现，电路结构复杂，抗外界干扰能力较弱。

计算机系统包括硬件系统和软件系统。硬件系统是计算机赖以工作的实体；软件系统保证计算机系统按用户指定的要求工作。

这两部分构成了计算机系统的资源，因此，计算机系统的资源包括两大类：硬件资源和软件资源。

中央处理器（CPU，Central Processing Unit）、内存储器（又称主存，即内存）、外存储器（磁盘、磁带、CD-ROM、DVD-ROM、U 盘（USB Flash Disk））以及各种输入输出设备（键盘、鼠标、打印机、显示器、扫描仪、数位板等）组成了计算机硬件系统。各种程序和数据则组成了计算机软件系统。

| 软件系统（程序、数据）                  | 硬件系统                           |
| ---------------------------- | ------------------------------ |
| 应用软件：文字处理、图像与图形处理、科学计算、视频处理等 | 中央处理器（CPU）、内存储器                |
| 支撑软件：数据库、网络、多媒体等             | 外存储器（磁盘、CD、DVD）                |
| 系统软件：操作系统、编译程序等              | 输入输出设备（键盘、鼠标、打印机、显示器、扫描仪、数位板等） |

使用计算机系统处理各种问题之前，要有用于处理、解决相关问题的程序。这些程序的来源可以是多种多样的，例如 **自行开发、购买、获取开源软件** 等。

任何一个程序在计算机系统中执行之前，必须先获得内存空间，才能被装入内存。这些程序的执行依赖中央处理器（CPU）。

程序在执行的过程中需要调用公共服务子程序和共享文件，还要使用各种计算机外设以及计算机内部设备，用以完成信息的输入输出。这里的中央处理器、内存空间、公共服务子程序和共享文件以及计算机外部设备等都是计算机系统中的资源，需要对计算机资源的分配进行适当的控制和协调。

程序对计算机资源的要求和使用是不同的。不同的用户对计算机资源的请求和使用中可能会发生冲突。例如，当一个用户使用打印机时，另一些用户也要求使用同一台打印机。如果没有一种方法或规则对用户使用打印机的要求进行管理，肯定会引起混乱。

对一台打印机的使用需要进行管理；同样，对计算机系统中的其他资源也要进行管理，进行适当的控制和协调。

在计算机系统中，集中了资源管理功能和程序执行功能的软件称为操作系统。

### 操作系统的定义

操作系统是计算机系统的核心组成部分。它通过一系列的功能模块来实现对系统资源的管理和用户服务的提供。

操作系统是计算机系统中的一种系统软件，是由若干程序模块组成的集合。这些模块能够有效地组织和管理计算机系统中的硬件和软件资源，合理组织计算机的工作流程，控制程序的执行，并向用户提供各种服务功能。

使用户能够灵活、方便、高效地使用计算机，同时保证整个计算机系统高效运行。

从表现形式来看，操作系统是一个大型软件程序，其中包含大量为实现操作系统各项功能而设计的软件程序。

从设计和结构角度看，这些软件程序通常都是模块化的。有的操作系统带有内核（Kernel），其内核同样由多个程序模块组成。有的操作系统本身是层次化的，每个层次的程序通常也是模块化的。操作系统是一个大型软件系统，是由大量具备不同功能的程序模块组成的集合。

操作系统的模块通常按照功能划分为几个核心子系统：

* 进程管理子系统负责程序的执行和调度
* 内存管理子系统管理内存的分配和回收
* 文件系统管理子系统负责数据的存储和组织
* 设备管理子系统控制硬件设备的访问
* 网络子系统处理网络通信

这些子系统通过定义良好的接口进行交互，共同协作完成操作系统的各项功能。

操作系统的任务之一就是组织和管理计算机系统中的硬件以及软件资源。在操作系统内部，为了掌控整个计算机系统的硬件和软件资源，设计了各种不同类型的表格和数据结构，对所有硬件和软件资源进行分级管理。

将资源的名称、类型、数量、用途、完好状态及当前使用状态等信息，均保存在相关的数据结构中，并对这些数据进行动态、实时的更新。

记录数据的目的是让操作系统根据用户对各种资源的需求情况、资源的当前分配和使用情况及有关的资源调度策略，对资源进行有效的组织和管理。常见的数据结构包括：

* 进程控制块（PCB）用于管理进程状态
* 页表用于虚拟内存管理
* 文件控制块（FCB）用于文件系统管理
* 设备控制块（DCB）用于设备管理等

### 操作系统的特征

操作系统具有并发性、共享性和随机性等基本特征。这些特征共同构成了操作系统的核心特性。

#### 并发性

并发性是操作系统最重要的特征之一。它使得多个程序能够在同一时间段内运行，提高了系统的资源利用率和响应速度。

操作系统通过进程管理和调度机制实现并发性，将 CPU 时间划分为时间片，在不同程序之间快速切换，给用户造成多个程序同时运行的错觉。

并发性是指在计算机系统中同时存在若干个正在运行的程序，这些程序在逻辑上同时向前推进。

操作系统通过进程调度算法（如先来先服务、时间片轮转、优先级调度等）决定哪个程序在何时获得 CPU 执行权，确保系统资源的公平分配和高效利用。

并发性不同于并行性：并发强调多个任务在重叠的时间段内执行，而并行强调多个任务在同一时刻同时执行。

计算机程序的并发性体现在多个方面，其中之一是用户程序之间的并发执行。操作系统为每个运行的程序创建进程或线程，维护其执行状态，并在它们之间进行上下文切换。

上下文切换涉及保存当前进程的寄存器状态、程序计数器等信息，并恢复下一个进程的执行环境。

在单处理器环境下，这些同时运行着的程序是交替在处理器上运行的。

在多处理器系统环境中，多个程序的并发特征在宏观上是并发的，在微观层面上（即处理器层面），程序也可以并发执行。

在分布式系统中，多个计算机的并存使程序的并发特征得到了更加充分的体现。因为在每台计算机上都可以有程序执行，这些程序共同构成了并发执行的整体状态。

#### 共享性

共享性是操作系统的另一个重要特征。它允许多个程序或用户共同使用系统中的资源，提高了资源的利用效率。

操作系统通过资源分配和同步机制实现资源共享，确保多个程序能够安全、高效地访问系统资源，避免冲突和数据不一致。

共享性是指操作系统与多个用户程序共用系统中的各种资源。这种共享性是在操作系统控制下实现的。

操作系统采用不同的资源共享策略：对于可重入资源（如只读代码），允许多个程序同时访问；对于不可重入资源（如打印机），需要通过互斥机制确保同一时间只有一个程序使用。

资源的共享性主要体现在计算机系统中的以下几项重要资源：

**中央处理器。** 中央处理器是所有程序都必须使用的重要资源。操作系统必须采用合适的调度策略，对多个并发程序分配处理器资源。

常见的 CPU 调度算法包括先来先服务（FCFS）、最短作业优先（SJF）、优先级调度和时间片轮转（RR）等，这些算法在不同场景下平衡了公平性、响应时间和系统吞吐量。

**内存储器。** 即“内存”，任何一个程序必须首先调入内存之后才能执行。管理内存的共享使用是操作系统的重要功能之一。操作系统通过虚拟内存技术为每个程序提供独立的地址空间，使用分页或分段机制将物理内存映射到虚拟地址空间，并通过页面置换算法（如 LRU、FIFO）管理内存分配，确保多个程序能够安全共享有限的内存资源。

**外存储器。** 外存储器主要用于保存各种程序和数据。这些程序和数据一般以文件的形式存储在外存储器上，外存储器具有多种类型（如上表所示）。

这些外存储器都是为所有的程序和数据共享的，操作系统同样必须对外存储器的共享进行管理，并且保证在外存储器中所有程序和数据的完整性和正确性。文件系统通过目录结构、访问控制列表（ACL）和文件锁等机制管理文件的共享访问。

**外部设备。** 外部设备是供所有用户使用的，这些用户包括操作系统、系统用户（如管理员）和普通用户。

操作系统必须对不同用户使用外部设备的请求进行管理，使所有外部设备能够按照既定策略被各类用户共享。设备管理子系统通过设备驱动程序抽象硬件细节，使用缓冲、假脱机（SPOOLing）和设备分配算法管理设备访问，提高设备利用率和系统性能。

#### 随机性

操作系统运行在一个充满不确定性的环境中，需要随时应对各种随机事件，确保系统的稳定运行。

操作系统通过中断处理、异常处理和事件驱动机制来应对随机性，确保系统在不可预测的环境中保持稳定性和可靠性。

操作系统的运行是在一种具有随机性的环境下进行的。这种随机环境的含义是，操作系统不能对任何所运行程序的行为及硬件设备情况做出任何事先的假定；硬件有可能在任何时候向 CPU 发出中断请求。用户提交的、运行着的程序要做什么事情也无法事先知道。

操作系统当前所处的具体状态难以事先准确确定，但随机性并不意味着操作系统无法有效控制资源的使用和程序的运行。随机性强调：在操作系统的设计与实现过程中必须充分考虑各种可能情况。

操作系统通过中断机制处理硬件随机事件：当硬件设备需要 CPU 注意时（如磁盘 I/O 完成、网络数据到达），会发出中断信号，CPU 暂停当前执行，保存现场，跳转到中断处理程序，处理完后再恢复原程序执行。

通过异常处理机制应对程序错误（如除零错误、页面故障），确保系统不会因程序错误而崩溃。

通过事件驱动架构响应外部事件（如用户输入、定时器到期），使系统能够及时处理各种异步事件。

## 课后习题

1. 构建一个最小的多任务调度器原型，实现两个程序在单处理器上的交替执行，并验证其并发特征。
   * 使用你喜欢的编程语言编写一个简单的调度器，定义进程控制块（PCB）结构体包含进程 ID、程序计数器、寄存器状态等信息
   * 实现时间片轮转调度算法，设置固定时间片长度（如 100 ms）
   * 创建两个简单的测试程序（如无限循环打印不同标识符），通过调度器交替执行
   * 观察输出结果，验证两个程序是否在逻辑上同时向前推进
2. 选取现代操作系统（如 FreeBSD）的内存管理机制，重构其最小实现版本。
   * 研究 FreeBSD 的虚拟内存系统架构，了解其分页机制和页面置换算法
   * 实现简化的分页系统，包括页表结构、地址转换和页面错误处理
   * 模拟物理内存有限的情况，实现最近最少使用（LRU）页面置换算法
   * 测试不同内存访问模式下的页面错误率和系统性能
3. 修改调度器的优先级分配策略，观察程序运行顺序的变化。
   * 在已有调度器基础上，将优先级字段添加到 PCB 结构
   * 实现优先级调度算法，高优先级进程优先获得 CPU 时间
   * 创建多个具有不同优先级的测试进程
   * 观察不同优先级分配策略下进程的执行顺序和系统响应时间变化
   * 分析优先级反转问题及其解决方案
