热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

内存管理:页式虚拟内存管理

页式存储管理——虚拟内存——缺页中断,页面替换算法开章明意:创建一个进程(创建进程是在磁盘中),进程以字节为单位编号,然后再进程分为许多页(每页4KB),内存中有对应的页框(设定同

页式存储管理——虚拟内存——缺页中断,页面替换算法

开章明意: 创建一个进程(创建进程是在磁盘中),进程以字节为单位编号,然后再进程分为许多页(每页4KB),内存中有对应的页框(设定同页)。通过页表(记录页和页框的对应关系),将最需要的页调入内存,其他页留在磁盘中。根据CPU的需要动态的更新页表,并调入调出页,实现对内存的充分利用。
本质就是:内存局部读入进程,其余的存储在磁盘中

内存不够用的问题—— 现阶段通常使用8G内存,但一个大型游戏就要10G+内存,如何解决?
虚拟内存:给每个进程分配一个独立的地址空间(本质在磁盘上),每个进程独立的地址空间就叫虚拟内存。 虚拟内存中的页是连续的,但可以对应到内存中不连续的页框,这样就实现了对内存的充分利用。(不要求内存提供连续的存储空间)
《内存管理:页式虚拟内存管理》
当进程建立时, 数据储存于磁盘内的虚拟内存空间,也不需要为该进程去配置主内存空间,只有当该进程的页被调用的时候才会被加载到实际内存中。
《内存管理:页式虚拟内存管理》
操作系统为了管理内存,给每个进程都分配独立的地址空间,对32位的系统而言,这个空间的大小是4GB。这4GB并不是实际的物理内存,实际上并不存在,因此有虚拟内存这一名称。

建立映射关系: 页(page),页框(frame),页表
分为大小相等的多个块,称为页(Page).每个页都是虚拟内存中一段连续的地址(一般一页为4Kb),其中一部分对应物理内存上的一块(称为页框,通常页和页框大小相等),还有一些没加载在内存中的对应在硬盘上。
内存构成: 8G, 按字节为单位编号(0-许多,这些编号就叫做地址),再按页框(一般为4KB)为单位进行与磁盘的数据交换.

页表结构: ——页表完成虚拟地址到物理内存地址的映射,每个进程都有一个自己的页表,
《内存管理:页式虚拟内存管理》
页表的每一项的属性
1.页号——页框号
2.偏移量:内存的基地址加上偏移量找到想要的内存地址 即地址空间计算时的公式
3.存在位:页是否在内存中
页表中每个项通常为32位,既4byte,除了存储虚拟地址和页框地址之外,还会存储一些标志位,比如是否缺页,是否修改过,写保护等。

页表存在MMU(memory management unit 内存管理部件)中
《内存管理:页式虚拟内存管理》

缺页中断,页面置换
进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现要访问的虚拟内存的页并不存在于物理内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,故障处理程序从磁盘中取得缺的页放入内存,如果内存已满按页面置换算法来废弃某个页面,将其所占据的物理页释放出来,再调入所需页。

页面置换算法:决定将哪些页面替换出去
选择哪些页替换出去就显得尤为重要,如果算法不好将未来需要使用的页替换出去,则以后使用时还需要替换进来,这无疑是降低效率的。

1.最佳置换算法(Optimal Page Replacement Algorithm)
将未来最久不使用的页替换出去,这听起来很简单,但是无法实现。但是这种算法可以作为衡量其它算法的基准
2.时钟替换算法: 最常用的算法
3.先进先出算法:淘汰在内存中最久的页,这种算法的性能接近于随机淘汰。并不好
4.最近不常使用算法: 淘汰最不经常访问的页项

空闲内存管理
系统要用什么样的数据结构记录内存的使用情况? ——
空闲区链表
用一个表来记录内存中空闲的页框
《内存管理:页式虚拟内存管理》
当很多个空闲分区都能满足进程的内存需求时,应该选择哪个分区进行分配? —动态内存分配算法
1.最先匹配(First Fit Allocation):足够大的第一个空闲区 最简单 不用搜索整个表
《内存管理:页式虚拟内存管理》
2.最佳匹配算法(Best fit): 搜索整个空闲区表,找到符合要求的最小空闲区 应用最广泛
《内存管理:页式虚拟内存管理》
3.最差匹配算法(Worst fit): 搜索整个表,分配最大的可用空间,性能最差
《内存管理:页式虚拟内存管理》

内存管理机制完善(三项实际中使用的技术)
对核心的页式虚拟内存管理的完善: ** 两级页表机制 + 页面高速缓存技术 + 段页式存储管理**
1.段页式存储管理(实际使用的管理方式): 页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享。如果将这两种存储管理方法结合起来,就形成了段页式存储管理方式。段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。
2…两级页表:二级页表 页目录—页表 二级结构,节省内存
3…页面高速缓存技术:又称为快表,提供中间由虚拟地址转换为物理地址时的缓存(缓存思想,缓存最常用的页),可以直接将虚拟地址映射到物理地址,加速分页过程
《内存管理:页式虚拟内存管理》

其他的一些基本概念:
1.重叠overlay ——即段式管理
如果一个程序需要使用比物理内存更大的内存空间怎么办?
此时,可以将程序按照功能分成一段一段功能相对完整的单元,一个单元执行完成后再执行下一个单元,这就是重叠(overlay)
2.交换技术:在磁盘中创建交换区,把一个最需要处理的进程完全调入内存(进程调度算法),使该进程运行一段时间。内存中进程未处于运行态时,就调出内存到磁盘交换区(即挂起),再调另一个完整进程进内存。空闲进程主要存在磁盘上,所以当他们不运行时就不会占用内存
3.动态重定位:基址寄存器,界限寄存器
基址寄存器: 寄存程序的起始物理地址
界限寄存器: 寄存程序的长度
《内存管理:页式虚拟内存管理》
为什么不能直接使用物理地址:
1.内存不够直接运行大型程序:内存往往是不够用的: 建立认知—— 计算机开机会启动大约100个进程,每个大约5-10M,
工作中的PS应用程序占 1G 左右内存 一个大型游戏就是10G+内存需求
2.无法并发:并发的概念——举例理解: 多个程序保持就绪态,随时可以运行
《内存管理:页式虚拟内存管理》
不同程序使用内存中不同的地址块 —— 使用绝对物理地址: 导致对内存地址的不正确访问(因为两个程序都使用绝对物理地址,两个程序访问地址冲突导致程序崩溃)
3. 在简单嵌入式系统中可以直接引用物理地址
《内存管理:页式虚拟内存管理》
内存管理直观—— 进程管理器: ctrl + Alt + delete
《内存管理:页式虚拟内存管理》


推荐阅读
  • 我从GoogleFirebase服务中看过视频并阅读了Cloudfirestore的文档,但我无法想象实时数据库.我想到了这个Web应用程序,我希望从不同类别的产品中存储我的提供程 ... [详细]
  • 开发笔记:网络协议系列八传输层TCP之可靠传输
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了网络协议系列八-传输层-TCP之可靠传输相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 前两天有位朋友邀请我回答个问题,为什么MongoDB(索引)使用B-树而Mysql使用B+树?我觉得这个问题非常好,从实际应用的角度来学习数据结构,没有比这更好的方法了。因为 ... [详细]
  • jdk8默认垃圾回收器_JVM系列之经典垃圾回收器(上篇)
    封面图1.前言随着JDK的不断更新,垃圾回收器的效率也越来越高。每一次JDK的更新,必然会包含有垃圾回收器的更新,截止目前, ... [详细]
  • 如何彻底搞懂jdk8线程池
    这篇文章将为大家详细讲解有关如何彻底搞懂jdk8线程池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有 ... [详细]
  • php怎么设置多个脚本(php怎么设置多个脚本编辑)
    导读:很多朋友问到关于php怎么设置多个脚本的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • 利用cacti添加mysql监控_cacti监控mysql  mysql复制
    监控mysqlmysql复制5.1.1主机配置1台cactiserver10.10.54.1593台msyqlservermaster:10.10.54.157sla ... [详细]
  • 本文是我在学习期间的笔记,看的书是《python语言及其应用》。转载请注明出处,谢谢。本文链接https:blog.csdn.netMing201712 ... [详细]
  • idea安装mybatisplugin(mybatis插件)
    注意:可以用免费版本的,就是下面没有被红框圈中的FreeMybatisPlugin  安装上以后需要破解,先找到下面的文件 打开文件,设置其中的key和value: 这里面的key ... [详细]
  • 编程实现QQ表情文件CFC格式
    编程实现QQ表情文件CFC格式背景:最近闲来无事,也应论坛某会员要求,想做个QQ表情下载的站点。本来事情是很简单的,写个小小 ... [详细]
  • MySQL的内存结构与物理结构
    从MySQL的物理结构和内存结构开始了解整个MySQL的运行机制,其中有几个特别重要的概念,也是平时工作中更加关注的地方,如:binlog、redolog、表空间、慢查询日志、My ... [详细]
  • 参考:http:lists.gnu.orgarchivehtmlqemu-devel2011-04pdfhC5rVdz7U8.pdftb_find_fast:查找下一个TB(T ... [详细]
  • CSTL中用vector改进内存的再分配作者:winter本文说明了vector容器使用时应该注意的内存分配问题,原理说的比较详细,对于初 ... [详细]
  • 如何提高工程编译速度
    点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~     文章首发  公众号——Pou光明公众号还在维护,大家莫慌~LinuxQt平台为例测试编译 ... [详细]
  • 1:Linux进程间通信类型2:管道(pipe)和有名管道(FIFO)。3:信号(signal),见signal函数、sigaction函数及信号集操作函数和信号的发送和捕捉函数( ... [详细]
author-avatar
缅甸环球国际
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有