计算机操作系统详细学习笔记(三):存储管理

三、存储管理

3.1 存储管理的主要模式

计算机操作系统详细学习笔记(三):存储管理

3.1.1 逻辑地址

逻辑地址,又称相对地址,即用户编程所使用的地址空间。

逻辑地址从 0 开始编号,根据是否分段有两种形式:

  1. 一维逻辑地址(地址)
  2. 二维逻辑地址(段号,段内地址)

段式程序设计(逻辑地址分段)

方法: 把一个程序设计成多个段(代码段、数据段、堆栈段等)

段覆盖技术: 用户可以应用该技术扩充内存空间使用量。这一技术是程序设计技术,不是 OS 存储管理功能。

  • 该技术是把程序划分为若干个功能上相对独立的程序段,按照其自身的逻辑结构使那些不会同时运行的程序段共享同一块内存区域。程序段先保存在磁盘上,当有关程序的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段。

3.1.2 物理地址

物理地址,又称绝对地址,即程序执行所使用的地址空间。处理器执行指令时按照物理地址进行。

主存储器的复用

多道程序设计需要复用主存。

  • 按照分区复用
    • 主存划分为多个固定 / 可变尺寸的分区
    • 一个程序 / 程序段占用一个分区
  • 按照页框复用
    • 主存划分为多个固定大小的页框
    • 一个程序 / 程序段占用多个页框

3.1.3 存储管理的基本模式

  1. 单连续存储管理
    • 程序(一维)
    • 对应一个主存固定分区或可变分区
  2. 段式存储管理
    • 程序(分段,二维)
    • 对应多个主存可变分区
  3. 页式存储管理
    • 程序(一维)
    • 对应多个主存页框
  4. 段页式存储管理
    • 程序(分段,二维)
    • 对应多个主存页框

计算机操作系统详细学习笔记(三):存储管理

3.2 存储管理的功能

计算机操作系统详细学习笔记(三):存储管理

3.2.1 地址转换

概念

地址转换,即重定位,将逻辑地址转换成绝对地址。

根据地址转换的时间来进行分类。

静态重定位

在程序装入内存时进行地址转换。由装入程序执行,早期小型 OS 使用。

动态重定位

在 CPU 执行程序时进行地址转换,依赖硬件来进行转换。如果不用硬件,效率会极大地下降。

3.2.2 主存分配与去配

程序装入主存与离开主存时分别进行分配与去配操作。(符合常识)

分配

进程装入主存时,存储管理软件进行具体的主存分配操作,并设置一个表格记录主存空间的分配情况。

去配

当某个进程撤离或主动归还主存资源时,存储管理软件要收回它所占用的全部或者部分存储空间,调整主存分配表信息。

3.2.3 主存空间共享

共享主存资源

多个程序在主存中各自占用一定数量的存储空间,共同使用一个主存储器。(没有空间的复用)

共享主存区域

多个进程有共同的主存程序块或主存数据块。

3.2.4 存储保护

主存分为三类区域,我自己的、公共的、别人的。

私有主存区(我自己的)

可读可写

公共区

根据授权(可读/写授权)

非本进程信息(别人的)

不可读写

存储保护功能需要软硬件协同完成。

3.2.5 主存扩充

存储扩充技术(少调入、调别处)

把磁盘作为主存扩充,只把部分进程或进程的部分内容装入内存。

  1. 对换技术(调别处): 把部分不运行的进程调出
  2. 虚拟技术(少调入): 只调入进程的部分内容

软硬件实现存储扩充

  1. 对换进程决定对换,则硬件机构执行调入
  2. CPU处理到不在主存的地址,发出虚拟地址异常,OS将其调入,重新执行指令。

3.3 虚拟存储器的概念

计算机操作系统详细学习笔记(三):存储管理

3.3.1 提出原因

  1. 主存容量限制非常不便于程序编写,且多道程序设计的道数受容量限制。
  2. 而用户程序通常顺序执行,具有时空局部性,因此考虑只调入部分到主存中。

3.3.2 实现目标

  1. 将有用的调出到主存。全部信息放入辅存,每次调入部分到主存,随用随调
  2. 如果主存空闲空间不足,则将不用的调出到辅存。

