外观
操作系统核心知识
约 3336 字大约 11 分钟
2025-08-16
一、操作系统基础
1. 操作系统概述
定义:操作系统是管理计算机硬件与软件资源的系统软件,是用户与计算机硬件之间的接口。
核心功能:
- 进程管理:创建、调度和终止进程
- 内存管理:分配和回收内存空间
- 文件系统:管理文件和目录
- 设备管理:控制和协调各种I/O设备
- 网络管理:提供网络通信能力
- 安全与保护:确保系统安全和用户数据保护
操作系统类型:
- 批处理系统:早期系统,作业批量处理
- 分时系统:多用户交互式系统(如Unix、Linux)
- 实时系统:对时间要求严格的系统(如嵌入式系统)
- 个人计算机系统:单用户多任务系统(如Windows、macOS)
- 分布式系统:多台计算机协同工作
提示:现代操作系统(如Windows、Linux、macOS)通常是分时系统和多任务系统的结合。
2. 操作系统启动过程
启动流程:
- BIOS/UEFI:硬件自检和初始化
- 引导加载程序(如GRUB、Windows Boot Manager)
- 显示启动菜单
- 加载操作系统内核
- 内核初始化:
- 检测硬件
- 初始化设备驱动
- 启动第一个进程(如Linux的init/systemd)
- 系统服务启动:加载各种系统服务
- 用户登录:提供登录界面
二、进程与线程管理
1. 进程概念
进程:程序的一次执行过程,是系统进行资源分配和调度的基本单位。
进程控制块(PCB):操作系统用来描述和管理进程的数据结构,包含:
- 进程ID(PID)
- 进程状态(运行、就绪、阻塞等)
- 程序计数器
- CPU寄存器
- 内存管理信息
- 调度信息
- I/O状态信息
进程状态转换:
+-------------+
| 创建 |
+------+------+
|
v
+-------------+
| 就绪 |<----+
+------+------+ |
| |
v |
+-------------+ | +------------+
| 运行 +-----+--->| 终止 |
+------+------+ | +------------+
| ^
v |
+-------------+ |
| 阻塞 +-----+
+-------------+2. 进程调度
调度类型:
- 长期调度(作业调度):决定哪些作业进入内存
- 中期调度:内存与外存之间的进程交换
- 短期调度(CPU调度):决定哪个就绪进程获得CPU
常用调度算法:
先来先服务(FCFS):
- 按到达顺序执行
- 优点:简单
- 缺点:平均等待时间长,可能导致"护航效应"
最短作业优先(SJF):
- 优先执行预计运行时间最短的进程
- 优点:平均等待时间最短
- 缺点:可能导致长进程饥饿
优先级调度:
- 按优先级高低执行进程
- 可以是抢占式或非抢占式
- 需要解决优先级反转问题
时间片轮转(RR):
- 每个进程分配固定时间片
- 时间片结束后,进程回到就绪队列末尾
- 优点:公平,响应时间好
- 缺点:时间片设置影响性能
多级反馈队列:
- 结合多种调度策略
- 进程在不同优先级队列间移动
- 是现代操作系统最常用的调度算法
3. 线程
线程:进程内的执行单元,是CPU调度的基本单位。
进程 vs 线程:
| 特性 | 进程 | 线程 |
|---|---|---|
| 资源分配 | 拥有独立资源 | 共享所属进程资源 |
| 切换开销 | 大 | 小 |
| 通信方式 | 进程间通信机制 | 共享内存 |
| 独立性 | 高 | 低 |
| 崩溃影响 | 只影响自身 | 可能影响整个进程 |
线程实现方式:
用户级线程:
- 由用户空间的线程库管理
- 系统内核不知道线程存在
- 优点:切换开销小
- 缺点:一个线程阻塞会导致整个进程阻塞
内核级线程:
- 由操作系统内核直接管理
- 优点:一个线程阻塞不会影响其他线程
- 缺点:切换开销较大
混合实现:
- 结合用户级和内核级线程的优点
- 如Java的线程模型
4. 进程同步与通信
临界区问题:
- 临界区:进程中访问共享资源的代码段
- 进入区:检查是否可以进入临界区
- 退出区:释放临界区访问权
- 剩余区:其他代码
解决临界区问题的条件:
- 互斥:一次只有一个进程能执行临界区
- 有空让进:无进程在临界区且有进程想进入,则应尽快让其进入
- 有限等待:进程请求进入临界区后,应在有限时间内进入
同步机制:
信号量:
// P操作(等待) wait(S) { while (S <= 0); // 忙等待 S--; } // V操作(信号) signal(S) { S++; }- 二进制信号量:值为0或1,用于互斥
- 计数信号量:值为任意非负整数,用于资源计数
互斥锁:
- 简化的二进制信号量
- 通常提供try_lock()避免忙等待
条件变量:
- 与互斥锁配合使用
- 允许线程在条件不满足时等待
经典同步问题:
生产者-消费者问题:
// 共享资源 semaphore mutex = 1; // 互斥信号量 semaphore empty = N; // 空缓冲区数量 semaphore full = 0; // 满缓冲区数量 // 生产者 void producer() { while (true) { item = produce_item(); wait(empty); wait(mutex); insert_item(item); signal(mutex); signal(full); } } // 消费者 void consumer() { while (true) { wait(full); wait(mutex); item = remove_item(); signal(mutex); signal(empty); consume_item(item); } }读者-写者问题:
- 读者优先:允许多个读者同时读
- 写者优先:写者请求后,新读者不能进入
哲学家进餐问题:
- 解决资源循环等待导致的死锁
三、内存管理
1. 内存管理基础
内存层次结构:
寄存器 → L1 Cache → L2 Cache → 主存(RAM) → 辅存(硬盘)- 速度递减,容量递增,成本递减
地址转换:
- 逻辑地址(虚拟地址):程序使用的地址
- 物理地址:实际内存中的地址
- 地址绑定:将逻辑地址转换为物理地址
2. 内存分配方式
连续分配:
- 单一连续分配:整个内存只给一个进程
- 固定分区分配:内存分为固定大小的分区
- 动态分区分配:
- 首次适应算法:从头开始找第一个满足大小的分区
- 最佳适应算法:找最小的满足大小的分区
- 最坏适应算法:找最大的分区
- 邻近适应算法:从上次查找结束处开始
非连续分配:
分页:
- 将内存和进程分为固定大小的页框/页
- 页表:记录页与页框的映射关系
- 优点:无外部碎片,易于实现共享
- 缺点:有内部碎片
分段:
- 按逻辑单元(代码段、数据段等)划分
- 段表:记录段与内存的映射关系
- 优点:便于共享和保护
- 缺点:有外部碎片
段页式:
- 结合分段和分页
- 先分段,再将段分页
3. 虚拟内存
虚拟内存:使用磁盘空间扩展物理内存的技术。
工作原理:
- 只将进程的部分内容加载到内存
- 需要时再从磁盘调入
- 透明地管理内存与磁盘间的数据交换
页面置换算法:
最佳置换算法(OPT):
- 替换未来最长时间不会被使用的页面
- 理论最优,但无法实现
先进先出(FIFO):
- 替换最早装入的页面
- 简单但可能替换常用页面
最近最少使用(LRU):
- 替换最近最少使用的页面
- 性能较好,但实现开销大
- 常用近似算法:时钟算法
时钟算法(Clock):
- 用循环链表实现
- 使用访问位标记页面使用情况
- 是LRU的近似实现
抖动问题:
- 当进程频繁发生缺页时,系统性能急剧下降
- 解决方法:减少并发进程数,增加物理内存
四、文件系统
1. 文件系统基础
文件:具有符号名的一组相关元素的集合。
文件属性:
- 名称、类型、位置、大小、保护、时间信息等
文件操作:
- 创建、删除、读、写、重定位(seek)、截断、设置属性
目录结构:
- 单级目录:所有文件在一个目录中
- 两级目录:每个用户有自己的目录
- 树形目录:层次结构,现代系统常用
- 无环图目录:允许共享文件
- 通用图目录:支持循环引用
2. 文件系统实现
文件分配方式:
连续分配:
- 文件占据连续的磁盘块
- 优点:顺序访问快
- 缺点:难以扩展,外部碎片
链接分配:
- 每个块包含指向下一个块的指针
- 优点:易于扩展
- 缺点:随机访问慢
索引分配:
- 使用索引块记录所有块的位置
- 优点:支持随机访问,易于扩展
- 缺点:索引块占用空间
空闲空间管理:
- 位图法:用位表示块是否空闲
- 链表法:将空闲块链接起来
- 分组法:将空闲块分组管理
3. 常用文件系统
FAT32:
- 早期Windows系统使用
- 简单但功能有限
- 最大文件大小4GB
NTFS:
- 现代Windows系统使用
- 支持大文件、权限控制、日志功能
- 支持压缩和加密
ext4:
- Linux系统常用
- 支持大文件、日志功能
- 性能较好
APFS:
- macOS和iOS系统使用
- 优化闪存性能
- 支持快照和加密
五、I/O系统
1. I/O系统基础
I/O设备分类:
- 块设备:以固定大小块为单位传输数据(如硬盘)
- 字符设备:以字符流方式传输数据(如键盘、鼠标)
- 网络设备:用于网络通信(如网卡)
I/O控制方式:
程序控制I/O:
- CPU直接控制数据传输
- 效率低,CPU利用率低
中断驱动I/O:
- 设备准备好后向CPU发送中断
- CPU响应中断后处理I/O
- 比程序控制效率高
直接内存访问(DMA):
- 由DMA控制器直接控制内存和I/O设备间的数据传输
- CPU只需初始化传输
- 适用于大量数据传输
2. I/O软件层次
I/O软件层次结构:
- 用户层I/O:用户程序接口
- 设备独立软件层:统一接口、缓冲、分配
- 设备驱动程序:设备特定代码
- 中断处理程序:处理设备中断
缓冲技术:
- 单缓冲:一个缓冲区
- 双缓冲:两个缓冲区交替使用
- 循环缓冲:多个缓冲区组成环
- 缓冲池:统一管理多个缓冲区
高速缓存:
- 将频繁访问的数据保存在高速存储中
- 提高I/O性能
六、系统安全与保护
1. 安全基础
安全目标:
- 机密性:防止未授权访问
- 完整性:防止未授权修改
- 可用性:确保授权用户能访问资源
安全威胁:
- 窃听:未经授权获取信息
- 篡改:未经授权修改信息
- 伪装:冒充他人身份
- 重放:重复发送合法数据
- 拒绝服务:使系统无法提供服务
2. 访问控制
访问控制矩阵:
- 行表示主体(用户、进程)
- 列表示客体(文件、资源)
- 单元格表示权限
实现方式:
- 能力表:按行存储访问控制矩阵
- 访问控制列表(ACL):按列存储访问控制矩阵
用户认证:
- 密码:最常见方式
- 生物识别:指纹、面部识别
- 多因素认证:组合多种认证方式
七、实用技巧与建议
1. 进程管理实用技巧
- 减少上下文切换:避免创建过多线程
- 合理设置优先级:关键任务设置高优先级
- 避免死锁:
- 按固定顺序获取资源
- 使用超时机制
- 一次性获取所有资源
2. 内存管理实用技巧
- 减少内存碎片:
- 使用对象池
- 合理选择数据结构
- 优化虚拟内存使用:
- 避免频繁分配/释放内存
- 大对象使用特殊分配器
- 监控内存使用:
- Linux:
top,free,vmstat - Windows:任务管理器,性能监视器
- Linux:
3. 文件系统实用技巧
- 选择合适文件系统:
- 大量小文件:考虑ext4或XFS
- 需要日志:ext4、NTFS
- 闪存设备:F2FS、APFS
- 优化I/O性能:
- 顺序读写优于随机读写
- 合理使用缓冲
- 避免频繁小文件操作
4. 常见问题排查
| 问题现象 | 可能原因 | 解决思路 |
|---|---|---|
| 系统卡顿 | CPU使用率高 | 检查进程CPU使用情况,优化算法 |
| 内存不足 | 检查内存使用,优化内存管理 | |
| I/O瓶颈 | 检查磁盘使用情况,优化I/O模式 | |
| 应用程序崩溃 | 内存越界 | 使用内存检测工具 |
| 资源竞争 | 检查同步机制,避免死锁 | |
| 未处理异常 | 完善异常处理机制 | |
| 响应慢 | 网络延迟 | 检查网络连接,优化通信 |
| 数据库查询慢 | 优化查询语句,添加索引 | |
| 线程阻塞 | 检查同步机制,减少锁竞争 |
八、常用工具速查表
| 工具 | 用途 | 常用命令 |
|---|---|---|
top/htop | 进程监控 | top, htop |
ps | 查看进程 | ps aux, ps -ef |
vmstat | 虚拟内存统计 | vmstat 1 |
iostat | I/O统计 | iostat -x 1 |
lsof | 查看打开文件 | lsof -p PID |
strace | 系统调用跟踪 | strace -p PID |
perf | 性能分析 | perf top, perf record |
valgrind | 内存分析 | valgrind --tool=memcheck |
