一、多级页表 问题导入 页表必须能够覆盖物理内存,只用一个页表。表项较多,非常消耗内存空间。
解决方法 1、更大的页 将分页的数量减少,每个页所包括的物理内存空间增大
2、混合方法:段页式存储管理 将内存按照不同的逻辑分段(比如分成代码段,栈段,数据段)。为每个段提供页表。 在虚拟地址中,有几位用于区别不同段的标号。 进行地址转化的时候,先获取分段的标号。 优点:未分配的空间不需要存储页表,节约了空间。 缺点: 1)大而稀疏的堆加大了内存空间的浪费。(不明白) 2)外部内存碎片增多。 (不理解这个,个人觉得内部碎片增多,因为可能一个程序所使用的各个段的长度不一致,对于每个分页也难以填满) 3)页目录大小不一致,寻找空闲空间较为复杂。
3、多级页表 1、设立一个页目录,页目录是很多物理页帧的集合。虚拟地址中有几位为页目录的索引,再有几位为在该索引所指向的页目录的偏移量,偏移量所指向的表项为物理页帧的索引。 1)支持稀疏的地址空间(不明白这个,支持稀疏的地址空间挺浪费的) 2)对于没有分配的页目录,不为其创建页表,这是其节约空间的一个原因。 3)若TLB未命中,对于二级页表,查找页表会有2次内存访问,加上其他的获得指令会有三次内存访问。几级页表会有几级内存访问。
2、二级页表的查找流程 1)查找页目录号 2)检验相应的权限 3)在页目录内检索表项,二级页表的页号即为在一级页表的偏移量 4)找到PTE为相应的物理页号, 5)检验相应的权限
3、当计算机的地址长度增加后,内存大小也会随着增加,页目录表项也可能会大大增加,这会导致页目录的大小变得非常大,为了减小页目录的大小,会使用多级页表。 用时间来换取空间的节约。
4、反向页表 只有一个页表。 保存物理地址到虚拟地址的映射关系,以及正在使用该物理页的进程。
二、磁盘作为虚拟内存的延伸 页表交换到磁盘:页面调度算法 可以将暂时不用的页面存储到磁盘上,为编写程序带来了巨大的遍历。程序所要使用的空间的大小没有那么多的限制。
1、将磁盘的一部分作为页表的交换空间,将暂时没有用到的页面存放在磁盘上。交换空间的大小决定了可以使用的最大页面数。 要解决的问题: 1)在页表中标记那些页面位于磁盘上,那些页面位于操作系统上。 (我不明白的问题,页表是覆盖了物理内存的表项,为什么还会记录转移到了硬盘的表项)
2、存在位 存在位为1,则该页位于物理内存当中。 访问存在位为0的页表,会触发页错误,此时控制权转交给操作系统。
3、处理页错误 1)操作系统向硬盘发起I/O操作,此时程序进入阻塞状态,进行上下文切换,CPU运行另外一个程序。 当I/O操作完成以后,会将对应的页表标记为存在。 下次访问可能为未命中TLB(还未载入到TLB)中,也可能会命中TLB。
4、检查页错误的时候执行的算法 1)检查一下是否有空闲的页面 2)没有程序返回-1,执行页面交换算法 3)此时程序进入阻塞状态,等待I/O响应 4)I/O响应后,更改有效位 5)重新尝试获取下一条指令
5、何时交换页面? 系统会设置高水位线和低水位线来表示物理内存页表的个数,高水位线的时候仍然保留一些空闲的页表, 低水位线的时候后台的交换守护进程会开始运行,换进页面,将页面的个数提升到高水位线。 会将要写入的页面进行合并或分组,能够减少硬盘的寻道开销(不明白)
|