3.3.3 实现方法

  • (辅存)虚拟地址空间: 位于磁盘的一块区域,容纳进程装入
  • (主存)实际地址空间: 承载进程执行

虚拟存储器是一种地址空间扩展技术,通常意义上对用户编程是透明的,除非用户需要进行高性能的程序设计。

计算机操作系统详细学习笔记(三):存储管理

3.4 存储管理的硬件支撑

计算机操作系统详细学习笔记(三):存储管理

3.4.1 存储器组织层次

计算机操作系统详细学习笔记(三):存储管理

高速缓存存储器(Cache)的组成

  • 高速存储器: 由 SRAM 组成的存储器
  • 联想存储器: 根据内容进行寻址(与根据地址寻址进行区别)
  • 地址转换部件
    • 通过联想存储器建立目录表,来实现快速地址转换。命中时直接访问 Cache,未命中则从主存中读取并放入 Cache。
  • 替换部件
    • 在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。

高速缓存存储器(Cache)的组织

计算机操作系统详细学习笔记(三):存储管理

  • L1 Cache
    • 分为数据缓存和指令缓存,内置
    • 成本最高,对CPU性能影响最大,32KB~256KB之间
  • L2 Cache
    • 外置和内置两种,512KB~8MB之间
  • L3 Cache
    • 外置,在游戏和服务器领域有效
    • 对很多应用来说,总线改善比设置 L3 更加有利于提升系统性能

3.4.2 不同存储对象的存储层次

Cache

关键性能数据被调入 Cache。

虚拟存储器

硬盘、固态硬盘、网络硬盘。

3.4.3 存储管理的硬件支撑

需要硬件支撑才有效果的功能

  1. 动态地址转换
  2. 存储保护(避免访问非法内存)
  3. 虚拟地址越界判断
  4. 页面替换

计算机操作系统详细学习笔记(三):存储管理

3.5 单连续分区存储管理

计算机操作系统详细学习笔记(三):存储管理

3.5.1 单连续分区概念

单连续分区: 每个进程占用一个物理上完全连续的存储空间

常见三种策略:

  1. 单用户连续存储管理
  2. 固定分区存储管理
  3. 可变分区存储管理

3.5.2 单用户连续存储管理

特点

  1. 主存区域划分为系统区与用户区,设置一个栅栏寄存器划分两个区域,硬件用它在执行时进行存储保护。
  2. 一般用静态重定位进行地址转换。
  3. 适用于单用户单任务操作系统,如 DOS。

静态重定位方法

在装入一个作业时,把该作业中程序的指令地址和数据地址全部转换成绝对地址。

计算机操作系统详细学习笔记(三):存储管理

3.5.3 固定分区存储管理

特点

  1. 支持多个分区
  2. 分区数量固定
  3. 分区大小固定
  4. 可用静态/动态重定位
  5. 早期 OS 采用

计算机操作系统详细学习笔记(三):存储管理

主存分配方式

维护一个主存分配表,实行分配与去配功能。

计算机操作系统详细学习笔记(三):存储管理

地址转换方式

用硬件实现动态重定位。

计算机操作系统详细学习笔记(三):存储管理

缺点

固定分区存储管理不够灵活,既不适应大尺寸程序,又存在内存内零头,有浪费。

3.5.4 可变分区存储管理

  • 按进程的内存需求来动态划分分区
  • 创建一个进程时,根据进程所需主存量查看主存中是否有足够的空闲空间
    • 若有,则按需要量分割一个分区
    • 若无,则令该进程等待主存资源
  • 由于分区大小按照进程实际需要量来确定,因此分区个数是随机变化的

计算机操作系统详细学习笔记(三):存储管理

可变分区的主存分配表用链表实现。

计算机操作系统详细学习笔记(三):存储管理

3.5.4.1 可变分区内存分配算法

最先适应分配算法

空闲区表根据实址先后连成链表,每次选取最前面的分区进行分配。

邻近适应分配算法

空闲区表组织成循环链表,从上一次分配的地址开始查找符合要求的分区。

最优适应分配算法

按照分区大小组织成链表,每次找最小的分区进行分配。

最坏适应分配算法

