非连续内存分配
非连续内存分配
非连续分配的优点
- 一个程序物理地址空间是非连续的
- 更好的内存利用和管理
- 允许共享代码与数据
- 支持动态加载和动态链接
缺点:
- 如何建立虚拟地址和物理地址之间的转换
- 软件方案(开销过大)
- 硬件方案
- 分段
- 分页
1、分段
- 分段地址空间
- 分段寻址
- CPU 收到 段号和偏移
- 段号若大于等于段表长度,则错误
- 偏移若大于等于段长 ,则错误
- 基址+偏移为物理地址
2、分页
与分段的区别:
- 段长可变,而页长不可变(一般为2的幂)
- 划分逻辑地址空间至与物理内存至相同的页(方便硬件实现)
- 逻辑转物理方案
- 页表
- MMU(内存管理单元-CPU重要组成部分/TLB(快表)
帧(Frame)---物理地址
一个内存物理地址是一个二元组(f,0)
f------帧号(F位,共有2^F个帧)
o-----帧内偏移(S位,,没帧2^S字节)
物理地址 = f*2^S+o;
例如 16-bit地址空间,9-bit大小的页帧,
物理地址:(3,6)
物理地址= 1542
页(page)---逻辑地址
页内偏移大小=帧内偏移大小
页号大小<>帧号大小
一个逻辑地址是一个二元组(p,0)
p--- 页号(P位,2^P个页)
o---页内偏移(S位,每页有2^S字节)
逻辑地址= 2^S*p+o
页寻址机制:
- CPU得到(页号,页内偏移)
- 由页号对照页表得到页帧号
- 由页帧号以及页内(页帧内)偏移得到物理地址
页表:
就是一个大数组:
页表项内容:帧号,标志位
问题:
1、一个内存单元需要两次访问
2、页表可能非常大
TLB:
Key Value
速度快,代价高,记录经常访问的页表项,
当CPU得到逻辑地址,先查CPU中TLB,查不到再查内存中页表。
二级页表:
CPU得到一级页表号以及对应的二级页表号和偏移,从而得到页帧号(物理地址)。
由于一些没有在内存中的页表可以不占用空间,所有想对一级页表会省空间,而相应代价是访问时间提高,配合TLB使用会更好。
反向页表
由于正常的页表使用时会和逻辑地址大小会有对应关系的,逻辑空间越大,对应页表项越多。
使用反向页表时,会和物理地址空间大小建立对应关系。
页表是由页帧号对应页号。
使用页寄存器:
每个帧和一个寄存器关联,寄存器内容包括:
residence:此帧是否占用
对应页号p
保护位
例子:
物理内存大小:4K*4K = 16MB
页面大小:4k
页帧数:16/4 = 4k
页寄存器使用空间:(假设一个寄存器大小为8byte)
8*4k = 32k
页寄存器开销:32k/16m=0.2%
虚拟内存大小:任意
利:
转换表的大小相对于物理内存来说很小
转换表的大小跟逻辑地址空间大小无关
弊:
需要信息对调,即根据帧号可找到页号
如何转换为 根据页号找到帧号
需要在反向页表中搜索想要的页号
解决方案:
-
关联存储器
-
哈希

浙公网安备 33010602011771号