第四章
主要内容:非连续内存分配
非连续内存分配的必要性
连续性内存分配的缺点
-
分配给一个程序的物理内存是连续的
-
内存的利用率低
-
有外部碎片/内部碎片问题
非连续内存分配的优点
-
一个程序的物理内存空间是非连续的
-
更好的内存利用和管理
-
允许共享代码与数据(共享库)
-
支持动态加载和动态链接
非连续内存分配的缺点
-
建立虚拟地址和物理地址的转换难度大
-
软件方案
-
硬件方案:分段、分页
-
非连续内存分配
分段
段:在程序中会有来自不同文件的函数;在程序执行时,不同的数据也有不同的字段
分段寻址方案
逻辑地址空间连续,但是物理地址空间不连续,使用映射机制进行关联
-
段:内存的"块"
-
程序访问内存地址需要:二元组(段号,段内偏移)
-
操作系统维护一张段表,存储段号、物理地址的起始地址、长度
-
物理地址:段表内物理地址的起始地址+二元组内的段内偏移
分页
分页
分页地址空间
-
划分物理内存至固定大小的帧(Frame)
-
划分逻辑地址空间至相同大小的页
-
建立方案 -> 转换逻辑地址为物理地址(pages to frames)
-
页表
-
MMU/TLB
-
帧(Frame)
物理内存被分割成大小相等的帧,一个内存物理地址是一个二元组(帧号,帧内偏移)
分页和分段的最大区别,页的大小是固定的,段的大小不是固定的
页
一个程序的逻辑地址空间被划分为大小相等的页。页内偏移大小==帧内偏移大小,页号通常大于帧号
页寻址方案
操作系统维护一张页表,页表保存了逻辑地址--物理地址空间的映射关系,存储页号、帧号
-
逻辑地址空间应当大于物理内存空间
-
页映射到帧
-
页是连续的虚拟内存
-
帧是非连续的物理内存
-
不是所有的页都有对应的帧
页表
页表概述
每一个运行的程序都有一个页表
-
属于程序的运行状态,会动态变化
-
PTBR:页表基址寄存器,指向当前页表
页表中还有一些特殊标志位
-
dirty bit,数据一致性问题,内存中的数据与磁盘文件不同(被修改)
-
resident bit, (0 对应的物理页帧不在内存中,1表示存在)
-
引用计数:用于记录本页在一段时间内被访问的次数
分页机制的性能问题
-
访问一个内存单元需要两次内存访问
-
页表可能非常大
如何处理
-
缓存
-
间接访问
转换后备缓冲区(TLB)
缓解时间问题
Translation Look-aside Buffer(TLB)是一个缓冲区,CPU中有快表TLB(用于保存经常访问的页表项)
-
TLB使用关联内存实现,具备快速访问性能
-
如果TLB命中,物理页号可以很快被获取
-
如果TLB没有命中,将对应的页表项更新到TLB中
二级/多级页表
时间换空间
二级页表
-
将页号分为两个部分,页表分成两个部分,一级页号对应一级页表,二级页号对应二级页表
-
一级页号查表获得二级页表的起始位置,地址加上二级页号的值,在二级页表中获得帧号
-
节约页号不在内存中的内存空间
多级页表
-
将页号分为n个部分来间接实现多级间接页表,建立一颗页表"树"
反向页表
解决了大地址空间问题
目的:根据帧号获得页号
反向页表只需要存在一张即可
-
有大地址空间(64-bits), 前向映射页表变得繁琐. 比如 : 使用了5级页表
-
不是让页表与逻辑地址空间的大小相对应, 而是当页表与物理地址空间的大小相对应. 逻辑地址空间增长速度快于物理地址空间
1. 基于页寄存器的方案
存储(帧号、页号)使得表大小与物理内存大小相关,而与逻辑内存关联减小
2. 基于关联内存的方案
硬件设计复杂, 容量不大, 需要放置在CPU中
3. 基于哈希的方案