目录
第一章 温故而知新
研究背景:X86指令集的32位PC
三个关键部件:CPU、内存、I/O设备芯片
xmimd:
一. 提升速度的方式
早期设计
硬件结构
对称多处理器
- 名称:SMP(Symmetrical Multi-Processing)
- 多个对等架构的CPU
- 用于大型数据库、网络服务器等
多核处理器
- 名称:Multi-core Processor
- 多个处理器核心包在一起,多个CPU但共享内存
- 用于个人PC
站得高 看得远
软件结构
不要让 cpu 打盹
设备驱动
读取设计
内存不够怎么办
我们来看一下这种错误策略
关于隔离
- 虚拟地址
- 物理地址
分段
- 解决了 1 3 两个问题
分页和页表
我们再来思考一下,对作者提到的 a b c 进程进行内存分配
1. 基础分配策略的问题
你提到的直接分配方式属于 固定分区分配,但会引发以下问题:
- 内存碎片:例如程序C(20MB)无法插入到B(100MB)之后的剩余18MB(128-110=18MB),导致外部碎片。
- 利用率低:若程序A结束运行,其占用的10MB可能无法被后续其他程序有效利用。
2. 动态内存分配策略
操作系统通过动态分配策略管理空闲内存块,常见方法:
(1) 动态分区分配
- 首次适应 (First Fit):从内存低地址开始找第一个足够大的空闲块。
-
- 示例:A(10MB)→B(100MB)→C(20MB)。若B结束后释放100MB,新进程D(50MB)可复用B的空闲区。
- 最佳适应 (Best Fit):选择最小的足够空闲块。
-
- 问题:可能产生大量小碎片。
- 最坏适应 (Worst Fit):选择最大的空闲块。
-
- 目标:减少后续碎片化。
(2) 分页机制
- 将物理内存划分为固定大小的页(如4KB),进程内存按页分配。
-
- 解决碎片:允许非连续分配,避免外部碎片。
- 示例:128MB内存分为32,768页。A需2,560页(10MB),B需25,600页,C需5,120页。
- 页表管理:每个进程维护页表,记录逻辑页→物理页框的映射。
(3) 分段机制
- 按程序逻辑划分(代码段、数据段、堆栈段),每段独立分配。
-
- 优点:支持动态扩展(如堆栈),保护权限分离。
- 缺点:仍可能产生外部碎片。
3. 虚拟内存扩展
通过磁盘交换扩展可用内存:
- 页面置换算法:当物理内存不足时,将部分页面换出到磁盘。
-
- 示例:若A、B、C同时运行需130MB(10+100+20),系统可将B的部分页面换出,优先保留活跃进程。
- 写时复制 (Copy-on-Write):多个进程共享相同内存页,直到修改时才复制。
4. 针对场景(128MB)
假设需要同时运行A(10MB)、B(100MB)、C(20MB):
- 动态分区+首次适应:
-
- 分配A(0-10MB) → B(10-110MB) → C(110-130MB,但超出物理内存,需置换或拒绝)。
- 分页+虚拟内存:
-
- B的100MB可能部分在物理内存,部分在磁盘,但程序无感知。
- 优化策略:
-
- 合并B和C的分配区间(若B结束后运行C)。
关键代码逻辑(伪代码)
struct MemoryBlock {
int start;
int size;
bool free;
};
std::list<MemoryBlock> freeList;
// 首次适应分配算法
MemoryBlock* allocate(int size) {
for (auto& block : freeList) {
if (block.free && block.size >= size) {
// 分割块并返回分配结果
...
return █
}
}
return nullptr; // 分配失败
}
总结
现代操作系统通常结合分页和虚拟内存实现高效内存分配,核心目标:
- ✅ 减少碎片(分页解决外部碎片,动态分配解决内部碎片)
- ✅ 提高利用率(置换算法、共享内存)
- ✅ 隔离保护(MMU硬件支持)
总结:
二. 系统软件
1. 接口
应用程序编程接口API
- 是应用程序提供的,给应用程序/开发工具使用
- 包括:
-
- Linux下POSIX-API(Glibc库提供)
- Windows下:Windows API32(即Win32)
系统调用接口System call Interface
- 是操作系统提供的,给应用程序使用
形式是软件中断
- 软件中断:不会直接中断CPU,只有当前正在运行的代码(或进程)才会产生软中断
- 中断是一种内部中断,需要在当前运行的程序去做一些事情(通常为I/O)的请求
- 扩展硬件中断:处理中断的驱动需要运行在CPU上的
- 当中断产生的时候,CPU会暂时停止当前运行的程序转而执行中断请求
硬件规格Hardware Specification
- 是硬件厂商提供的,给操作系统(内核层)使用
- 阅读硬件编程接口,编写驱动程序操作硬件
- 注:硬件厂商参考硬件规格+操作系统布线的接口,开发这些硬件在操作系统上的驱动程序
2. 操作系统
功能
- 提供抽象接口
- 管理硬件资源
操作系统
- 发展历程(CPU角度):分时系统、多任务系统
- 硬件被抽象成一系列概念,内部细节由驱动功能完成
- 设备驱动(I/O角度):一个文件读写的例子
内存(内存角度)
问题:如何将计算机有限的物理内存分配给各个程序使用
直接分配物理地址,缺点:
-
- 地址空间不隔离
- 内存使用效率低
- 程序运行地址不确定
解决:使用虚拟地址
1. 分段的方法:程序需要的内存空间大小的虚拟空间映射到某个地址空间空闲,能解决问题 1 3
2. 分页的方法:
- 把内存人为分为固定大小的页,比分段更加细粒度,同时可以进行缓存锁定
- 页的大小,硬件决定,页表是4KB
-
- 进程按页分割:虚拟页,物理页,磁盘页
- CPU中的MMU组件执行访存时:CPU发出虚拟地址,经MMU转化为物理地址
下一篇文章,我们将对 众人拾柴火焰高--线程,进行讲解~