2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

  • 页式存储
  • 逻辑地址、物理地址
  • 如何判断物理地址和逻辑地址它们之间的地址关系?
  • 页面大小与页内地址长度的关系
  • 例题
  • 总结
  • 缺页中断
  • 内存淘汰规则

在存储管理当中,操作系统会负责将外存的一些文件调入到内存当中,以便给CPU调用,如果调用的内容不在内存当中,那么会产生一种中断,叫做缺页中断。然后从外存调数据,调完数据再返回,接着访问之前的断点部分。

在调用的过程当中,如果是一个几十G的文件,调入到内存是一下放不进去的,如果是大型游戏,几百G,都放入内存显然是不可能的。

如果只调用一部分内容,是不是内存就恰好有足够大小的连续空间去放置呢?
太理想化了,这个可能性并不大。所以在存储管理当中,从外存调入数据到内存当中的时候,一般会把完整的内容切割之后,分散的进行放置,那么分割的方式不一样,会有不同的调用方式。

页式存储

分页存储管理,分页存储也就是页式存储的过程。它会将文件与内存都划分成相同大小的区域,这个区域我们叫做,或者叫做

逻辑地址、物理地址

知道相应的页或块之后,我们只需要将页和内存当中对应的位置关系以一个表记录下来,就可以记录它们之间的映射关系。
这个表我们把它叫做页表,页表最基础的内容会包含在用户程序当中的页号,我们一般把它叫做逻辑页号,程序里面的地址叫做逻辑地址

调入到内存之后,放到内存的什么位置呢?
我们把对应关系记录下来,我们叫做页帧号,或者物理块号,它在内存当中的地址我们称为物理地址

对于物理地址和逻辑地址,我们一般会对应用程序根据逻辑地址查表,从而得到它的内存当中的物理地址,然后在实际的访问这个内容,整个过程当中,需要掌握逻辑地址和物理地址的转换关系。

如何判断物理地址和逻辑地址它们之间的地址关系?

我们所有的地址都会划分成两个部分,一个部分是在页内的具体地址,一个是在页外的出现的页号编号,这种编号与页号之间的关系类似于在寄快递的时候,先省市区,再是街道门牌号,较大的地址范围会放在高位上,细节的地址范围会放在低位上,一般低位我们把它叫做页内地址,它是在固定区域大小当,它所定义的一个偏移量,高位就是它对应的编号。

一个完整的地址,一般会用二进制,或者十六进制,有时候也会用十进制来表示,那么怎么确定哪里是页内地址,哪些是页号?
这个时候,会涉及到对页面大小的定义,如果页面存储系统当中,每个页的大小都是4KB,我们在回到主存编制的过程中,现在有一个页面大小的区域,总容量大小是4KB,在未知的情况下,默认按字节编组,也就是4KB/1B=4KB=4096个存储单元,可以表示的编号是0 ~ 4095,如果用比特位二进制来表示的话,则是000000000000 ~ 111111111111。

页面大小与页内地址长度的关系

可以总结下4KB的对应关系:4KB大小的页需要十二位二进制来表示212的不同的编码,对应4K个存储单元编号,对应4KB大小。依此类推,页面大小8KB,则页内地址长度为213

有了这种对应关系之后,将相应的地址转换成二进制,数一数页内地址的长度(从右往左数),第一位是页内地址,剩余的高位就是页号。

例题

例如页式存储系统中,每个页的大小4KB。
逻辑地址:10 1100 1101 1110,求物理地址


4K个存储单元编号,对应4KB大小
逻辑地址:10 1100 1101 1110,因此从右往左数12位,还剩下左面的10,10所对应的十进制数是2,也就是页号为2,排除的12位是页内地址,是不变的,于是根据图中页表可知,块号为6,6转换为二进制是110

所以对应的物理地址:110 1100 1101 1110

总结

页的大小一般是以KB为单位的,相对来说,页面大小比较小。

在页式存储中,对于内存进行页面分配的时候,要么页面空闲,我们把它塞满,要么它已经占用了,一般可以利用到的碎片空间都可以利用,如果碎片空间小于页面大小,才不能够使用,所以在分配内存的时候,空闲的碎片一般会小于页面大小,空间利用率高,分配管理起来就比较简单。

但也正因为如此,页面太过于零碎,所以每次都需要查表去找相应的页面,这样增加了系统的开销;以页面位单位来进行调度的时候可能会产生抖动现象。所谓抖动现象就是给某一个进程分配3个页面,那它需要淘汰调用新页面的次数n,会小于给进程分配4个页面的情况,这种情况就是说明虽然系统增加了硬件设备,但是系统整体性能反而降低了,这个想想就叫做抖动。

高级程序语言使用逻辑地址,
运行状态,内存中使用物理地址。

逻辑地址=页号+页内地址
物理地址=页帧号+页内地址

优点:利用率高,碎片小,分配及管理简单
缺点:增加了系统开销;可能产生抖动现象

缺页中断

在调用的过程中,会给用户进程分配个别的一些内存页面来给它用,但是有限的页面肯定是不够用的,当想要访问某个用户程序页的时候,发现它并不在内存中,就会产生缺页中断。

内存淘汰规则

有缺页中断后,就需要把这个页面调用到内存当中,那么已经满了,要怎么调用?需要把内存已有的数据给剔除出去,这个剔除遵循下述规则:

页表相对来说比较复杂,还会记录相应的界面是否在内存的状态位,还有是否访问的访问位,是否修改的修改位。访问位会定时清零,也就是说,最近访问的最近是有时间限制的,如果超过了这个时间,没有再次被访问,则会认为近期不再会被访问,因此将访问位置为0。

修改位只要被修改过,就会置为1,不论过了多久。

