04 非连续内存分配机制中的页表

非连续内存分配之页表知识点目录

页表(由操作系统生成):

  • 页表概述
  • 转换后备缓冲区(TLB
  • 二级/多级 页表
  • 反向页表

页表寻址过程:CPU获得逻辑地址之后,获取页号,然后查询页表找到对应的帧号(页内偏移和帧内偏移是一样的),然后加上帧内偏移,就可以找到内存中的物理地址。

页表中存储有 Flags 即从左往右第二位,如果为零说明在内存中不存在对应帧,此时操作系统返回内存访问异常 ,如果存在,就读取所在的页表项对应的 Frame num 找到对应的物理帧,之后加上页内偏移就可以得到物理地址,此时就完成了虚拟地址到物理地址的映射。

假如给了一个16位的地址系统,说明虚拟内存的大小为2^16 = 64 K,而给出的物理地址的大小为32 K ,这进一步说明了虚拟内存的大小一般要大于物理内存的大小,即虚拟内存单元有可能在物理内存中找不到对应的映射存储单元。其次,用于表示二进制逻辑地址和物理地址的偏移量的位数为10位,说明页和帧的大小为2^10 = 1024 byte.

分页机制的性能问题:即访问一个内存单元需要 2次内存访问

  • 一次用于获取页表项
  • 一次用于访问数据

另一个问题,操作系统建立的页表可能会非常大

  • 比如一个64的计算机,它能表示的寻址空间大小为2^64 , 如果每页是1024字节,那么分成的页的大小为2^54 ,那么页表的大小就为2^54,这个空间太大,一般计算机难以满足,就算计算机能放下,如此大的页表也不能存放在CPU的 cash(它的大小只有几兆),那么就需要放在内存中,这样会导致计算机的寻址效率变低
  • 同时如果页表很大,每次进行寻址操作时也会耗费较长的时间

如何解决页表机制带来的时间和空间的问题,是接下来的学习方向:

首先解决时间访问的时间的问题:

快表Translation Look-aside Buffer( TLB ):用于缓存近期访问的页帧转换表项,存在CPU的内存管理单元中。以空间换取时间。

  • TLB使用associative memory (关联内存)实现,具备快速访问性能
  • 如果 TLB命中,物理页号可能很快的被获取
  • 如果 TLB 未命中,对应的表项被更新到 TLB

如果页表很大,占用很大的空间,我们可以把一个页表用多级页表来表示

二级页表:(offset不变,但是吧page num划分成两块,p1p2p1对应一级页表的页号, p2对应二级页表的页号,一级页表中存的是二级页表的起始地址,二级页表存储是帧内偏移量,CPU知道一级页表的起始地址(存放在 PTBR 中),这样的机制的一个好处是,如果一级页表的中 p1的某个映射关系不存在,那么在 p2 中我们就没有必要存储对应的映射关系,节省了空间。

扫描二维码关注公众号,回复: 10807617 查看本文章

多级页表:通过把页号分为K个部分,来实现多级页表,建立页表 ,以时间换取空间。


反向页表

大的地址空间问题(逻辑地址):大地址空间(64位),前项映射表变得非常的繁琐,比如5级页表

解决问题的一个思路:不是让页表与逻辑地址空间的大小相对应,而是让页表与物理空间的大小向对应(反向页表)。

  • 逻辑(虚拟)地址的空间增长速度快于地址空间

方案:页寄存器(Page Registers)方案

每个页和寄存器相关联,寄存器的寄存器内容包括:

  • Residence bit : 此帧是否被占用
  • Occupier:对应的页号p
  • Protection bits:保护位
页寄存器方案的权衡

优点

  • 转换表的大小相对于物理内存来说很小
  • 转换表的大小根逻辑地址空间的大小无关

弊端

  • 需要信息对调,即根据帧号可以找到页号
  • 如何转换回来,即根据页号找到帧号
  • 需要在反向页表中搜索想要的页号

提示:为了更好的理解知识点,博主在微信公众号中将操作系统知识进行了重新排版和插入图片。感兴趣的朋友可以扫码进行关注。

在这里插入图片描述

发布了19 篇原创文章 · 获赞 1 · 访问量 716

猜你喜欢

转载自blog.csdn.net/weixin_45615071/article/details/105505352
04