操作系统

操作系统概述是课程的开篇模块,涵盖操作系统的定义、功能、发展历史、系统结构、中断与异常机制以及系统调用接口。该模块帮助学生建立对操作系统角色的整体认知——OS 既是计算机资源的管理者,也是应用程序的运行平台,核心目标是提高资源利用率、方便用户使用。

核心概念

操作系统概念

定义

  • 操作系统 是软硬资源的控制中心,以合理有效的方法组织多个任务共享使用计算机的各种资源,并提供编程和使用接口。
  • 层次:硬件 — 操作系统 — 应用程序
  • 狭义 OS = 内核(本课程聚焦);广义 OS = 内核 + 系统调用 + GUI + 其他系统组件

目的

  • 方便用户:屏蔽硬件细节,提供命令行/GUI/编程接口,简化用户使用
  • 提高资源利用率:协调 CPU、内存、I/O 设备等资源,减少闲置浪费

四个核心管理功能

  • 处理机管理进程管理):进程创建/撤销/调度/同步,分配 CPU 资源
  • 存储管理:内存分配回收、地址映射、保护、扩充(虚拟内存)
  • 文件管理:文件组织、存储、命名、快速检索、共享保护
  • 设备管理:I/O 设备分配驱动、缓冲管理、中断处理

用户接口

  • 操作接口:面向普通用户(命令行 CLI、图形界面 GUI、语音/视觉等多通道交互)
  • 编程接口:面向程序员(系统调用 API,应用程序请求内核服务的唯一方式)

资源共享方式

  • 空分共享(空间复用):资源按空间划分,不同应用各占一块。典型:内存(不同进程加载到不同区域)、硬盘(多文件共享空间)
  • 分时共享(时间复用):资源按时间段轮流使用。典型:CPU(不同任务按时间片交替执行)
  • 独占式共享:一次只允许一个任务使用(如打印机)
  • 分时式共享:可间断穿插多个任务(如 CPU 时间片轮转)

用户类型

  • 最终用户:通过操作接口使用计算机(点击图标、输入命令)
  • 程序员:通过编程接口(系统调用)开发应用程序

作为接口的示意图

用户
应用程序
系统调用 | 命令 | 图标、窗口
操作系统
计算机硬件

操作系统最基本的功能

  • 进程管理
  • 存储管理
  • 文件管理
  • 设备管理
  • 用户接口
指向原始笔记的链接

发展历程

操作系统发展历史

发展阶段

无操作系统时代(40 年代 — 50 年代中期)

  • 人工操作,无 OS,用户独占全机
  • 程序通过打卡(纸带/卡片)输入
  • 问题:CPU 高速计算 vs 人工低速 I/O,CPU 大部分时间在等待,资源利用率极低
  • 关键驱动:ENIAC(1946 年)弹道科学计算需求

