非连续内存分配

非连续分配

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 减少内存的时间开销

posted @   半条咸鱼  阅读(143)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示