操作系统:页存储

页存储

为了能知道每个进程的每个页面在内存中的存放位置,操作系统需要为每个进程创建一张页表。

在这里插入图片描述

如上图所示页表,记录了页面在内存中对应的内存块号,页表一般存放在内存中。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的内存块号。可见页表作用是实现从页号到内存块号的地址映射。这就是页存储。

页存储的特点:

  • 一个进程对应一个页表
  • 进程的每一页对应一个页表项
  • 每个页表项由“页号”和“块号”组成
  • 页表存放进程页面和实际存放的内存块的地址映射
  • 每个页表项的长度是相同的,页号是“隐含”的

页号为什么是隐含的?

因为要想知道页面对应的实际内存块,只需要知道块号即可,而页表项是连续的,因此只需要知道页表在内存中的起始地址以及每个页表项的长度即可

如何实现地址转换?

物理地址 = 页面始址 + 页内偏移量

第一种计算方式:

  • 页号 = 逻辑地址 / 页面长度
  • 偏移量 = 逻辑地址 % 页面长度

第二种计算方式:

在这里插入图片描述
页面大小一般为2的整数次幂

假设用32位表示逻辑地址,页面大小为(2^K)B,则末尾K位代表页内偏移量,其余部分代表页号

反过来说

如果有 K 位代表页内偏移量,则每个页面大小为 2^K 个内存单元

如果有 M 位代表页号,则每个进程最多允许有 2^M 个页面

从以上描述可以看出页式存储系统是一维的,只需要告诉系统逻辑地址,系统便可推算出页号 、页内偏移量等信息从而找到对应物理地址。

局部性原理

  • 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。程序循环、堆栈等是产生时间局部性的原因。
  • 空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与正在使用的信息在空间地址上是临近的。
  • 顺序局部性(Order Locality):在典型程序中,除转移类指令外,大部分指令是顺序进行的。顺序执行和非顺序执行的比例大致是5:1。此外,对大型数组访问也是顺序的。

快表

基于局部性原理,在慢表的基础上,加一个快表,在计算物理地址时候,先去访问快表,如果快表命中,则直接得到物理地址,只需要进行一次访存。如果快表未命中,则去访问慢表,并将慢表页表项复制到快表,需要进行两次访存。

两级页表

单级页表的缺陷:

  • 根据局部性原理,在很多时候,进程在一段时间内只需要访问几个页面就可以正常运行,因此没必要让整个页表常驻内存。
  • 页表必须连续存放,因此当页表很大时,需要占据很多连续的页框。

针对缺陷1:对单级页表的页表项进行分组,对分组后的页表项建立页目录表

在这里插入图片描述
针对缺陷2:如上图所示,可以在需要访问页面时才把页面调入内存(虚拟存储技术),在页表项中增加一个标志位用于表示该页面是否已被调入内存。若想访问的页面不在内存中,则会产生缺页中断(内中断),然后操作系统会把目标页面从外存调入内存。

两级页表的访存

  • 第一次访存:页目录表
  • 第二次访存:二级页表
  • 第三次访存:目标内存单元
  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值