单道批处理时代(50 年代)

  • 监督程序 Monitor 出现:OS 雏形,常驻内存,代替人工 I/O
  • 自动性:一批任务预先装好,Monitor 依次自动启动
  • 单道:每次仍只执行一个任务,无并发性
  • 核心概念:作业(Job)、作业步(Job Step)、作业控制语言(JCL)
  • 特征:自动性、顺序性、单道
  • 缺点:无共享能力,不是真正意义上的 OS(本质区别:无并发性
  • 关键驱动:减少人工干预,提高自动化程度

多道批处理时代(60 年代初)

  • 硬件基础:通道技术、磁盘技术、中断技术
  • 核心思想:内存中同时加载多个作业,CPU 交替执行
  • 关键技术
    • Buffer(缓冲):CPU 直接从 buffer 取数据,无需等待慢速 I/O
    • 通道(Channel):专用 I/O 处理机,负责内存和外存间的数据交换
    • 中断(Interrupt):I/O 完成后主动通知 CPU,CPU 可干别的事
    • SPOOLing:把磁盘作为大缓冲区,慢速设备→磁盘→内存→CPU
  • 宏观并行(多任务同时推进),微观串行(单 CPU 交替执行)
  • OS 两大基本特征在此产生:并发(Concurrency)和共享(Sharing)
  • 优点:资源利用率更高、吞吐量更大
  • 缺点:平均周转时间变长、无交互能力
  • 多道程序设计引入进程概念:为描述程序并发执行的动态过程,引入进程(Process)作为资源分配和独立运行的基本单位

分时系统时代(60 年代)

  • 推动力:键盘、鼠标、显示器等交互终端出现
  • 定义:交互式系统 + 多道程序设计思想的结合
  • 原理:CPU 按时间片轮流服务于多个用户终端(时间片轮转)
  • 特征
    • 并发:多用户同时使用计算机
    • 共享:多任务共享主机资源
    • 交互性:用户通过终端与系统实时交互
    • 独立性:各终端互不干扰
    • 及时性:可接受响应时间内反馈
  • 关键驱动:人机交互需求增长

实时系统时代(60 年代)

  • 定义:强调反馈实时性,用于时间要求严格的场景
  • 典型场景:高铁控制、飞行控制、武器系统、医疗设备、银行系统
  • 特征
    • 实时性:时间分辨度高,能及时响应中断
    • 高可靠性:系统稳定性要求极高
    • 专用性:定制化系统
    • 多级中断机制:保障快速响应
    • 剥夺式调度:实时任务可无条件剥夺非实时任务的 CPU
  • 关键驱动:工业控制、航空航天等对时间约束的硬性要求

多方式(通用)操作系统时代(60-70 年代)

  • 兼具批处理、分时、实时功能的通用操作系统
  • 代表:Windows、Linux、UNIX
  • 多种操作系统模式并存发展

分布式/网络/多机系统时代(70 年代后)

  • 分布式系统:多机协同,资源共享,支撑云平台、大模型运算
  • 网络系统:远程通信与资源共享
  • 多机系统:多处理器架构,并行调度
  • 关键驱动:网络技术发展、算力需求增长

发展趋势

  • 虚拟化、云计算、嵌入式(鸿蒙/iOS)、物联网、AI 异构算力协同
  • AI 时代 OS:交互方式向意图理解发展,核心角色从资源管理向任务规划演进
指向原始笔记的链接

结构与运行模型

操作系统结构

典型结构

整体式结构(单内核)

  • 所有操作系统功能在内核态运行
  • 效率高,但模块耦合紧密

微内核结构

  • 内核只保留最基本功能(进程通信、中断处理等)
  • 其他功能(文件系统、设备驱动等)在用户态实现
  • 高可靠性、可扩展性

分层结构

  • 按功能层次组织,下层向上层提供服务

重点 运行模型

根据 OS 的运行方式,分为三种模型:

① 非进程内核模型

  • 内核运行在任何进程上下文之外,以一个独立的内核映像存在
  • 内核代码不依附于任何用户进程,拥有自己独立的栈和内存区域
  • 实际例子
    • MS-DOS:整个 OS 是一个常驻内存的程序,与用户程序完全分离
    • 传统 UNIX(早期):核心常驻内存,中断/异常直接在核心态处理,不涉及进程切换
  • 特点:简单直接,但缺乏灵活性

② OS 功能在用户进程内执行的模型

  • OS 内核代码在用户进程的上下文中执行
  • 当进程通过系统调用中断与异常陷入内核时,进程本身切换到核心态继续运行(使用进程自己的内核栈)
  • 内核代码共享进程的地址空间(仅核心态部分)
  • 实际例子
    • Linux:进程调用 read() → 陷入内核 → 在当前进程上下文中执行内核代码(sys_read)→ 返回用户态。操作系统-错误 和 top 显示的 sy%(内核态 CPU 时间)就是这部分
    • Windows NT 内核:系统服务分发后,在调用线程的上下文中执行内核函数
  • 特点:性能好(无需额外上下文切换),现代主流 OS 的模式

③ OS 功能作为独立进程执行的模型

  • OS 的各功能模块作为独立的内核/系统进程运行
  • 用户进程通过进程间通信(IPC) 向这些系统进程请求服务
  • 代表微内核结构
  • 特点:高模块化/可靠性(一个模块崩溃不影响整个系统),但 IPC 开销大
模型典型 OS性能健壮性
非进程内核MS-DOS、早期 UNIX
用户进程内执行Linux、Windows NT
独立进程执行MINIX、QNX、Mach中(IPC 开销)

用户接口

  • 命令接口(命令解释器 / shell)
  • 程序接口(系统调用
  • 图形用户接口(图标、窗口)
指向原始笔记的链接

中断与异常

中断与异常

定义

  • 指系统发生某个异步/同步事件后,处理机暂停正在执行的程序,转去执行处理该事件程序的过程。

引入目的

  • 开发 CPU 与通道(或设备)之间的并行操作
  • 实现 I/O 完成后通知 CPU(CPU 无需轮询等待)

广义中断分类

外中断(狭义中断)

  • 硬件逻辑产生,与当前执行指令无关
  • 可屏蔽
  • 典型:I/O 完成中断、时钟中断、设备故障中断

内中断(异常/例外)

  • 来源于当前运行的程序,与当前指令有关
  • 不可屏蔽
  • 典型:
    • trap 指令(陷入指令):程序主动触发,用于实现系统调用
    • 缺页异常(Page Fault):访问的页面不在内存,需从外存调入
    • 除零、越界访问等非法指令
    • debug 断点

中断的分级

  • 不同优先级的中断,高优先级可打断低优先级

中断/异常处理流程

  1. 保存现场(Save Context):暂停当前程序,保存 CPU 寄存器、程序计数器等现场信息
  2. 分析原因:判断中断/异常类型,找到对应的处理程序入口
  3. 处理(Handle):执行中断/异常处理子程序
  4. 恢复现场(Restore Context):恢复之前保存的现场,返回被中断程序继续执行

作用

  • 是 CPU 与 I/O 设备并行工作的基础(CPU 无需等待慢速 I/O,完成时由中断通知)
  • 驱动内核执行——内核是中断驱动的,需中断/异常激发内核代码运行
  • trap 指令实现用户态到核心态的切换,是② OS 功能在用户进程内执行的模型的触发机制
  • 实现并发和 I/O 操作的基础

中断/异常处理示例

  • 缺页异常:程序访问虚拟地址 → 硬件发现页表合法位=0 → 产生缺页异常 → CPU 切换至核心态 → OS 缺页处理程序从外存调入页面 → 更新页表 → 恢复现场继续执行
  • 系统调用:用户程序执行 trap 指令 → 软件触发异常 → CPU 切至核心态 → 按系统调用号分发执行 → 返回用户态
指向原始笔记的链接

系统调用

系统调用

定义

  • 操作系统提供给应用程序的编程接口
  • 用户态程序请求内核服务的唯一方式

与用户级函数调用的区别

维度系统调用普通函数调用
运行状态用户态→核心态切换仅在用户态执行
实现机制需 trap 指令(中断与异常普通 call/jmp 指令
执行特权可执行特权指令(访问硬件)只能执行普通指令
返回机制涉及现场恢复和重新调度简单返回

分类

  • 进程控制(fork、exit、wait)
  • 文件操作(创建、打开、读、写、关闭、删除)
  • 设备管理
  • 信息维护
  • 通信(pipe、shmget、socket)

系统调用编号分发机制

  • 每个系统调用有唯一系统调用号
  • 用户程序将系统调用号存入特定寄存器
  • 进入内核后,内核根据系统调用号查系统调用表(sys_call_table),跳转到对应处理函数
  • 不同 OS 的系统调用表不同 → 安装包不通用

参数传递方法

  • 寄存器传递:参数通过特定寄存器传递(速度快,数量有限)
  • 栈传递:参数压入用户栈
  • 内存传递:参数存入内存块,将内存地址传入寄存器

执行流程

  1. 用户程序执行到系统调用
  2. trap 指令:CPU 态制位(用户态→核心态)
  3. 保护现场,保存寄存器状态
  4. 根据系统调用号查系统调用表,进入对应处理入口
  5. 参数通过寄存器/栈/内存传递
  6. 执行内核态服务(核心态可执行特权指令直接访问硬件)
  7. 结果写回寄存器
  8. 恢复现场,返回用户态继续执行

write 系统调用完整路径示例

用户程序 printf → C 标准库函数 → write() 系统调用 → trap 指令进入内核 → 内核根据系统调用号分发 → VFS(虚拟文件系统)层 → 文件系统驱动定位文件物理位置 → 磁盘驱动程序 → DMA 传输 → CPU 让出给其他程序 → 磁盘中断(传输完成)→ 中断处理程序唤醒等待进程 → 恢复现场 → 返回用户程序

示例关系

  • printf(C 标准库函数)→ write(系统调用)→ 输出到设备
  • fopen/fclose/fread/fwrite 等库函数底层均封装对应系统调用
指向原始笔记的链接

对比:操作系统结构

  • 整体式结构与 微内核结构 对比
    • 整体式:所有功能在内核态,效率高耦合紧
    • 微内核:仅保留基本功能,其他在用户态,可靠性高