一篇围绕 Unix 展开的操作系统概述笔记。

每当介绍操作系统时,往往无非分成这样几个章节
- 概述 - 操作系统的作用/组成/发展历史
- 进程 - 操作系统分配资源的最小单位
- 内存管理 - 内存如何虚拟化,操作系统如何分配内存资源
- 文件管理 - 文件系统与磁盘
- I/O - 磁盘/网络/终端等设备
本篇聚焦概述部分,以 Unix 为例自顶向下简要梳理。
一、操作系统的作用
操作系统主要指内核(kernel),它长期驻留在内存中,负责最核心的系统管理。其作用可归纳为三类:
| 作用 | 内容 |
|---|---|
| 资源分配 | 决定各用户作业如何分配 CPU、内存、I/O 等有限资源 |
| 提供抽象 | 封装硬件,通过编程接口让程序便捷操作硬件 |
| 权限管理 | 决定进程可访问哪些资源及如何安全访问 |
1. 资源分配
操作系统的资源分配以进程为基本单位。进程是”正在运行的程序实例”,包含:
- 进程标识:
pid、ppid - 执行现场:程序计数器、寄存器
- 地址空间:代码区、数据区、堆、栈
- 文件描述符表
- 调度信息:优先级、运行状态
多个进程的资源请求会彼此冲突——内核统一管理的必要性即在于此:
| 资源类型 | 冲突场景 | 内核职责 |
|---|---|---|
| CPU | 多个进程都想占用 CPU | 调度 |
| 内存 | 物理内存有限 | 映射、保护、换出 |
| I/O | 设备需排队使用 | 安排 I/O 顺序 |
从 CPU 角度看,调度即内核决定”下一个让谁运行”。时钟中断使内核能周期性夺回控制权,保存当前进程现场后切换到其他进程——多个进程因此看似”同时运行”。
2. 提供抽象
操作系统将底层硬件封装为统一接口,程序员无需面对寄存器、控制器和设备时序:
| 底层真实对象 | 操作系统抽象 | 常见接口 |
|---|---|---|
| CPU | 进程/执行流 | fork exec wait |
| 物理内存 | 虚拟地址空间 | mmap brk |
| 磁盘与目录项 | 文件与目录 | open read write close |
| 终端、管道、socket | 文件描述符 | read write socket |
Unix 的核心风格:将多种底层对象统一到文件描述符与读写接口附近——普通文件、管道、终端、套接字虽然底层不同,但面向程序员的接口一致。
3. 权限管理
权限分为两层:
| 层次 | 解决的问题 | 典型机制 |
|---|---|---|
| 用户态/内核态 | 用户程序不能直接执行特权操作 | 硬件模式位、trap、中断 |
| 用户之间 | 不同用户能访问哪些资源 | 用户身份、文件权限位、访问控制 |
第一层——用户态与内核态的边界:
| 模式 | 能力 |
|---|---|
| 用户态 | 运行普通应用程序,不可直接执行特权指令 |
| 内核态 | 访问关键硬件资源,执行特权操作 |
应用程序运行在用户态。执行特权操作(读文件、创建进程、申请内存)时,通过系统调用陷进内核:
| 阶段 | 操作 |
|---|---|
| 1. 准备参数 | C 函数封装系统调用号和参数 |
| 2. 执行特殊指令 | 底层汇编入口执行系统调用指令 |
| 3. 跳转内核入口 | CPU 根据向量表转入内核 |
| 4. 保存现场 | 硬件保存基本信息,内核继续保存进程现场 |
| 5. 切换权限级 | CPU 从用户态进入内核态 |
| 6. 执行内核服务 | 内核根据系统调用号完成操作 |
| 7. 恢复并返回 | 恢复寄存器和状态,回到用户态 |
中断与陷阱(trap)的共同点:均打断当前执行流、将控制权交给内核、需保存和恢复现场、可导致用户态→内核态切换。
区别:
| 对比项 | 中断 interrupt | 陷阱 trap |
|---|---|---|
| 触发来源 | 外部硬件事件(时钟、磁盘、键盘) | 程序主动执行特定指令或触发异常 |
| 与当前指令关系 | 不一定由当前指令直接引起 | 通常与当前指令直接相关 |
| 时机 | 异步 | 同步 |
| 常见用途 | I/O 完成通知、时钟打点 | 系统调用、缺页、非法指令 |
| 是否由程序主动发起 | 否 | 通常是 |
- 中断:外设通知 CPU 有事件需处理
- trap:当前程序必须立即进入内核处理
第二层——用户之间的权限控制——通过 Unix 文件系统的 rwx 权限位与进程所属用户身份实现。
二、操作系统的组成
操作系统按管理的硬件资源分为四类模块:
- 进程与调度管理:将 CPU 组织为多进程共享的执行环境
- 内存管理:将物理内存组织为进程可用的地址空间
- 文件系统:将磁盘数据组织为文件与目录
- I/O 子系统与设备驱动:管理其他外设,提供统一访问方式
系统调用、中断、异常、权限检查等是贯穿上述模块的公共机制,不与之并列。
一个 read 调用将这些模块串联起来:用户进程通过系统调用进入内核→查文件描述符表→查页缓存→缓存未命中则定位文件数据块→发起磁盘 I/O→I/O 完成通过中断通知内核→数据拷回用户缓冲区并返回。
1. 宏内核与微内核
内核的扩展方式有两类:
| 方式 | 特点 |
|---|---|
| 修改源码后重新编译 | 改动直接进入内核本体 |
| 动态加载模块或驱动 | 运行时按需加入功能 |
核心区别在于扩展代码运行在哪个权限级别:更多功能直接跑在内核态即宏内核,仅最基本机制留在内核态、更多服务放在用户态即微内核。
1.1 宏内核
宏内核(monolithic kernel)将大部分核心功能放在内核态:调度、内存管理、文件系统、网络栈、设备驱动等均在内核态运行。
| 方面 | 说明 |
|---|---|
| 运行位置 | 大部分系统服务直接运行在内核态 |
| 优点 | 模块通信直接,性能通常较好 |
| 代价 | 内核体积较大,单模块出错可能影响全局 |
| 代表 | Unix、Linux |
1.2 微内核
微内核(microkernel)只将最基本机制留在内核态(地址空间管理、线程调度、进程间通信等),文件系统、驱动、网络服务等放在用户态服务中。
| 方面 | 说明 |
|---|---|
| 运行位置 | 最基本机制在内核态,更多服务在用户态 |
| 优点 | 模块隔离好,局部故障不拖垮全局 |
| 代价 | 服务间消息传递开销明显 |
| 设计重点 | 机制留内核,策略与服务外移 |
实际系统中多采用折中设计,而非纯粹某一类型。
2. Unix 视角下的系统组成
从 Unix 使用者视角,整台机器分为四层:
| 层次 | 内容 |
|---|---|
| 应用程序 | 编辑器、浏览器、数据库、业务程序 |
| 系统程序 | init、Shell、守护进程、编译器、基础命令 |
| 内核 | 调度、内存管理、文件系统、驱动等核心机制 |
| 硬件 | CPU、内存、磁盘、终端、网络设备 |
内核不等同于整套操作系统发行版——平时安装使用的系统除内核外还包括大量系统程序与用户空间工具。操作系统原理课程语境中,”操作系统”一般主要指内核。
系统启动流程:固件引导程序启动→初始化基本硬件并加载内核→内核初始化核心子系统→拉起最早的用户空间系统进程(如 init)。
三、发展历史
| 阶段 | 重点 |
|---|---|
| 早期计算机 | 机器昂贵,尽量让硬件持续工作 |
| 多道程序/分时系统 | 多个作业或用户共享一台机器 |
| Unix 出现后 | 形成进程、文件描述符、管道、可组合工具等经典风格 |
| 现代操作系统 | 面向桌面、服务器、移动端、嵌入式、云环境等场景 |
Unix 的主要影响:
- 进程作为核心执行单位
- 文件描述符统一多种 I/O 接口
- “小程序 + 管道”组合复杂任务
- 偏向简洁、稳定、可组合的接口
现代系统按场景的侧重点:
| 场景 | 关注点 |
|---|---|
| 个人计算机 | 交互体验 |
| 服务器 | 吞吐量、稳定性、隔离 |
| 移动设备 | 能耗、响应速度、安全模型 |
| 嵌入式系统 | 专用性、可靠性、成本 |
macOS 的内核 Darwin 源自 BSD,与 Unix 联系紧密。
操作系统形态虽多变,核心问题不变:管理有限硬件资源、向上提供统一抽象、在共享环境中保证安全与秩序。
四、小结
简要表述如下:
| 主题 | 核心点 |
|---|---|
| 操作系统的作用 | 资源分配、提供抽象、权限管理 |
| 资源分配 | 以进程为基本单位,协调 CPU/内存/I/O 的竞争访问 |
| 提供抽象 | 封装硬件为统一接口,Unix 风格以文件描述符为统一句柄 |
| 权限管理 | 用户态/内核态边界 + 用户间权限控制,两层分离 |
| 操作系统组成 | 进程管理、内存管理、文件系统、I/O 子系统;宏内核与微内核两种架构 |
| 核心机制 | 中断(外部异步通知)与陷阱(程序同步进入内核),共同构成内核入口 |
后续的进程、内存、文件系统和 I/O 各章,均是本文概述内容的逐层展开。