连续内存分配的缺点
●分配给一个程序的物理内存是连续的
●内存利用率较低
●有外碎片、内碎片的问题
非连续分配的优点
■一个程序的物理地址空间是非连续的
■更好的内存利用和管理
■允许共享代码与数据(共享库等…
■支持动态加载和动态链接
分段
●程序的分段地址空间
●分段寻址方案



分页
划分物理内存至固定大小的帧
●大小是2的幂,e.g., 512, 4096, 8192
划分逻辑地址空间至相同大小的页
●大小是2的幂,e.g., 512, 4096, 8192
建立方案转换逻辑地址为物理
地址(pages to frames)
●页表
●MMU/TL B



分页机制的性能问题
问题:访问一个内存单元需要2次内存访问
➢一次用于获取页表项
➢一次用于访问数据
页表可能非常大
64位机器如果每页1024字节,那么一个页表的大小会是多少?
如何处理?提示:大部分的计算问题通过某些方式解决…(逻辑地址空间可能很大导致页表也很大 同时一个应用有一个页表 当运行的程序过多就有更多的页表占用空间所以不能放cpu而是放入内存 )
-
缓存(Caching)
缓存TLB
TLB缓冲页表中的内容 在cpu内部
作用 将经常访问到的页表放入TLB中 这样访问的时候先访问TLB如果TLB内部没有再去查页表

-
间接(Indirection)访问
二级页表有多个
一级页表标志位如果是0 则对应的二级页表没必要存在 这样就节省了空间


反向页表
大地址空间问题
有大地址空间(64-bits), 前向映射页表变得繁琐.
➢比如: 5级页表.
不是让页表与逻辑地址空间的大小相对应,而是让页表与物理地址空间的大小相对应.
➢逻辑(虚拟)地址空间增长速度快于物理地址空间.
以物理地址页号查找逻辑地址页号
使用页寄存器( Page Registers )
- 每个帧和一个寄存器关联,寄存器内容包括:
➢Residence bit:此帧是否被占用
➢Occupier: 对应的页号p
➢Protection bits:保护位 - 页寄存器:一个例子
➢物理内存大小: 40964096 =4K4KB=16 MB
➢页面大小: 4096 bytes = 4KB
➢页帧数: 4096=4K
➢页寄存器使用的空间(假设8 bytes/register):
➢8*4096= *32 Kbytes
➢页寄存器带来的额外开销:
➢32K/16M = 0.2% (大约)
➢虚拟内存的大小:任意
页寄存器方案的权衡
◆利:
➢转换表的大小相对于物理内存来说很小
➢转换表的大小跟逻辑地址空间的大小无关
弊:
➢需要的信息对调了,即根据帧号可找到页号
➢如何转换回来?即根据页号找到帧号
➢在需要在反向页表中搜索想要的页号

在反向页表中搜索一个页对应的帧号
如果帧数较少,页寄存器可以被放置在关联内存中。
在关联内存中查找逻辑页号
➢成功:帧号被提取
➢失败:页错误异常( page fault)
限制因素:
➢大量的关联内存非常昂贵
■难以在单个时钟周期内完成
■耗电
一般采用第三种方式哈希表

PID当前运行程序id
在反向页表中通过哈希算法来搜索一个页对应的帧号对页号做哈希计算,为了在“帧表”(每帧拥有一个表项)中获取对应的帧号。
◆页i被放置在表中f(i)位置,其中f是设定的哈希函数
◆为了查找页i,执行下列操作:
➢计算哈希函数f(i)并且使用它作为页寄存器表的索引
➢获取对应的页寄存器
➢检查寄存器标签是否包含i,如果包含,则代表成功
➢否则失败
分页与分段的区别:
- 分页 的页内偏移大小固定 这样在硬件的管理上也可以用更简洁的方式实现 而分段需要考虑不同段大小不一致的情况
有助于减少碎片
页表

标志位 红字0代表不存在 1 代表存在
页表从下往上排01234
Frame num(帧数)对应物理地址页帧号
页内偏移在逻辑地址和物理地址是一致的


本文深入探讨了连续与非连续内存分配的优缺点,分析了分段与分页机制的工作原理及性能考量,如页表、MMU/TLB的作用,以及页寄存器方案的权衡。特别关注了分页机制的性能问题,包括两次内存访问的需求和页表大小的挑战。

被折叠的 条评论
为什么被折叠?



