408 OS
计算机系统概述
知识树
概述
进程
同步
死锁
内存
文件
I/O
🖥️ 计算机系统概述
操作系统定义 · 四大特征 · 内核态/用户态 · 中断与异常 · 系统调用 · OS结构 · 启动流程
定义与功能
四大特征
内核态与用户态
中断与异常
系统调用
OS结构
启动流程
📛 操作系统的定义与四大功能
操作系统是控制和管理整个计算机系统的最小层的系统软件
📖 定义(408标准表述):
操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源分配,以提供给用户和其他软件方便的接口和环境。它是计算机系统中最基本的
系统软件
。
🔑 三个关键点:
① 操作系统是
系统软件
(不是硬件,不是应用软件)
② 提供两大接口:
命令接口
(用户直接用)和
程序接口
(系统调用,给程序员用)
③ 目标:
方便用户使用
+
提高系统效率
操作系统的四大功能
🧠
处理器(CPU)管理
进程/线程的创建、撤销、调度、同步与通信,合理分配CPU时间
🧠
存储器管理
内存分配与回收、地址映射、内存保护与共享、内存扩充(虚拟内存)
📁
文件管理
文件的创建/删除/读写、目录管理、文件保护、磁盘空间管理
🖥️
设备管理
I/O设备分配与回收、缓冲管理、设备独立性、SPOOLing技术
⚡ 接口类型(考点!):
① 命令接口:
用户直接使用的接口
· 联机命令接口(交互式):用户在终端输入命令,系统立即执行并返回结果(如 Linux shell)
· 脱机命令接口(批处理):用户把一系列命令写在脚本里,系统批量执行(如 .bat / shell 脚本)
② 程序接口(系统调用):
用户通过程序(代码)间接使用的接口
· 程序员在程序里调用系统调用(如 read()、write()、fork())
· 是操作系统提供给应用程序的唯一接口
📝 408易混点:
系统调用 ≠ 函数调用!系统调用会触发
陷入指令
(trap),从用户态切换到内核态;普通函数调用一直在用户态。
🌟 操作系统的四大特征
并发、共享、虚拟、异步 —— 408超高频考点,四个特征的关系要搞清楚
🔑 四个特征的关系:
·
并发和共享
是最基本的特征,二者互为存在条件(没有并发就没有共享,没有共享就谈不上并发)
·
虚拟
和
异步
是并发和共享的延伸和表现
· 考试常问:"哪个是最基本的特征?" → 答:
并发与共享
① 并发(Concurrence)
定义:
多个事件在同一时间间隔内发生(宏观上同时,微观上交替执行)
并发 vs 并行:
·
并发
:多个事件在
同一时间间隔
内发生(单CPU也能实现,靠时间片轮转)
·
并行
:多个事件在
同一时刻
发生(必须要有多个CPU同时执行)
📝 典型考点:
· 单CPU系统:并发存在,并行不存在
· 多CPU(多核)系统:并发和并行都存在
· 程序的
顺序执行
:顺序性、封闭性、可再现性
· 程序的
并发执行
:间断性、失去封闭性、不可再现性
▲ 并发(单CPU时间片轮转)vs 并行(多CPU同时执行)—— 动画循环演示
② 共享(Sharing)
定义:
系统中的资源可供内存中多个并发执行的进程共同使用
两种共享方式:
·
互斥共享
(临界资源):一段时间内只允许
一个
进程访问
例:打印机、磁带机、变量(需要互斥访问)
·
同时共享
:一段时间内允许
多个
进程"同时"访问(宏观上同时,微观可能交替)
例:磁盘I/O、文件读操作(读不修改内容,可以并发读)
📝 考点:
临界资源(独占资源)是指一段时间内只允许一个进程访问的资源。实现互斥共享需要
同步机制
(即后面章节的进程同步)。
③ 虚拟(Virtualization)
定义:
把一个物理实体映射为若干个逻辑上的对应物(物理→虚拟,实际→表面)
两种虚拟化技术:
·
时分复用
:虚拟处理器(多道程序技术,每个进程感觉有自己独立的CPU)
·
空分复用
:虚拟内存(离散分配,让用户感觉内存比实际大)、虚拟磁盘(SPOOLing技术)
📝 考点:
"虚拟"的本质是
复用
—— 时间复用(CPU)和空间复用(内存/磁盘)。
④ 异步(Asynchrony)
定义:
系统中的进程以
不可预知的速度
向前推进(进程的执行不是一气呵成的,而是走走停停)
原因:
进程在运行过程中可能被中断(时间片到、等待I/O等),然后过一段时间再继续运行
⚡ 关键考点:
虽然进程的执行是异步的,但操作系统必须保证
运行结果的可再现性
(即多次运行,只要输入相同,输出必须相同)。这是进程同步要解决的问题!
🔐 内核态与用户态
CPU的两种运行状态,特权指令只能在内核态执行
📖 两种状态:
·
内核态(Kernel Mode / 管态):
CPU可以执行
所有指令
,访问
所有内存地址
,拥有最高特权
·
用户态(User Mode / 目态):
CPU只能执行
非特权指令
,访问
受限的内存地址
🔑 哪些指令是特权指令?
一切可能影响系统安全/其他进程的指令:
· 有关I/O的指令(I/O指令、中断屏蔽指令)
· 有关访问程序状态的指令(置程序状态字PSW、切换模式)
· 修改特殊寄存器的指令(页表基地址寄存器、段表基地址寄存器)
· 停机指令(HALT)
⚡ 状态切换:
·
用户态 → 内核态:
只能通过
中断/异常/系统调用
(trap指令/INT指令/ SYSCALL指令)触发
·
内核态 → 用户态:
通过
设置PSW标志位
(加载新的PSW)实现,操作系统主动退出内核态
▲ 点击「用户态→内核态」或「内核态→用户态」按钮,观看状态切换动画
用户态 → 内核态(系统调用)
内核态 → 用户态(返回用户程序)
重置
📝 408高频考点:
① "用户态到内核态的切换是由谁触发的?" →
硬件
(中断/异常机制由CPU硬件实现)
② "内核态到用户态的切换是由谁触发的?" →
操作系统
(软件设置PSW)
③ "哪些事件会导致用户态切换到内核态?" → 系统调用、中断、异常(缺页异常、除零异常等)
④ "哪些指令只能在内核态执行?" → I/O指令、停机指令、设置PSW、加载页表基址等特权指令
⚡ 中断与异常
中断是操作系统的脉搏 —— 用户态切换到内核态的唯一方式是中断/异常
📖 中断 vs 异常(广义中断 = 中断 + 异常):
·
中断(Interrupt):
由
外设
引发,与当前执行的指令
无关
,是异步的
例:I/O完成中断、时钟中断、键盘输入中断
·
异常(Exception/Trap):
由
CPU正在执行的指令
引发,是同步的
例:缺页异常(Page Fault)、除零错误、越界错误、系统调用(trap intentionally)
⚡ 处理流程(核心考点!):
保存断点 → 识别中断源 → 执行中断处理程序 → 恢复现场
▲ 中断处理完整流程(点击步进观看)
▶ 步进(下一步)
↺ 重置
▶ 自动播放
中断处理详细步骤(408标准答案版)
Step 1 — 关中断:
CPU在响应中断后,首先要
关闭中断
(防止在保存现场时被新的中断打断)
Step 2 — 保存断点:
将
程序计数器(PC)
的值(即断点)保存到栈或特定寄存器
Step 3 — 识别中断源:
读取中断向量表,找到对应中断处理程序的入口地址
Step 4 — 保存现场:
将
CPU所有寄存器
(PSW、通用寄存器等)保存到内核栈
Step 5 — 执行中断处理程序:
转入中断处理程序,执行具体的I/O操作或其他处理
Step 6 — 恢复现场:
从内核栈恢复所有寄存器的值
Step 7 — 开中断:
重新允许中断
Step 8 — 返回断点:
恢复PC的值,继续执行原来被中断的程序
📲 系统调用(System Call)
系统调用是操作系统提供给应用程序的唯一接口,是程序接口的核心
📖 什么是系统调用?
系统调用是操作系统
在内核态
提供的一组函数,应用程序通过
陷阱指令(trap/SYSCALL)
来请求操作系统提供服务。
🔑 常见系统调用类型:
·
进程控制:
fork()、exit()、wait()
·
文件操作:
open()、close()、read()、write()
·
设备管理:
ioctl()、read()、write()
·
信息维护:
getpid()、alarm()、sleep()
·
通信:
pipe()、shmget()、msgget()
⚡ 系统调用 vs 库函数:
· 库函数(如C语言的 printf())可能调用系统调用(如 write()),也可能不调用
· 系统调用是操作系统提供的接口,库函数是语言提供的接口
· 系统调用需要
切换到内核态
,开销比普通函数调用大
▲ 系统调用执行完整过程(点击步进观看)
▶ 步进(下一步)
↺ 重置
▶ 自动播放
系统调用执行过程(详细步骤)
1
【用户态】
应用程序调用库函数(如 printf())
2
【用户态】
库函数将系统调用号放入特定寄存器(如 x86 的 EAX)
3
【用户态】
执行
trap/SYSCALL
指令 →
触发软中断,切换到内核态
4
【内核态】
保存用户态上下文(PC、PSW、寄存器等)到内核栈
5
【内核态】
根据系统调用号,查找
系统调用表
,找到对应内核函数的地址
6
【内核态】
执行内核函数(如 sys_write()),完成实际工作
7
【内核态】
恢复用户态上下文,设置返回值为用户态可访问
8
【用户态】
从 trap 指令后继续执行,通过返回值判断调用是否成功
🏗️ 操作系统的结构
从简单到复杂,OS结构经历了多次演进 —— 这部分是408高频考点!
📖 操作系统结构的演进:
无结构(第一代) → 模块化(第二代) → 分层式(第三代) →
宏内核/微内核
(现代)
⚡ 408最常考:宏内核(Monolithic)vs 微内核(Microkernel)
🔵 宏内核(Monolithic Kernel)
所有系统功能都在内核态运行
优点:
性能好(各模块直接函数调用,无需切换)
缺点:
内核代码庞大、bug影响整个系统、移植性差
典型系统:
Linux、UNIX、Windows(早期)
408考点:
宏内核切换
不需要
消息传递,速度快
🟠 微内核(Microkernel)
只把最基础功能放内核态,其他在用户态
优点:
内核小、稳定性高、易于移植、各服务独立
缺点:
性能较差(需要多次
用户态↔内核态切换
)
典型系统:
Mach、MINIX 3、QNX、L4
408考点:
微内核切换需要
消息传递
,开销大
其他结构方式
① 分层式结构(Layered Structure):
· 把操作系统分成若干层,
每层只调用更低一层的接口
(单向依赖)
· 优点:结构清晰、易于调试(第N层出错,问题一定在第N层或以下)
· 缺点:效率低(每次调用要穿越多个层次)
② 模块化(Modules):
· 内核被分成多个模块,各模块之间可以
直接调用
(不是严格的层次关系)
· Linux 的
可加载内核模块(LKM)
就是这种思想
③ 外核(Exokernel):
(了解即可,408很少考)
· 把硬件暴露给应用程序,由应用程序自己管理资源(极简内核)
▲ 微内核消息传递过程(点击播放动画)
▶ 播放消息传递动画
↺ 重置
🚀 操作系统的启动流程
从按下电源键到操作系统完全加载,经历了哪些步骤?这是408的经典综合题考点
📖 启动流程概述:
BIOS → 开机自检(POST) → 加载引导程序(Bootloader) → 引导程序加载操作系统内核 → 操作系统初始化 → 用户登录
⚡ 关键概念:
·
BIOS(Basic I/O System):
存储在主板ROM中的固件,是计算机加电后执行的第一个程序
·
MBR(Master Boot Record):
磁盘的第一个扇区(512B),包含引导程序和分区表
·
Bootloader:
负责把操作系统内核从磁盘加载到内存中(如 GRUB、NTLDR)
1
加电,CPU执行BIOS(ROM)
按下电源键,CPU初始化,PC指向BIOS起始地址(0xFFFF0),开始执行BIOS程序。BIOS存储在主板的ROM/Flash中。
2
开机自检(POST, Power-On Self-Test)
BIOS检测计算机硬件(CPU、内存、I/O设备)是否正常。如有故障,通过"滴滴"声报警(不同响声代表不同故障)。
3
加载BIOS设置,选择启动设备
BIOS读取CMOS中的配置信息(如启动顺序:硬盘→U盘→光盘),找到可启动设备后读取该设备的第一个扇区(MBR,512B)。
4
MBR中的引导程序加载(Bootloader)
MBR中的引导程序(如GRUB Stage 1)被加载到内存 0x7C00 处执行。由于MBR空间有限(512B),它只负责加载更大一点的引导程序(如GRUB Stage 2)。
5
引导程序加载操作系统内核
Bootloader(如GRUB)把操作系统内核(如 Linux 的 vmlinuz)从磁盘读取到内存中,然后把CPU控制权交给内核。
6
操作系统内核初始化
内核开始执行,初始化各种硬件(内存管理、进程管理、中断、文件系统等),创建第一个进程(如 Linux 的 init/systemd,PID=1)。
7
用户登录,系统就绪
init 进程启动各种系统服务,最终启动登录程序(login/getty),等待用户输入用户名和密码,登录后进入 shell 或图形界面。
▲ 操作系统启动流程动画(点击步进观看)
▶ 步进(下一步)
↺ 重置
▶ 自动播放
📝 408综合题考点:
① BIOS存放在
ROM
中(不是RAM,不是磁盘,不是Cache)
② POST过程中如果内存故障,会有
响声报警
③ MBR的大小是
512字节
,存放在磁盘的
第一个扇区
④ 引导程序(Bootloader)位于
磁盘
,被BIOS读入
内存
执行
⑤ 操作系统启动完成后,系统处于
内核态
(直到用户登录后执行用户程序才切换到用户态)
← 返回知识树
·
进程管理 →