按照分区大小组织成链表,每次找最大的分区进行分配。

3.5.4.2 地址转换与存储保护

用硬件来实现动态重定位。

计算机操作系统详细学习笔记(三):存储管理

3.5.4.3 程序浮动技术

可变分区方式的内存外零头

  • 固定分区方式会产生内存内零头
  • 可变分区方式也会随着进程的内存分配产生一些小的不可用的内存分区,称为内存外零头
  • 最优适配算法最容易产生外零头
  • 可变分区方式下,任何适配算法都不能避免产生外零头

移动技术(程序浮动技术)

  • 移动分区以解决内存外零头
  • 由于移动分区会导致物理地址变化,因此需要动态重定位支撑

计算机操作系统详细学习笔记(三):存储管理

移动技术的工作流程

计算机操作系统详细学习笔记(三):存储管理

3.6 页式存储器

计算机操作系统详细学习笔记(三):存储管理

3.6.1 基本原理

  • 分页存储器将主存划分成多个大小相等的页架
  • 受页架尺寸限制,程序的逻辑地址也自然分成页
  • 不同的页可以放在不同页架中,不需要连续
  • 页表用于维系进程的主存完整性

计算机操作系统详细学习笔记(三):存储管理

3.6.2 地址转换

逻辑地址

逻辑地址由页号与单元号组成。

计算机操作系统详细学习笔记(三):存储管理

物理地址

物理地址由页框号与单元号组成。

计算机操作系统详细学习笔记(三):存储管理

地址转换

上述的地址转换可以直接通过查页表完成。

计算机操作系统详细学习笔记(三):存储管理

3.6.3 内存分配

由于内存分成的页大小、数量均固定,因此我们可以用一张位示图来记录主存分配情况。同时用一张页表来维护主存逻辑完整性。

计算机操作系统详细学习笔记(三):存储管理

3.6.4 页共享

页式存储能够实现多个进程共享程序和数据。

数据共享

不同进程,尽管页号不同,也可以共享数据页。

程序共享

由于代码页中可能存在 (JMP <页内地址>) 这样的指令,因此不同进程,必须在同一页号内,才能共享代码页。

3.6.5 快表

引入快表的原因

页表放在主存,导致每次地址转换必须访问两次主存

  1. 按页号读出页表中的相应页框号
  2. 按计算出来的绝对地址进行读写

解决方法

为了提高地址转换速度,设置一个专用的高速存储器(Cache),用来存放页表的一部分。

  • 快表,存放在高速存储器中的页表部分
  • 快表表项,(页号,页框号)
  • 存放快表的高速存储器是联想存储器,即按照内容寻址,而非按照地址访问

基于快表的地址转换流程

  1. 按逻辑地址中的页号查快表
  2. 若该页已在快表中,则由页框号和单元号形成绝对地址
  3. 若该页不在快表中,则再查主存页表形成绝对地址,同时将该页登记到快表中
  4. 当快表填满后,又要登记新页时,则需在快表中按一定策略淘汰一个旧登记项目

进程表

  • 每个进程都有一个页表,而进程表登记了每个进程的页表。

  • 进程占有处理器运行时,其页表起始地址和长度送入页表控制寄存器。

计算机操作系统详细学习笔记(三):存储管理

地址转换具体过程

计算机操作系统详细学习笔记(三):存储管理

3.6.6 虚拟存储管理

基本思想

  • 把进程全部页面装入虚拟存储器,执行时先把部分页面装入实际内存,然后根据执行行为,动态调入不在主存的页,同时进行必要的页面调出。
  • 现代 OS 的主流存储管理技术。
  • 首先只把进程第一页信息装入主存,称为请求页式存储管理

改进页表

由于虚拟存储管理的引入,我们需要扩充原页表表项。

  • 每页的虚拟地址、实际地址
  • 主存驻留标志(是否在主存内)
  • 写回标志(是否被修改过,被修改过则要写回辅存中)
  • 保护标志(用于存储保护)
  • 引用标志(页面淘汰使用)
  • 可移动标志(正在与外设进行交换的页面是不能被移动的)

计算机操作系统详细学习笔记(三):存储管理

地址转换实现