上图只分配了2,3,5,6四个物理页,剩下的并没有使用,也就是说0,1,2,5号逻辑页已经在内存了,那么躲过现在想用3号逻辑页,怎么做?

需要经内存当中,已有的逻辑页淘汰一个,才能使用3

淘汰规则:
前提条件:状态位为1(0表示都不在内存,自然无法内存参与淘汰)
①访问位为0,(根据局部性原理来看,最近访问过的页面接下来很有可能用到,这种页面尽可能保留)
②访问位都为0,再优先淘汰修改位为0,(修改位为1,则开销成本会更大,如果刚把修改的页面费半天劲淘汰了,而且为了一致性原则,还同步了外存,但是立马又要修改,这种情况就很麻烦,所以一般是最后用完之后再去淘汰,可以避免不必要的开销和重复修改)

2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则相关推荐

  1. 分页存储概念清晰梳理(页面、页表、页表项、页面大小、页内地址等概念)

    当我在学习操作系统的存储器管理这一章中的分页存储时发现我总是将许多概念混为一谈,当我求助于CSDN等众多网站的资源时发现其中的概念作者写的十分清晰但篇幅较长难以理解,因此我想用自己的理解用更加简洁明了 ...

  2. 存储管理之页式、段式、段页式存储

    首先看一下"基本的存储分配方式"种类: 1.  离散分配方式的出现 由于连续分配方式会形成许多内存碎片,虽可通过"紧凑"功能将碎片合并,但会付出很大开销.于是出 ...

  3. 【操作系统】在一页式存储管理系统中,某作业页表如下。已知页面大小为 1024 字节,问逻辑地址1068,2566,5699 所对应的物理地址各是多少?如果需要置换一页,应该选择哪一页?置换后所对应的物

    在一页式存储管理系统中,某作业页表如下. 已知页面大小为 1024 字节,问逻辑地址1068,2566,5699 所对应的物理地址各是多少?如果需要置换一页,应该选择哪一页?置换后所对应的物理地址是多 ...

  4. 【学习笔记】第三章——内存 III(分段存储、段页式存储、分段和分页对比)

    文章目录 一. 分段存储 1) 概念 2)段表 二. 分段 VS 分页 1)对比 2)优缺点分析 三. 段页式存储 1)定义 2)逻辑地址结构 一. 分段存储 1) 概念 离散,每段从0开始编址,每个 ...

  5. c语言段页式存储地址转换,页式存储和段页式存储的地址转换过程

    一.页式存储-地址转换 访问2次内存,第一次是页表,第二次是真正的物理内存. 二级页表,访问3次内存 两个例子的形式讲解逻辑地址到物理地址的转换: (1) 页系统页表 : 页号: 0 1 2 3 4 ...

  6. 分段地址变换过程c语言,段页式存储结构

    段.页式存储都是采用离散分配方式的.离散分配方式:允许一个进程直接分散地装入到许多不相临的分区中,可以更好的提高内存利用率. 一.基本分页存储 1.分页存储方式原则 把逻辑进程分为若干页:把实际内存分 ...

  7. 页式存储,段式存储,段页式存储,引入快表等访存次数

    王道的说法 页式存储,2次: 第一次,访问内存中的页表,利用逻辑地址中的页号查找到页帧号,与逻辑地址中的页内偏移拼接形成物理地址: 第二次:得到物理地址后,再一次访问内存,存取指令或者数据. 段式存储 ...

  8. java 转换pdf页面尺寸_Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转...

    下面的示例将介绍通过Java编程来对PDF页面进行个性化设置的方法,包括设置页面大小.页边距.纸张方向.页面旋转等.这里有如下多种页面大小尺寸可供选择: 同时,设置文档内容旋转时,可支持如下角度进行内 ...

  9. java 设置pdf页面大小_Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转...

    Java PDF页面设置--页面大小.页边距.纸张方向.页面旋转 发布时间:2020-08-31 01:32:03 来源:51CTO 阅读:157 作者:E_iceblue 下面的示例将介绍通过Jav ...

最新文章

  1. Docker大行其道—镜像
  2. Spring学习3之IOC创建对象的方式
  3. redis-cli使用密码登录
  4. python绘制饼图双层_有趣!如何用Python-matplotlib绘制双层饼图及环形图?
  5. 多线程:三大不安全案例
  6. MySQL分区表概述
  7. android switch控件的大小,关于Android Action Bar 上的 Switch控件
  8. matlab电气应用,基于MATLAB/Simulink的高压直流输电系统的仿真研究.pdf
  9. 【Paper reading】可变剪接预测ENCODEC数据集
  10. 冯 • 诺依曼体系结构
  11. TV新媒体电商发展遇瓶颈
  12. android:TableRow之平均分布列
  13. windows安装cygwin
  14. android打开另外的app两种方式,内置到自己本身的app,重新打开app,
  15. Node.js实现网络新闻爬虫及搜索功能(一)
  16. 如何连接ftp服务器
  17. 求最大值的c语言程序,c语言如何求最大值
  18. 自动更新Android应用后, app 进入后台重进会重启
  19. Discuz!论坛教程之设置帖子被评分后自动提升主题
  20. 软件架构的发展及研究现状

热门文章

  1. centos 7 vmstat命令详解
  2. PAT 1063 计算谱半径
  3. python网络游戏开发教程_python 网游开发教程 | python做的游戏有哪些
  4. TCP 滑动窗口协议 详解
  5. 2016第七届ACM山东省赛
  6. 网络:tcp长连接与短连接
  7. iphone.android下载,如何在iPhone和Android上删除下载
  8. sb3500_您的代码如何在3500万人的家庭中成为社会公益的代言人
  9. 【Verilog】inout 端口信号的使用
  10. n1盒子openwrt某个容器无法启动 启动直接死机