【复习408】操作系统存储器管理浅析

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;        // 合成物理地址
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.EscaRC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值