CPU 处理地址:

  • 若页驻留,则获得块号形成绝对地址
  • 若页不在主存,则 CPU 发出缺页中断

计算机操作系统详细学习笔记(三):存储管理

OS 处理缺页中断:

  • 若有空闲页框,则根据辅存地址调入页,更新页表与快表等
  • 若无空闲页框,则决定淘汰页,调出已修改页,调入页,更新页表与快表

由于这条指令没有执行完就中断了,因此中断处理结束后需要回退执行该指令。

计算机操作系统详细学习笔记(三):存储管理

3.6.7 辅存与主存的页面调度

3.6.7.1 页面调度概念
  • 当主存空间已满但又需要装入新页时,页式虚拟存储管理必须按照一定的算法把已在主存的一些页调出去
  • 选择淘汰页的工作称为页面调度
  • 选择淘汰页的算法称为页面调度算法
  • 抖动/颠簸: 页面调度算法设计不当,使得刚被淘汰的页面立即又要调入。
3.6.7.2 缺页中断率

定义

假定进程 P 共 nn 页,系统分配页框数为 mm 个。P 运行中成功访问次数为 S,不成功访问次数为 F,总访问次数为 A = S + F,则缺页中断率为
f=FA f=\displaystyle\frac{F}{A}

缺页中断率是衡量存储管理性能和用户编程水平的重要依据。

影响缺页中断率的因素

  1. 分配给进程的页框数
  2. 页面大小: 页面尺寸越大,则缺页中断率就越低
  3. 用户程序编制方法(矩阵按行访问还是按列访问)
3.6.7.3 OPT 页面调度算法

算法描述

当要调入新页面时,首先淘汰以后不再访问的页,然后选择距现在最长时间后再访问的页。

算法特点

该算法为理想的调度算法,由 Belady 提出,称为最佳算法,不具有实现性。

3.6.7.4 FIFO 页面调度算法

算法描述

考虑程序执行的顺序性,总是淘汰最先调入主存的那一页,或在主存驻留时间最长的那一页。

3.6.7.5 LRU 页面调度算法

算法描述

FIFO 仅考虑了顺序性,没有考虑循环性,因此我们改进这个算法。

淘汰最近一段时间较久未被访问的那一页,因为那些刚被使用过的页面可能马上还要被使用到。

计算机操作系统详细学习笔记(三):存储管理

算法实现

该算法的严格实现需要用到优先队列或 setset,时间开销非常大,因此考虑下述的近似实现方法。

  1. 每页建一个引用标志,供硬件使用
  2. 设置一个时钟中断,中断时页引用标志置 0
  3. 地址转换时,页引用标志置 1
  4. 淘汰页面时,从页引用标志为 0 的页中随机选择一个淘汰

该模拟算法不仅很难确定时间间隔,而且性能非常差。

3.6.7.6 LFU 页面调度算法

由于 LRU 算法精准实现开销太大,因此我们再换一种近似方式。

算法描述

淘汰最近一段时间内访问次数较少的页面,对 OPT 的模拟性比 LRU 更好。

算法实现

  1. 基于时间间隔中断,并给每一页设置一个计数器
  2. 时间间隔中断发生后,所有计数器清 0
  3. 每访问页一次就给计数器加 1
  4. 选择计数值最小的页面淘汰
3.6.7.7 时钟 CLOCK 页面调度算法

算法描述

  • 采用循环队列机制构造页面队列,形成了一个类似于钟表面的环形表。
  • 队列指针则相当于钟表面上的表针,指向可能要淘汰的页面。
  • 使用页引用标志位。

算法实现

  1. 页面调入主存时,其引用标志位置 1
  2. 访问主存页面时,其引用标志位置 1
  3. 淘汰页面时,从指针当前指向的页面开始扫描循环队列
    • 把所遇到的引用标志位是 1 的页面的引用标志位清 0,并跳过
    • 把所遇到的引用标志位是 0 的页面淘汰,调入请求页,并将指针移动一步

注意: 只有缺页查找替换页时指针才会移动,页面命中时指针不会移动。

计算机操作系统详细学习笔记(三):存储管理

3.6.8 反置页表

3.6.8.1 提出原因

