非连续内存分配
非连续分配
1、优点
(1)一个程序的物理地址空间是非连续的
(2)更好的内存利用和管理
(3)允许共享代码与数据(共享库等……)
(4)支持动态加载和动态链接
2、建立虚拟地址和物理地址之间的转换
(1)软件方案(开销巨大)
(2)硬件方案:分段、分页
3、分段、分页的区别
(1)分段:每段的长度是不确定的
(2)分页:每页的长度是确定的,段的尺寸不可变,即为页(常用)
分段
1、根据程序的段的性质,分离出来管理
2、段的分离技术
(1)保证效率、安全
(2)分段技术是一种映射,使用硬件支持来寻址
(3)逻辑地址是连续的地址空间
(4)物理地址是不连续的地址空间
段访问机制
1、段寄存器 + 地址寄存器实现方案
(1)一个一维逻辑地址,由多个段(内存空间)组成,段可以不连续
(2)逻辑地址分成两块:段号 + 段内偏移
2、单地址实现方案
3、硬件机制:段表
(1)映射关系:逻辑地址段号 <-> 物理地址段号
(2)由于段的长度是不确定的,所以段表中会存储段的起始地址和长度限制
(3)段号作为段表索引,根据段号查找段表项
4、CPU 检查物理地址是否在限制内
(1)若不合法,触发异常机制
(2)若合法,CPU 把起始地址 + 逻辑地址中的段内偏移量,形成物理地址
分页
1、逻辑地址和物理地址中页的大小是相同的,便于硬件做相应的实现
2、帧
(1)表示物理页
(2)划分物理内存至固定大小的帧:大小是 2 的幂,页帧占 S 位
(3)帧存在帧号、偏移,相当于段中的段号、偏移
(4)一个内存物理地址是一个二元组 (f, o)
(5)f:帧号,第 f 页(占 F 位,共 2F 个帧)
(6)o:帧内偏移,第 o 帧(占 S 位,每帧 2S 字节)
(7)物理地址 = 2S * f + o
3、页
(1)表示逻辑页
(2)划分逻辑地址空间至相同大小的页:大小是 2 的幂
(3)页内偏移的大小 = 帧内偏移的大小,页号大小不一定等于帧号大小
(4)一个逻辑地址是一个二元组 (p, o)
(5)p:页号(P 位,2P 个页)
(6)o:页内偏移(S 位,每页有 2S 字节)
(7)虚拟地址 = 2S * p + o
4、页寻址机制
(1)页表保存了逻辑地址、物理地址之间的映射关系
(2)根据页表基址查找页表
(3)页号作为索引,对应保存帧号
5、分页机制,每页偏移大小固定,没有分段中存在的异常问题
6、页、帧
(1)页(逻辑地址空间)大于帧(物理内存地址空间)
(2)页映射到帧
(3)页是连续的虚拟内存,帧是非连续的物理内存,减少内存碎片
(4)不是所有的页都有对应的馈
页表
1、结构:相当于数组
2、每个运行的程序都有一个页表
(1)属于程序运行状态,会动态变化
(2)PIBR:页表基址寄存器
3、页表结构页表项的内容
(1)Flags(标志位):dirty bit、resident bit、clock / referenee bit
(2)帧号:f
(3)resident bit 为 0,表示物理页帧不存在;为 1,表示物理页帧存在
处理分页机制的性能问题
1、缓存:TLB
2、间接访问:多级页表
TLB
1、转译后备缓冲器:Translation Look-aside Buffe
2、位于 CPU 的 MMU 中,TLB 使用关联内存实现,具备快速访间性能
3、将经常需要访问的页帧映射关系,直接保存在 TLB 中,可以减少对页表的访问
4、常用页放在 TLB 中,直接映射到物理地址,也避免了对内存中页表的访问
5、缓存近期访问的页帧转换表项
(1)如果 TLB 命中,物理页号可以很快被获取
(2)如果 TLB 未命中,CPU 再到页表查找,对应的表项被更新到 TLB 中
(3)X86 由 CPU 更新 TLB 表项
6、TLB 不会缺失过多,因为一个页在 32 位系统大小位 4K ,一般需要访问 4K 次,才会出现缺页现象
7、编写程序时,尽量保证访问的局部性
二级页表
1、通过多级页表,缓解页表的占用空间
2、页内偏移不变,页号切割为两部分,分别对应:一级页表的页号 p1、二级页表的页号 p2
3、一级页表:p1 作为索引,页表项为二级页表的起始地址
4、二级页表:p2 + 一级页表的页表项,作为索引,页表项为帧号
5、如果一级页表中,某一个 p1 的 resident bit 为 0,表示物理页帧不存在,因此二级页表不需要创建出来,不需要占用内存空间,可以极大节省空间
多级页表
1、建立页表树
2、通过把页号分为 k 各部分,实现多级间接页表
3、目的:时间换取空间
4、64 位系统中,使用 5 级页表进行存储,尽管访问级数越高,时间开销越大,但是节省了空间,而时间的开销又可以通过 TLB 机制缓解
反向页表
1、解决
(1)有大地址空间(64 位寻址空间),前向映射页表变得繁琐(如 5 级页表)
(1)前向页表与逻辑地址空间的大小相对应,反向页表与物理地址空间的大小相对应,逻辑地址空间增长速度快于物理地址空间
基于页寄存器
1、寄存器中,以帧号为索引
2、寄存器大小只与物理地址有关,占的空间很少
3、每个帧和一个寄存器关联
4、寄存器内容包括
(1)Residencebit:此帧是否被占用
(2)Oceupier:对应的页号 p
(3)Proteetion bits:保护位
基于关联内存
1、类似TLB,并行查找
2、但关联存储器用到的硬件逻辑很复杂,开销很大,大量的关联内存很昂贵,难以在单个时钟周期内完成且耗电
基于哈希查找
1、用硬件加速,建立哈希表来实现反向页表
2、页 i 放在哈希表中 f(i) 的位置,f 为哈希函数
3、加上 PID,计算 f(i),将其作为页寄存器表的索引,获取对应页寄存器
4、检查寄存器标签是否包含 i,若包含,则成功;若不包含,则失败
5、减少时间开销
(1)多个帧号情况下,加入 PID,以当前运行程序的 ID 作为标识,避免哈希碰撞
(2)哈希表位于内存,利用 TLB 减少内存的时间开销
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战