内存空间3种扩容方式(含虚拟内存)

(151) 2024-05-02 20:01:01

内存空间3种扩容方式(含虚拟内存) (https://mushiming.com/)  第1张

内存空间扩容

思考:GTA游戏60GB,讲道理运行前应该把60GB数据放入内存,然而我的电脑只有4GB,但是为什么游戏可以正常运行?

1.覆盖技术(单个进程)

  1. 覆盖技术的思想:将程序分为多个段(多个模块)。 常用的段常驻内存,不常用的段在需要时调入内存。

  2. 一个固定区
    存放最活跃的程序段
    分配在固定区的程序段,在运行过程中就不会调入调出(内存<->外存)

  3. 若干个覆盖区
    层级相同的模块程序代码共享一个覆盖区
    在运行过程中根据需要调入调出

  4. 必须由程序员声明覆盖结构,操作系统完成自动覆盖。

  5. 缺点:对用户不透明,增加了用户编程负担,现在的程序代码很难分层

注意:覆盖是在同一个程序或者说同一个进程发生的

2.交换技术(不同进程)

  1. 交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中 某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)

  2. 中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。

  3. 几个需要解决的问题

    1. 应该在外存(磁盘)的什么位置保存被换出的进程?
      具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。
      文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采 用离散分配方式;
      对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。
    2. 什么时候应该交换?
      交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程; 如果缺页率明显下降,就可以暂停换出。
    3. 应该换出哪些进程?
      可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调 入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间
  4. 交换是在不同进程或者说不同作业之间发生的

注意:PCB 会常驻内存,不会被换出外存

3.虚拟技术(最复杂)

3.1.虚拟内存的基本概念

内存空间3种扩容方式(含虚拟内存) (https://mushiming.com/)  第2张

下面只针对请求分页存储管理展开

3.2.请求分页管理方式

内存空间3种扩容方式(含虚拟内存) (https://mushiming.com/)  第3张

  1. 页表机制
    • 在基本分页的基础上增加了几个表项
    • 状态位,表示页表是否已经在内存中
    • 访问字段,记录最近被访问的次数,或者记录上次访问的时间,是给置换算法选择换出页面做参考
    • 修改位,表示页面调入内存后,(代码)有没有被修改过,只有修改过的页面才会在置换的时候写回外存
    • 外存地址,页面在外存中存放的位置
  2. 缺页中断机构
    1. 当找到页表项后,根据状态位判断页面是否在内存,若不在内存中,则产生缺页中断
    2. 缺页中断处理后,目标页面会被调入到内存,若当前内存分配的已满,则需要换出老页面
    3. 缺页中断属于内中断,属于内中断里的故障,就是会被系统修复的异常,此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。
    4. 一条指令在执行过程中,可能会产生多次缺页中断
  3. 地址变换机构
    • 找到页表项(页表会记录所有页面分配情况),检查页面是否在内存中
    • 若页面不再内存中,需要请求调页
    • 若内存空间不够,需要换出老页面(页面置换算法,下面补充)
    • 页面调入内存后,记得修改相应的页表项

3.3.页面置换算法

  1. 背景
    请求分页存储管理与基本分页存储管理的主要区别: 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。 若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。

  2. 最佳置换算法OPT(optimal)

    • 优先置换最长时间内不会被访问的页面
    • 缺页率最小,性能最好,但是无法预判后面访问的页面也就无法实现
  3. 先进先出置换算法FIFO(first input first output)

    • 优先淘汰最先进入内存的页面
    • 实现简单,但是性能很差,往往最先进入的页面需要多次访问
    • 可能出现Belady异常
    • Belady 异常——当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
  4. 最近最久未使用置换算法LRU(least recently)

    • 前提:内存块已经塞满页面,页表记录有最近访问时间戳
    • 优先淘汰最久没有访问页面(页表有最近访问时间戳)
    • 性能很好,但是需要硬件支持,算法开销大
  5. 时钟置换算法clock

    • 前提:内存块塞满了页面,并且此时页面访问位都是=1
    • 循环扫描每个页面
      • 第一轮先找到访问位=0的页面,置换新页面,并将扫描过的页面改成访问位=0,若第一轮没有选中,则进行第二轮扫描(第二轮扫中一定会有访问位为0的页面)
    • 实现简单,算法开销小,但是没有考虑页面有没有被修改
  6. 改进型的时钟置换算法

    • {访问位,修改位},访问的页面比修改的页面更值得留下

    • 前提:内存块塞满了页面,并且此时页面访问位都是=1,修改位未知

      第一优先级,最近没访问,最近没修改
      第二优先级,最近没访问,最近有修改
      第三优先级,最近有访问,最近没修改
      第四优先级,最近有访问,最近有修改
      算法开销小,性能也还不错

3.4.页面分配策略

背景:我们已经知道请求分页管理方式,页面置换算法,那怎么知道进程需要分配多少物理块呢?

  1. 概念

    • 驻留集
      • 指请求分页存储管理中给进程分配的物理块的集合。
      • 驻留集大小一般小于进程的总大小
      • 若驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,实际用于进程推进的时间很少; 驻留集太大,又会导致多道程序并发度下降,资源利用率降低
    • 固定分配
      操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集 大小不变
    • 可变分配
      先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。 即,驻留集大小可变
    • 局部置换
      发生缺页时只能选进程自己的物理块进行置换。
    • 全局置换
      可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换 到外存,再分配给缺页进程。
  2. 页面分配、置换策略

    • 固定分配局部置换
      进程运行前就分配一定数量物理块,缺页的时候只能换出进程自己的某一页
    • 可变分配全局置换
      只要缺页就分配新的物理块,可能来自空闲物理块,也可能需要换出其他进程的页面
    • 可变分配局部置换
      频繁缺页的进程,多分配一些物理块;缺页率很低的进程,回收一些物理块,直到缺页率合适
  3. 调入页面的时机

    • 预调页策略,一般用于进程运行前
    • 请求调页策略,进程运行时,发现缺页再调页
  4. 从何处调页(外存->内存)

    1. 对换区,采用连续连续,文件区,采用离散存储方式
    2. 对换区足够大,运行将数据从文件区复制到对换区,之后所有页面调入和调出都是内存与对换区之间进行
    3. 对换区不够大,不会被修改的文件,直接从文件区取出;会修改的文件先放到调换区,有需要时再从对换区调入
    4. UNIX方式,第一次使用的页面都是从文件区调入;调出的页面都需要写回对换区,再次使用时从对接区调入
  5. 抖动现象
    页面频繁换入换出,主要原因是分配给进程的物理块不够

  6. 工作集
    在某段时间间隔内,进程实际访问页面的集合,驻留集一般不能小于工作集大小

THE END

发表回复