本文组织结构如下:
- 动机
- 段式
- 页式
- 段页式
非连续内存分配动机
- 提高内存利用率(没有外碎片)
- 允许程序使用非连续地址
- 共享代码和数据
- 动态加载和链接
需要实现的依然是从逻辑地址到物理地址的转换。
段式
段式就是将内存分成很多个段,段与段之间不连续,但每个段是连续的。(e.g.: 代码段,数据段,堆栈段…)
下图是一种硬件实现方式
逻辑地址是一个段号和段偏移,OS维护一个段表(<段基址,段长度>)
页式
页帧
物理地址被划分为大小相同的块,称为帧(frame),通常是
2n
2
n
个字节(e.g.:4KB)
帧的结构如下图
逻辑页面
顾名思义是把逻辑页面分成大小相同的页,大小与帧大小相同,保证页内偏移与帧内偏移相同
如下图:
页表: 从页面到帧
页表就是一个从页面到页帧的映射
页表项
- 页表项包括: 帧号和标志位(存在位,引用位,修改位,只读位)
- 每个页面对应一个页表项
- 每个进程维护一个页表
- 页表基地址寄存器(PTBR): 将页表放在内存中需要知道它的起始地址.
性能问题
- 需要两次访存 ,页表再内存中需要访存一次,再根据帧号访问物理地址又是一次
- 页表可能会很大
解决方案一个就是 缓存 (TLB),另一个可以用多级页表
TLB
由于TLB放在CUP中所以很快,而根据程序访问内存的局部性可以利用很好的命中策略提高命中率。
页表的一些实现方式
多级页表
多级页表就是建立页表树,做多级访存,通过设置存在位减少页表项,当然这种策略会带来访存次数的代价
下面是一个二级页表的例子
反置页表
待填坑
HASH页表
待填坑
段页式
这个比较好理解就是在段式的基础上给每个段加一级页表
有一个优点就是 容易实现共享代码段共享