页表以及相关硬件机制在地址转换、存储保护、虚拟地址访问中发挥了关键作用,因此为页式存储管理设置了专门硬件机构 —— MMU(内存管理单元)

MMU

CPU 管理虚拟/物理存储器的控制线路,把虚拟地址映射为地理地址,并提供存储保护,必要时确定淘汰页面。

IPT (Inverted Page Table)

反置页表 IPT 是 MMU 使用的数据结构。

3.6.8.2 反置页表设计

功能

  1. 针对内存中的每个页框建立一个页表,按照块号排序
  2. IPT 用来完成内存页框到访问进程页号的对应,即物理地址到逻辑地址的转换,因此为反置页表

反置页表项

  1. 页号: 虚拟地址页号
  2. 进程标识: 使用该页的进程号
  3. 标志位: 有效位、引用位、修改位、保护位
  4. 链指针: 哈希链
3.6.8.3 IPT 地址转换

转换过程

  1. MMU 通过哈希函数把进程标识和虚页号转换成一个哈希值,并通过哈希表找到对应的 IPT 表项
  2. IPT 表项的索引就是页框号,通过拼接位移即可生成物理地址
  3. 若遍历整个哈希表都未能找到匹配页表项,说明该页不在内存,产生缺页中断,请求 OS 调入

计算机操作系统详细学习笔记(三):存储管理

3.7 段式存储器

计算机操作系统详细学习笔记(三):存储管理

3.7.1 段式程序设计

每个程序可由若干段组成,每一段都可以从 “0” 开始编址,段内的地址是连续的。

分段存储器的逻辑地址由两部分组成。同时要与分页的逻辑地址进行区分。

  • 段号:单元号 —— 用户程序设计自己设定的,用户可控制
  • 页号:单元号 —— 系统自动切割,用户不知情。

3.7.2 段式存储管理

  • 段式存储管理基于可变分区存储管理实现,一个进程要占用多个分区
  • 硬件需要增加一组用户可见的段地址寄存器(代码段、数据段、堆栈段、附加段),供地址转换使用
  • 存储管理需要给每一个进程设置一个段表,每个段占用一个段表项,其中包括: 段始址、段限长,以及存储保护、可移动、可扩充等标志位

地址转换

计算机操作系统详细学习笔记(三):存储管理

段的共享

  • 通过不同进程段表中的项指向同一个段基址来实现
  • 对共享段的信息必须进行保护,如规定 “只能读出不能写入,不满足保护条件则产生保护中断”

3.7.3 虚拟存储管理

基本方法

  • 把进程的所有分段都存放在辅存中,进程运行时先把当前需要的一段或几段装入主存,在执行过程中访问到不在主存的段时再把它们动态装入
  • 段式虚拟存储管理中的段调进调出是由 OS 自动实现的,对用户透明
  • 与段覆盖技术不同,它是用户控制的主存扩充技术,OS不感知

段表扩充

  • 特征位: 00(不在内存)、01(在内存)、11(共享段)
  • 存取权限: 00(可执行)、01(可读)、11(可写)
  • 扩充位: 0(固定长)、1(可扩充)
  • 标志位: 00(未修改)、01(已修改)、11(不可移动)

计算机操作系统详细学习笔记(三):存储管理

地址转换

计算机操作系统详细学习笔记(三):存储管理

3.8 段页式存储器

计算机操作系统详细学习笔记(三):存储管理

3.8.1 段页式管理方法

段页式存储管理

  • 段式程序设计可以基于页式存储管理实现,从而实现段页式存储管理
  • 每一段不必占据连续的存储空间,可存放在不连续的主存页框中
  • 显然,程序执行时可以仅装入部分段或段中部分页面,实现虚拟存储管理

段表与页表

段表中从之前的起址与长度,改为起址与页表长。

计算机操作系统详细学习笔记(三):存储管理

段页式存储管理的地址转换

逻辑地址根据段号找到段表,然后判断单元号有无超过页表长度,之后再在页表中找到对应的块号。

计算机操作系统详细学习笔记(三):存储管理

3.8.2 段页式虚拟存储管理

形成绝对地址之后还需要更新快表。

计算机操作系统详细学习笔记(三):存储管理