【复习408】操作系统存储器管理浅析
文章目录
- 1. 存储器管理概述与核心功能
- 2. 程序装入与链接技术
- 3. 连续分配管理方式
- 3.1 单一连续分配与固定分区
- 3.2 动态分区分配
- 4. 分页存储管理
- 4.1 核心机制
- 4.2 快表(TLB)与多级页表
- 4.3 页面置换算法
- 5. 分段存储管理
- 6. 段页式存储管理
- 7. 虚拟存储器
- 7.1 核心特征
- 7.2 请求分页管理
- 8. 多级页表的实现细节
- 8.1 结构与实现
- 8.2 地址分解过程
1. 存储器管理概述与核心功能
存储器管理是操作系统的核心功能之一,其主要任务包括内存分配与回收、地址变换、内存共享与保护以及内存扩充。现代操作系统采用层次化的存储结构,通过多级存储体系(寄存器、高速缓存、主存、磁盘)实现性能与成本的平衡。
关键原理: 逻辑地址与物理地址的转换是贯穿整个章节的核心线索。操作系统通过地址变换机构(页表、段表、快表等)实现从进程逻辑地址空间到物理内存空间的映射。这一机制不仅支持了内存保护(防止进程间非法访问),也为虚拟内存技术奠定了基础。
2. 程序装入与链接技术
程序的装入与链接是程序执行前的必要准备阶段。重点三种装入方式:绝对装入(编译时绑定)、可重定位装入(静态绑定)和动态运行时装入(运行时绑定)。其中动态装入配合页式或段式管理,是实现虚拟内存的前提。
链接技术 包括静态链接、装入时动态链接和运行时动态链接。链接过程将编译后的目标模块组合成可执行文件,解决符号引用问题。
3. 连续分配管理方式
连续分配是最早出现的内存管理策略。
3.1 单一连续分配与固定分区
单一连续分配仅支持单道程序,内存利用率极低。固定分区分配将内存划分为固定大小的分区,支持多道程序但存在严重的内部碎片问题。
3.2 动态分区分配
可变分区(动态分区)根据进程实际需求分配内存,消除了内部碎片但引入了外部碎片。为缓解外部碎片,系统可采用**紧凑(Compaction)**技术,通过移动进程占用区合并空闲空间。
核心——分配算法:
- 首次适应算法(First Fit) :从低地址开始查找第一个满足大小的空闲分区,实现简单但会在低地址留下大量小碎片。
- 循环首次适应(Next Fit) :从上次查找结束位置继续查找,避免总是从头扫描开销。
- 最佳适应(Best Fit) :选择能满足需求的最小空闲分区,保留大分区但产生大量难以利用的微小碎片。
- 最坏适应(Worst Fit) :选择最大空闲分区,减少碎片数量但难以满足大进程需求。
4. 分页存储管理
分页存储管理是现代操作系统的基石,也是408考试的重中之重。
4.1 核心机制
分页系统将逻辑地址空间划分为固定大小的页面(Page),将物理内存划分为同样大小的页框(Frame)。通过页表实现页号到页框号的映射,实现离散分配,彻底消除外部碎片。
地址转换过程: 逻辑地址由页号P和页内偏移量W组成。MMU通过页表基址寄存器找到页表,用P索引页表项获取页框号,再结合W形成物理地址。
4.2 快表(TLB)与多级页表
为解决页表占用内存过大的问题,系统引入**快表(TLB)**缓存近期访问的页表项,将地址转换时间从两次内存访问降至一次。
当逻辑地址空间极大时(如64位系统),页表本身也极为庞大。多级页表通过层次化结构,仅将当前使用的页表保留在内存,极大降低了内存开销。例如,二级页表将逻辑地址分解为页目录索引、页表索引和偏移量三部分。
地址转换示例: 假设32位系统采用二级页表,页大小4KB(偏移量12位),页目录和页表各10位。逻辑地址0x12345678分解为:页目录索引0x48、页表索引0xD6、偏移0x678。MMU先查页目录得页表物理地址,再查页表得页框号,最后合成物理地址。
4.3 页面置换算法
当内存满时,系统需选择页面换出磁盘,这就是页面置换算法,是虚拟内存的核心。
必考算法包括:
- OPT(最佳置换) :选择未来最久不被访问的页面,理论最优但不可实现,常用于评价其他算法。
- FIFO(先进先出) :淘汰最早进入的页面,实现简单但可能产生Belady异常(增加页框数反而提高缺页率)。
- LRU(最近最久未使用) :淘汰最久未访问的页面,性能接近OPT,但实现复杂,需硬件支持(如计数器或栈)。
- Clock(时钟算法) :LRU的近似实现,利用引用位和修改位,将页面组织成环形队列,扫描选择淘汰页,开销较低。
- 改进型Clock:考虑修改位,优先淘汰未修改页面,减少I/O开销。
算法复杂度分析:
- 实现复杂度:OPT > LRU > Clock > FIFO。OPT需预知未来,仅用于理论;LRU需维护访问时间戳,硬件开销大;Clock只需维护引用位,实际系统常用。
- 时间复杂度:FIFO和LRU在纯软件实现下为O(N*M)(N为页框数,M为访问序列长度),但硬件支持下的LRU可达O(1)
。Clock算法每次扫描平均O(1),最坏O(N)。 - 空间复杂度:FIFO需维护队列O(N);LRU需栈或计数器O(N);Clock仅需引用位数组O(N)。
5. 分段存储管理
分段管理从逻辑意义出发,将程序划分为若干段(如主程序段、数据段),每段有独立的名字和长度。逻辑地址由段号和段内偏移组成,通过段表实现地址映射。
优点: 符合程序模块化设计,便于共享与保护,无内部碎片。
缺点: 存在外部碎片,内存利用率低于分页。
地址转换: 逻辑地址(S, W),用S检索段表得段基址,与W相加得物理地址。需检查W是否越界。
6. 段页式存储管理
段页式管理结合分段与分页优点:先按逻辑分段,每段内再分页。系统维护段表和页表两级结构,逻辑地址由段号、段内页号、页内偏移组成。
地址转换: 先用段号查段表得页表起始地址,再用页号查页表得页框号,最后合成物理地址。需两次查表,系统开销大,但兼具逻辑清晰与内存利用率高的优势。
7. 虚拟存储器
虚拟存储器是408考试中的核心概念,基于局部性原理(时间局部性与空间局部性),通过请求分页/分段技术,将部分程序装入内存即可运行,其余部分驻留磁盘。
7.1 核心特征
- 多次性:作业分多次调入内存。
- 对换性:允许作业在运行中换进换出。
- 虚拟性:逻辑上扩充内存容量。
7.2 请求分页管理
请求分页在分页基础上增加请求调页和页面置换功能。页表项扩展了状态位(标识页面是否在内存)、访问字段(记录访问频率)、修改位(标识是否被改写)和外存地址。
缺页中断处理流程: 当访问页面不在内存时,触发缺页中断。OS保留CPU现场,从外存调入页面,更新页表,可能触发页面置换,最后恢复中断继续执行。整个过程涉及页表更新与TLB刷新,以确保地址转换一致性。
8. 多级页表的实现细节
8.1 结构与实现
多级页表通过树状结构管理页表项,顶级为页目录(Page Directory),次级为页表。32位系统常用二级页表,64位系统常用四级(PML4、PDPT、PD、PT)。
页表项结构: 每个页表项(PTE)存储物理页框号、有效位、权限位等。以x86-64为例,PTE包括:
- Present位:页面是否在内存。
- R/W位:读写权限。
- U/S位:用户/内核访问权限。
- Accessed位:是否被访问过。
- Dirty位:是否被修改。
- NX位:禁止执行(防溢出攻击)。
- PFN:物理页框号。
8.2 地址分解过程
以32位二级页表为例,4KB页大小对应12位偏移。虚拟地址分解为:
- 页目录索引:10位(高10位)
- 页表索引:10位(中10位)
- 页内偏移:12位(低12位)
MMU从CR3寄存器获取页目录基址,用页目录索引得页表地址,再用页表索引得页框号,最后加偏移得物理地址。
示例代码逻辑(伪代码):
// 二级页表地址转换
phy_addr translate(addr virt) {pd_index = (virt >> 22) & 0x3FF; // 页目录索引pt_index = (virt >> 12) & 0x3FF; // 页表索引offset = virt & 0xFFF; // 页内偏移pd_entry = CR3[pd_index]; // 查页目录pt_base = pd_entry.page_table_base; // 得页表基址pt_entry = pt_base[pt_index]; // 查页表frame = pt_entry.frame_number; // 得页框号return (frame << 12) | offset; // 合成物理地址
}