页式存储管理——虚拟内存——缺页中断,页面替换算法
开章明意: 创建一个进程(创建进程是在磁盘中),进程以字节为单位编号,然后再进程分为许多页(每页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. 在简单嵌入式系统中可以直接引用物理地址
来源:CSDN
作者:BestPHP.py
链接:https://blog.csdn.net/weixin_44682507/article/details/103587653