操作系统(虚拟存储器)

操作系统(虚拟存储器)

笔者大三,最近在复习,为明年的春招做准备,欢迎互关呀,共同学习,进步!

虚拟存储器实现了内存扩充的功能,但是该扩充不是物理上实际的扩大内存容量,而是从逻辑上实现对内存容量的扩充,让用户感觉到的内存容量比实际内存容量大得多

在传统的存储器管理的方式中,他们都要求将一个作业全部装入内存后方能运行,但是这样会出现两种情况:

  • 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行
  • 有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让他们先运行,而降其他大量的作业留在外存等待

上面两种情况都是由于内存容量不够大,所以,虚拟存储器的出现就是为了从逻辑上扩大内存容量。

一,虚拟存储器工作流程

局部性原理:

应用程序在运行之前没有必要将之全部装入内存,而仅须将那些当前要运行的少数页面或段先装入内存便可运行其余部分暂留在外存。

工作流程:

程序运行时,如果他所要访问的页或段已经调入内存,便继续执行下去;否则,便发出缺页/缺段中断请求,此时OS将利用请求调页/调段功能将他们调入内存,以便进程能继续执行下去,如果此时内存已满,无法装入新页/段,OS还需要再利用页段置换功能,将内存中暂时不用的页或段调至外存,腾出足够内存空间后,再将所需要的页或段调入内存。

在这里插入图片描述

结果:

这样便可以使一个大的用户程序在较小的内存空间中运行,也可在内存中同时装入足够多的进程,使他们并发执行

二,分页请求系统

本文只重点说说分页请求系统

1.请求调页

页表数据结构

在请求分页系统中,需要的主要数据结构是请求页表,其基本作用仍然是将用户地址空间中逻辑地址映射为内存空间中的物理地址

页表如下:

在这里插入图片描述

状态位P:指示该页是否已经调入内存

访问字段A:用于记录本页在一段时间内被访问次数

修改位M:标识该页在调入内存后是否被修改过,如果未被修改过,在置换该页时,就不需要将该页写回到外存上;如果修改过,则必须重写到外存上。

外存地址:指该页在外存上的地址

内存分配

最小物理块数:

能保存进程正常运行所需的最小物理块数,当系统为进程分配的物理块数少于此值时,进程将无法运行

先聊一聊什么是固定和不可变分配,还有什么是局部和全局分配

  • 固定分配

    指为每个进程分配一组固定数目的物理块,在进程运行期间不再改变

  • 可变分配:

    是指先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况适当的增加或减少

  • 全局置换:

    如果进程在运行中发现缺页,则将OS所保留的空闲物理块取出一块分配给该进程,或者以所有进程的全部物理块为标准,选择一块换出

  • 局部置换:

    如果进程在运行中发现缺页,则只能从分配给该进程的N个页面中选出一块换出

内存分配策略

  • 固定分配局部置换
    • 缺点:难以确定为每个进程应该分配多少个物理块,太少,则会频繁的出现缺页中断,太多,则内存中的进程数量会减少,进而造成cpu空闲或者其他资源空闲的情况
  • 可变分配全局置换
    • 缺点:采用这种策略仅当空闲物理块中的物理块用完,内存中的页才会调出,被调出的页可能是系统中任何一个进程的页,此进程所有拥有的物理块会较少,导致其缺页增加
  • 可变分配全局置换

物理块分配算法

  • 平均分配算法

    每个进程分配的物理块数量一样

  • 按比例分配算法

    按照进程的大小根据比例分配

  • 考虑优先权的分配算法

    考虑到线程的优先级

调页策略

调页策略需要解决三个问题:

  • 何时调页
  • 何处调页
  • 如何调页
何时调页?
  • 预调页策略

    将那些预计在不久之后便会被访问的页面预先调入内存

  • 请求调页策略

    当发现所需页面不在时,便立即hi提出调页请求

何处调页?
  • 系统如果拥有足够的对换区空间,这时可以全部从对换区调入所需要的页面,但是在进程运行前,需要将所有与该进程有关的文件从文件区拷贝到对换区
  • 系统缺少足够的对换区空间,这时凡是不会被修改的文件,都直接从文件区调入;而当换出这些页面时,由于他们未被修改,则不必将他们重写到磁盘中,以后在调入时也是从文件区直接调入,对于可能被修改的部分,再将他们换出时必须换出到对换区,以后在需要时从对换区调入
如何调页?

在这里插入图片描述

2.页面置换

页面置换就是从内存中调出一页送到外存中

页面置换算法

置于怎么选择哪一页调出,则需要页面置换算法来决定

目前有这几种页面置换算法

  • 最佳置换算法

  • 先进先出置换算法

  • 最近最久未使用LRU算法

  • 最少使用置换LFU算法

    1.最佳置换算法

(理想置换算法):从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。 即被淘汰页面是以后永不使用或最长时间内不再访问的页面。

最佳置换算法可以用来评价其他算法。假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
进程运行时,先将7, 0, 1三个页面依次装入内存。进程要访问页面2时,产生缺页中断,根据最佳置换算法,选择第18次访问才需调入的页面7予以淘汰。然后,访问页面0时,因为已在内存中所以不必产生缺页中断。访问页面3时又会根据最佳置换算法将页面1淘汰……依此类推,如图所示。从图中可以看出釆用最佳置换算法时的情况。
可以看到,发生缺页中断的次数为9,页面置换的次数为6。

在这里插入图片描述

2.先进先出置换算法

是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。 即优先淘汰最早进入内存的页面。

在这里插入图片描述

这里仍用上面的实例,釆用FIFO算法进行页面置换。进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。由图可以看出,利用FIFO算法时进行了 12次页面置换,比最佳置换算法正好多一倍。

3.最近最久未使用(LRU)算法

种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。 即淘汰最近最长时间未访问过的页面。

在这里插入图片描述

LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大;FIFO算法实现简单,但性能差。所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体。
简单的CLOCK算法是给每一帧关联一个附加位,称为使用位。当某一页首次装入主存时,该帧的使用位设置为1;当该页随后再被访问到时,它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换;如果所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情况,故称为CLOCK算法,又称为最近未用(Not Recently Used, NRU)算法。

3.抖动和工作集

抖动

在页面置换过程中的一种最糟糕的情形是,刚刚换出的页面马上又要换入主存,刚刚换入的页面马上就要换出主存,这种频繁的页面调度行为称为抖动,或颠簸。如果一个进程在换页上用的时间多于执行时间,那么这个进程就在颠簸。

抖动产生的原因:

  • 同在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁出现缺页,必须请求系统将所缺的页调入内存,这会使在系统排队等待页面调入调出的进程数目增多,造成每个进程的大部分时间都处于页面的换进换出,而几乎不去做任何有效的工作

工作集

工作集(或驻留集)是指在某段时间间隔内,进程要访问的页面集合。经常被使用的页面需要在工作集中,而长期不被使用的页面要从工作集中被丢弃。为了防止系统出现抖动现象,需要选择合适的工作集大小。

发布了254 篇原创文章 · 获赞 136 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_41922289/article/details/102789804