内存管理 || 虚拟内存的管理

覆盖技术:

  • 程序设计分为常驻区以及覆盖区

  • 覆盖区可以通过运行与阻塞时换入换出实现内存空间的共享

  • 同一覆盖区的程序模块之间必须不存在相互调用关系

内存管理 || 虚拟内存的管理_第1张图片

交换技术:

  • 将进程的整个地址空间在某个时刻导入到外存或从外存导入内存
  • 交换技术的问题:
    • 开销比较大,只有当内存不足时再换入换出
    • 硬盘中交换区必须足够大以存放所有用户进程的所有内存的拷贝
    • 程序换入时的重定位,动态地址映射方法。

覆盖和交换的区别:

  • 覆盖发生在一个程序里面,通过没有调用关系的模块共享一个内存区使得空间充分利用,但需要程序员手动指定之间覆盖模块的逻辑关系。
  • 交换每次是换入换出一个程序,开销比较大,但由操作系统,不需要程序员手动操作。

虚拟内存:

在页式或段式内存管理的基础上实现

  • 在装入程序时,不必将全部装入内存,只需将当前需要执行的部分页面或段装入内存
  • 在程序执行过程中,如果需执行的指令或访问数据未在内存(缺页或缺段),则处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序。
  • 另外,操作系统将内存中暂时不使用的页面或段调出保存在外存上,从而腾出更多空闲空间存放将要装入的程序

需要程序具有较好的局部性

以便不需要多次与外存进行换入换出,也就是减少缺页率。

程序的局部性原理:程序在执行过程中一个较短的时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。

  • 时间局部性:一次指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时期。
  • 空间局部性:当前指令和邻近几条指令,当前访问的数据和邻近几个数据都集中在一个较小的区域内。

虚拟内存特征:

  • 大的用户空间:将物理内存和外存结合起来。
  • 部分交换:与交换技术相比,虚拟内存的调入调出是对部分虚拟空间地址进行的。
  • 不连续性

虚拟页式内存管理:

大部分虚拟存储系统都采用页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能。

内存管理 || 虚拟内存的管理_第2张图片

缺页中断:

内存管理 || 虚拟内存的管理_第3张图片

分段内存管理:

  • 段号+偏移量

  • 具有处理不断增长的数据结构的能力

  • 支持共享和保护

段页式内存管理:

用户程序的地址空间被划分为很多段,再把每个段分为若干个页

段号+段内页号+页内地址

虚拟内存的操作系统策略:

读取策略:

何时读入内存

  • 请求分页(缺页时才读入内存),运行期间调入。
  • 预先分页:局部性原理,一次性调入若干相邻的页面。但可能调入的大多数未被访问,则降低效率。所以实际应用中主要用于进程的首次调入。

当一个进程被换出内存并被置于挂起状态,它的驻留页都被换出。当进程被唤醒时,所有以前在内存中的页都被重新读回内存。

放置策略:

进程块在内存中的实际位置

  • 纯分段机制可以使用最佳适配等方法
  • 段页式或页式可以有硬件高效实现

置换策略:

最佳置换算法(OPT)
  • 淘汰的页面是以后永不使用或在最长时间内不再访问的页面或在较长时间内不再访问。

  • 需要看之后的页面号引用串,淘汰最长时间不被引用的。

  • 但是该算法前提条件是知道之后引用的页面,而实际运行中操作系统不可能事先知道页面的访问序列,因而这种算法只是一种理想算法,实际并不会实现。

先进先出置换算法(FIFO)
  • 淘汰最早进入内存的页面

  • 系统维持一个置换队列,队列中节点数等于为进程分配的内存块数,每次置换删除队首节点,新节点插入队尾。

  • 该算法会造成Belady异常,也就是分配多的内存缺页次数反而增多。

最近最久未使用置换算法(LRU)
  • 每次淘汰的页面是最近最久未使用的页面
  • 性能好,但是实现困难,需要硬件支持,开销大
时钟置换算法(CLOCK)
  • 也称为最近未用算法(NRU)

  • 每个页面都有一个访问位,将内存中的页面通过链接指针链接成一个循环队列。当页面被访问时,其访问位置置为1。当需要淘汰一个页面时,只需要检查页面的访问位。如果是0,则选择该页换出;如果是1,则将其置为0,暂不换出,继续检查下一个页面。若第一轮扫描所有页面都是1,则将这些页依次置为0后,再进行第二轮扫描。

  • 若页面已经存在循环链表中,则不需要移动指针。因为不会查看置换队列。

内存管理 || 虚拟内存的管理_第4张图片

改进型时钟置换算法
  • 简单时钟置换算法仅考虑一个页面最近是否被访问过。事实上如果被淘汰的页面没有被修改过,则不需要执行I/O操作写回外存。所以在其他条件相同情况下,优先淘汰没有修改过的页面。

  • 因此增加一个修改位,修改位为1表示页面被修改过。

  • 算法规则:将所有可能被置换的页面排成一个循环队列(访问位,修改位),淘汰一个页面最多经过四轮扫描

    • 第一轮:淘汰(0, 0)。本轮扫描不修改任何标志位。淘汰优先级为(0, 0)
    • 第二轮:淘汰第一个(0, 1)。本轮扫描所有的访问位置为0。淘汰优先级为(0, 1)
    • 第三轮:淘汰第一个(0, 0)。本轮扫描不修改任何标志位。淘汰优先级为(1, 0)
    • 第四轮:淘汰第一个(0, 1)。淘汰优先级(1, 1)

分配策略:

驻留集:请求分页存储管理中给进程分配的物理块(页框)的集合,在虚存中驻留集大小一般小于进程的总大小。

若驻留集太小会导致缺页频繁,若太大则可能导致多道程序中资源利用率低。

驻留集的大小:

  • 固定分配:OS为每个进程分配一组固定数量的物理块,在进程运行期间不再改变,驻留集不变
  • 可变分配:先为每个进程分配一定数量的物理块,在进程运行期间可根据情况做适当的增加或减少。驻留集可变

置换范围:

  • 局部置换:置换只能选择进程内部的物理块
  • 全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

固定分配局部置换

可变分配全局置换:刚开始为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某进程缺页时,从空闲物理块中取出一块分配给该进程;若无空闲物理块。则可选择一个未锁定页面换出外存,再将该物理块分配给缺页的进程。

可变分配局部置换

抖动(颠簸)现象

频繁的页面换入换出行为,原因是分配给进程的物理块不够

防止方法:

工作集:进程在某段时间间隔实际访问的页面集合。

工作集大小可能小于窗口尺寸,根据工作集大小动态调整窗口尺寸,一般来说驻留集大小不能小于工作集大小。

调入策略:

从何处调入页面

你可能感兴趣的:(操作系统)