操作系统_清华大学(向勇、陈渝)-笔记-第四章-非连续内存
非连续内存的管理
前面的连续内存管理好像都有一些问题,我们可以考虑一种非连续内存管理的办法。管理都是有开销的,最好是要将管理方法建立在硬件之上。
分段
分段是为了更好的分离和共享,分离程序为多个具有不同功能的段。

段访问
将一个逻辑地址分为:
- 段号
- 偏移量
在段表中存有段号与段的物理起始地址的映射关系。
在Limit Register中存有每个段的大小。

段表由os建立,与硬件有着较为紧密的联系。
分页
但其实现在大家都不用分段了,大家都用分页的机制。
最主要的区别是,分段方式中,段的大小是可变的,而在分页中页大小是固定的。我们划分物理内存至固定大小的帧,同时将逻辑地址划分为相同大小的页。


也就是将物理地址、逻辑地址都分为基地址+偏移地址的形式。
页寻址机制如下:
- 先将逻辑地址拆分为:页号+偏移量。
- 在页表基地址上,在页表中查出帧号。
- 找到对应的物理地址=帧号+偏移地址。
![]()
总的帧数目可以和页数目不相等,但是页内大小一定要和帧大小相等。通常来说,逻辑地址空间比物理地址空间更大。
逻辑地址空间内是连续的,但实际物理空间内是不连续的。
![]()
页表
页表分为Flags+Frame num两项,Flags指出对应于逻辑地址的帧是否存在。
下图的页表最底下是0,往上数。

存在问题:
- 访问一个内存单元需要两次内存访问:获取页表+访问数据
- 页表可能过大,64位机器,每页1024B,一个页表的大小大的不能想象~。而cpu内的cache才多大,那么页表就要放到内存当中,速度--。
处理方法:
TLB(Translation Look-aside Buffer)
称之为快表,缓存近期访问的页帧转换表项,查找速度很快,若果TLB命中,就可以很快得到物理页号,而若TLB未命中,则加载对应表项到TLB中。

二级页表
多层次页可以解决占用内存过大的问题。
一个页表分为:一级页表页号+二级页表页号+偏移地址。
先在一级页表中查到二级页表的地址,再在二级页表中查到帧号。

若p1指向的项不存在,那么相应的二级页表也不用存在,通过这种方式节省了空间。
进一步推广,可以得到多级页表,建立页表树,称之为B+树。

这是一种用时间换空间的方法。
反向页表
有大地址空间,前向映射页变得繁琐。不是让页表与逻辑地址空间大小相对应,而是让页表与物理地址空间的大小相对应。
页寄存器(Page Register)方案:
以物理帧号为索引,找到对应的页号。这样可以大大减小内存消耗。
很大的问题,如何查找?

基于Hash查找的方案:
原理:哈希表双向映射,通过哈希表得到页-帧的对应关系。

加入程序ID,缓解哈希冲突的问题。



浙公网安备 33010602011771号