一种存储器抽象-地址空间 物理地址泄露可能导致用户破坏操作系统,切回影响进程运行,因此提出地址空间这个抽象空间
实行前提:基址寄存器和界限寄存器
内存分配方法 1、最佳适配算法 每次从头开始寻找满足内存要求的内存块 2、下次适配算法 从上一次终止的地方开始查找下一个内存块 3、最佳适配算法 寻找能够容纳进程的最小的进程区 4、快速适配算法 按照2,4,8,16等规律分数据块,直接给予完整的空间 问题是进程退出时,合并会出现困难
关键词:MMU 中文:内存管理单元 作用:将虚拟地址映射为物理地址
页表 负责实现虚拟地址到物理地址的映射 加快映射速度的方式: 转换检测缓冲区 TLB 通常在MMU中,包含少量的表项(类似于计算机中的cache) 多级页表机制:不是所有页表项都需要记录,只需要部分顶级页表项,如果顶级页表项没有的话,二级页表项无需记录,因此可以节省很多内存。
页面置换算法 1、最优页面置换算法(理想情况) 2、先进先出置换算法
可能出现Beledy异常 即分给进程的物理块越多,反而越容易出现缺页 3、最近最久未使用算法(LRU) 根据历史规律进行判断,淘汰最久没有使用的页面LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大 堆栈实现,成本较大 4、clock替换算法 简单的CLOCK算法是给每一帧关联一个附加位,称为使用位。当某一页首次装入主存时,该帧的使用位设置为1;当该页随后再被访问到时,它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换;如果所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情况,故称为CLOCK算法,又称为最近未用(Not Recently Used, NRU)算法。CLOCK算法的性能比较接近LRU,而通过增加使用的位数目,可以使得CLOCK算法更加高效。在使用位的基础上再增加一个修改位,则得到改进型的CLOCK置换算法。这样,每一帧都处于以下四种情况之一:
最近未被访问,也未被修改(u=0, m=0)。 最近被访问,但未被修改(u=1, m=0)。 最近未被访问,但被修改(u=0, m=1)。 最近被访问,被修改(u=1, m=1)。
算法执行如下操作步骤:
从指针的当前位置开始,扫描帧缓冲区。在这次扫描过程中,对使用位不做任何修改。选择遇到的第一个帧(u=0, m=0)用于替换。 如果第1)步失败,则重新扫描,查找(u=0, m=1)的帧。选择遇到的第一个这样的帧用于替换。在这个扫描过程中,对每个跳过的帧,把它的使用位设置成0。 如果第2)步失败,指针将回到它的最初位置,并且集合中所有帧的使用位均为0。重复第1步,并且如果有必要,重复第2步。这样将可以找到供替换的帧。
改进型的CLOCK算法优于简单CLOCK算法之处在于替换时首选没有变化的页。由于修改过的页在被替换之前必须写回,因而这样做会节省时间。 (链接:https://blog.csdn.net/Youth_Mr6/article/details/82767332)
分段: 概念:在机器上提供多个相互独立的称为段的地址空间 特点: 不同段的长度可以不同
每个段独立地增长和减小而不会影响其他的段
便于对多段编译好的过程进行链接
即使某段过程被修改,起始地址发生变化也不需要修改其他过的起始地址(一维地址空间的情况下则需要如此做)
分段便于实现共享,无需在每段进程的地址空间中单独保存一份,可以节省内存