【操作系统⑫】——存储管理(下)【分段存储管理 虚拟存储管理 段页式存储管理方案 页面置换算法 OPT FIFO LRU】


🌻 重点篇++



此段非彼段… 🔖

上一篇文章地址链接: 【操作系统⑪】——存储管理(上)【分区存储管理 分页存储管理+详细样例】.
下一篇文章地址链接: 【操作系统学习笔记⑬】——设备管理(上) [直接查询、中断方式、DMA方式、缓冲技术、驱动调度技术与算法].

期末考试总复习——地址链接《操作系统期末总复习——绝地求生版》.


一、概述

  ● 从分页管理存储管理 →(发展到)→ 页式存储管理方式 的主要原因是:为了提高内存空间利用率。

  ● 段式存储管理主要是为了满足以下用户要求而引入的另一种离散分配的存储管理方式:
    ① 方便用户编程。(用户希望能按照程序模块来划分段,并按段分配内存。)
    ② 分段共享。(能实现以信息逻辑单位为基础的分段共享方式)
    ③ 分段保护。(能实现在多道程序环境下,内存中以信息的逻辑单位为基础的保护)
    ④ 动态链接。(即在作业运行之前,并不是把几个目标程序链接起来,而是要用哪些时才链接哪些)
    ⑤ 动态增长。(即能处理数据段会不断增长的情况)

  ● 综述:段是用户编制的程序可以由一个主程序、若干个子程序、符号表、栈以及数据等若干段组成,每一段都有独立、完整的逻辑意义,每一个段的长度可以不同。



二、段式基本原理

  ● 段式存储管理将进程对应程序和数据按照其本身特性分成若干个段,每个段都定义了一组有意义的逻辑信息单位。如:主程序段main、子程序段X、数据段D、堆栈段S 等等。

  ● 每个段都是从 0 开始编址的,段的长度由相应的逻辑信息单位的长度决定。

  ● 地址结构:段号 + 段内地址。 段表:记录每段实际存放的物理地址。
在这里插入图片描述
  ◆ 说明:和页号、页内地址有相似之处。

  ● 每个段都有模块名,且具有完整的逻辑意义。

  ● 段与段之间的地址不一定连续,而段内地址是连续的。

  ● 如下图所示,用户程序中可用符号形式(指出段名和入口)来调用某段的功能。

在这里插入图片描述
  ◆ 说明
    ① 进程的地址空间,由于被分成多个段。所以在标识进程的地址时,要同时给出段名和段内地址。
    ② 段式管理以段为单位来分配内存,并通过地址映射机构来把段式地址转换为内存物理地址。
    ③ 如上图所示,首先会调用 “主程序段”(即将其调入内存),当执行到 “call [S] | < A >;” 时,才会将子程序段 S 调入。



三、段式地址转换

3.1 段表

  ● 段表和页表类似,是建立了逻辑段和内存中的物理段之间的对应关系。它一般是存放在内存当中的。

在这里插入图片描述
  ◆ 说明
    ① 段表的每一个表项包括:段号、段长、基地址。
    ② 分段存储管理系统为每个段分配一个连续的分区,进程的各个段可离散地装入内存的不同位置。
    ③ 用一张段映射表(段表)记录每段在内存的起始地址(基址)和段的长度。
    ④ 在配置了段表后,执行中的进程可通过逻辑地址中的段号来查询段表,找到段的对应内存区。
    ⑤ 根据段表段的分配方式以段为单位进行主存分配,每段在主存中占有一个连续空间。
    ⑥ 如果在装入某段信息时,找不到满足该段地址空间大小的空闲区,则采用移动技术合并分散的空闲区,这有利于大作业的装入。
    ⑦ 段表和页表一样存在主存中,访问数据或指令至少需要访问两次,为了提高对段表的存取速度,增设了一个相联寄存器(CPU内部),利用高速缓冲寄存器保存最近常用的段表项。


3.2 分段中地址转换的过程

在这里插入图片描述
  ● 执行步骤
    ① 系统首先会在请求表上找到该进程,并将该进程的页表始址和页表长度一起装载入页表控制寄存器中。
    ② 系统此时也会从逻辑地址空间获得一个逻辑地址(临时获取的)。
    ③ 然后系统将首先逻辑地址中的段号拿出来,并和段表寄存器里面的段表长度进行比对。
    ④ 如果段号比段表长度大,那就不行,产生“地址越界”。(即本次所访问的地址已超越进程的地址空间)
    ⑤ 如果该段号合理,还要则系统接下来会在段表中根据该段号找到相应的段长度,并拿其与逻辑地址中的页内地址进行比较。
    ⑥ 如果逻辑地址中段内地址 > 该段长度,那就不行,产生 “地址越界”。【图中未画】
    ⑦ 如果前两次判断都符合要求,则系统接下来会在段表中根据该段号找到相应的段始址。
    ⑧ 然后将 段始址 和 逻辑地址里面的段内地址 一起拼装成最终的物理地址,最后去访问内存的这个物理地址。


3.3 地址转换举例

  ● 题目描述:例设某程序中有 5 个段,段号分别为 0 ~ 4 ,段表如下,求:
    (1)段 2 字节 53 的物理地址?
    (2)段 3 字节 852 的物理地址?
    (3)段 0 字节 1222 的物理地址?

段号段长度段始址
010001400
14006300
24004300
311003200
410004700
解:
	(1)段 2【2 < 4,未越界】对应的表项的段长度 1000 > 53,未越界,且段始址为 4300,则物理地址:4300+53=4353
	(2)段 3【3 < 4,未越界】对应的表项的段长度 1100 > 852,未越界,且段始址为 3200,则物理地址:3200+852=4052
	(3)段 0【0 < 4,未越界】对应的表项的段长度 1000 < 1222,产生越界中断。


四、分页和分段存储的比较

4.1 分页与分段的主要区别:

  ① 段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的。而页是信息的物理单位,是为了管理主存的方便而划分的,对用户是不可见的(透明的)。
  ② 页的大小固定不变,由系统决定。而段的大小是不固定的,它由其完成的功能决定。
  ③ 段式向用户提供的是二维地址空间,而页式向用户提供的是一维地址空间,其页号和页内偏移是机器硬件的功能。
  ④ 由于段是信息的逻辑单位,因此便于存贮保护和信息的共享,而页的保护和共享受到限制。


4.2 分页存储的优点和缺点

  ● 分页存储是由 “固定分区存储管理方案” 演化而来的。

  ● 优点:解决了碎片问题、便于管理。

  ● 缺点:不易实现共享、不便于动态连接。


4.3 分段存储的优点和缺点

  ● 分段存储是由 “可变分区存储管理方案” 演化而来的。

  ● 优点:便于动态申请内存、段表长度较短、便于共享、便于动态链接

  ● 缺点:产生碎片、不易扩展



五、段页式存储管理方案

  ● 分页和分段管理方式各有其优缺点,分页系统能有效提高内存的利用率,而分段则能更好地满足用户的需要,因此可以将两者结合成一种新的存储管理方式系统称为 “段页式系统”

5.1 段页式的基本原理

  ● 基本思想:用分段方法来分配和管理地址空间,用分页方法来分配和管理存储空间。具体原理如下:
    ① 虚地址以程序的逻辑结构划分成段,这是其段式特征。
    ② 实地址划分成位置固定、大小相等的页框(块),这是其页式特征。
    ③ 将每一段的线性地址空间划分成页框大小相等的页面,于是形成了段页式存储管理的特征。
    ④ 为了实现从逻辑地址到物理地址的转换,段页式系统中需要同时配置段表和页表。
    ⑤ 由于将一个段中的页进行了分离分配,故段表中的内容不再是段始址和段长度,而是页表始址和页表长度。如下图所示:
在这里插入图片描述
  ◆ 说明:由段号、段内页号和页内地址三项共同构成逻辑地址。


5.2 段页式的段表和页表

在这里插入图片描述

  ◆ 说明
    ① 段页式存储管理为每一个装入内存的作业建立一张段表,且对每一段建立一张页表。
    ② 段表的长度由作业分段的个数决定,段表中的每一个项目指出本段页表的始址和长度。
    ③ 页表的长度则由对应段所划分的页面数所决定,页表中的每一个表目指出本段的逻辑页号与内存物理块号之间的对应关系。


5.3 段页式地址转换

在这里插入图片描述
  ◆ 执行步骤:【当进程被进程调度程序选中而成为进程的执行状态时】
    ① 首先系统会在请求表上找到该进程,并将该进程的段表始址和段表长度一起装载入段表控制寄存器中。
    ② 系统此时也会从逻辑地址空间获得一个逻辑地址(临时获取的)。
    ③ 然后系统将首先逻辑地址中的段号拿出来,并和段表控制寄存器里面的段表长度进行比对。
    ④ 如果段号比段表长度大,那就不行,产生“地址越界”。(即本次所访问的地址已超越进程的地址空间)
    ⑤ 如果该段号合理,则系统接下来会在段表中根据该段号找到对应的页表长度【图中未画】,并拿其与逻辑地址中的页号进行比较。
    ⑥ 如果页号比页表长度大,那就不行,产生“地址越界”。
    ⑦ 如果前两次判断都符合要求,则系统接下来会在对应的页表中根据该页号找到相应的页框号。
    ⑧ 然后将 页框号 和 逻辑地址里面的页内地址 一起拼装成最终的物理地址,最后去访问内存的这个物理地址即可。


5.4 段页式地址转换的举例

  ● 题目描述:在一个采用段页式存储管理的系统中,页的大小为 1KB 。某个正在执行的作业情况如下:
    (1)请给出将逻辑地址(2,3500)转换成物理地址的过程。
    (2)计算出上述逻辑地址对应的物理地址的值。

在这里插入图片描述

解:
	① 逻辑地址中的段号 2 跟段表控制寄存器中的段表长度 3 进行比较,由于 2 < 3 ,故段号没有越界。
	② 根据段表控制寄存器中的段表起始地址加上段号 2 ,找到段表中对应于第 2 行的段表项,从而得到第 2 段的页表长度 5 和页表起始地址。
	③ 根据段内偏移 3500 得到段内页号为 3500 / 1024 = 3。页内偏移为 3500 % 1024 = 428 。
	④ 把段内页号 3 和段表项中的页表长度 5 进行比较,3 < 5,故得知页号没越界;
	⑤ 由页表起始地址和页号得到对应的页表项,从而在 “页表 2 ” 得到第 2 段的第 3 页对应的物理块号是 30 ;
	⑥ 物理块号 30 和块内偏移 428 拼接成物理地址 30 * 1024 + 428 = 31148 。

  ● 综上所述,地址转换过程中需要三次访问内存
    第一次:访问段表,获得页表始址
    第二次:访问页表,获取块号,获得指令或数据的物理地址
    第三次:按物理地址存取信息

  ● 补充说明
    ① 分段需要大家注意的是,分段有助于实现将段与对其对应的保护机制相关联。
    ② 现代OS中,指令不可自我修改,故指令段只能定义为只读或只执行。
    ③ 内存映射硬件也会检查段表项中的保护位,以防止对内存的非法访问。
    ④ 数据则放在特定数组中,当需要访问数据时会对数组下标进行检测,超界时会产生越界中断。



六、信息共享(简单了解即可)

  ● 可重(复载)入代码(纯代码):允许多个进程同时访问的代码,且为保证每个进程所执行的代码完全相同,决不允许执行过程中修改代码。

  ● 信息共享时,需要在每个进程的段表中对多进程共享的可重入代码设置一个段表项。当需要使用这部分代码时,应保证在执行时不会修改它,每个进程的私有数据和局部变量必须使用独立的段保存且不提供共享。

  ● 分页系统信息共享:使用可重入代码时,各进程的部分逻辑页面将被映射到可重入代码使用的各帧中,但其私有数据和局部变量所使用的帧则各不相同,且所有这些页面和帧的对照关系需要存入页表(长度可能会极大)。

  ● 分段系统信息共享:使用可重入代码时,只需在段表中为其设置一个段表项,并将执行时用到的部分数据复制到到局部数据区,用来支持对执行时不可避免的代码修改的支持即可。



七、虚拟存储管理

  ● 上一篇文章的页式存储管理,以及前面写的段式存储管理和段页式存储管理,这些存储管理策略都有一个共同的目标——为实现多道程序的并发执行,并要求进程在运行之前,将进程对应的全部程序都装入内存。但实际上许多程序在运行时,并非要用到全部程序。因此,这种一次性地全部装入是一种对内存资源的浪费。而现在提到的 “虚拟存储管理” 就能满足 “只将一部分程序装入内存,程序仍能正常运行” 的要求。

7.1 虚拟存储概述

  ● 由于物理内存的容量有限,当用户程序所要求的内存空间超出了内存总容量时,若采用的是 “实存管理策略”,则程序将得不到执行。

  ● 虚拟存储技术便提供了一种扩充存储容量的方法,借助虚拟存储技术,从逻辑上扩充内存容量,运行程序将不受内存大小的限制。

7.1.1 程序访问局部性原理

  ● 程序访问局部性原理是指 CPU 对指令和数据的存取在时间上、空间上和顺序上往往集中在一定的范围内。一般分为如下三点
    ① 时间局部性。
    ② 空间局部性。
    ③ 顺序局部性。(因为在通常情况下, CPU 跟踪程序的执行是连续执行的。)

  ● 由于程序遵循局部性规律,故可以只把当前作业所需要的那部分程序和数据装入内存就能启动运行。

7.1.2 虚拟存储器与其技术

  ●虚拟存储器:有操作系统提供的一个假想的存储器,它不是实际的内存,而是操作系统对物理内存的逻辑扩充。

  ● 虚拟存储技术:基于局部性原理的,将程序中当前正在使用的部分放在内存,而其余部分放在磁盘的技术。

  ● 部分装入:如果处理器访问了不在内存中的程序或数据,此时需要将磁盘上的相应程序或数据装入内存。

  ● 部分对换:如果内存没有足够的空间时,便需要将内存中暂时不需要的数据从内存移到辅存中。

  ● 实现虚拟存储器,需要以下硬件支持
    ① 一个容量足够大的辅存,可以容纳下运行作业的全部地址空间。
    ② 一个一定容量的内存。
    ③ 实现虚、实地址映像的机构。

7.1.3 虚拟存储器的 4 个特征

  ① 离散型:指内存分配采用离散分配方式。

  ② 虚拟性:虚存是从逻辑上扩充内存容量,使用户编程所用到的地址空间远大于实际内存容量。

  ③ 多次性:指程序不是一次性转入内存,而是被分成若干部分,分多次调入内存。

  ④ 对换性:指系统允许进程的部分在运行过程中换入内存或换出到对换区。

7.1.4 虚拟存储器的 3 种实现方法

  ① 请求页式存储管理

  ② 请求段式存储管理

  ③ 请求段页式存储管理


7.2 请求页式存储管理(又称 分页式虚拟存储管理)

7.2.1 基本原理与基本问题

  ● 基本原理
    ① 进程运行前,不装入全部页面,而是装入一个或数个页面
    ② 根据进程运行的需要,动态装入其它页面
    ③ 内存空间已满,又需要装入新页面时,则淘汰内存部分页面,装入新的页面

  ● 实现一个页式的虚拟存储管理系统,需要解决以下三个问题
    ① 系统如何获知进程当前所需页面不在内存中?
    ② 发现缺页时,如何把所缺页面调入内存?
    ③ 需要淘汰页面时,根据什么策略选择淘汰页面?

  ● 第一个问题可以用扩充页表的方法解决。扩充页表的 “项目内容” 如下图所示:在这里插入图片描述

  ◆ 说明
    ① 页号和页框号——其作用与分页存储管理相同
    ② 中断位———指示页面是否在内存中。若不在内存,则产生缺页中断
    ③ 访问位———记录该页是否被访问或者访问次数
    ④ 修改位———指示页面在调入内存后是否被修改过
    ⑤ 辅存地址——指出该页在辅存上的地址

  ● 关于第二、第三个问题,这个将涉及到 “页面置换算法” 等内容,将在后面细讲。

7.2.2 地址转换流程

在这里插入图片描述
  ◆ 说明
    ① “快表” 即高速缓冲存储器 Cache。
    ② 请求页式管理中,每当所要访问的页面不在内存中时,便会产生缺页中断,即请求 OS 将所缺的页面调入内存。

7.2.3 页面调入策略和清除策略

  ● 页面调入策略决定何时把一个页面装入内存,有两种策略可供选择:请页式调入预调式调入

  ● 请页式调入:指仅当需要访问程序和数据时,通过产生缺页中断并由缺页中断处理程序分配页框再把所在页面装入内存。

  ● 预调式调入:其选进入内存的页并不是缺页中断的页,而是由 OS 根据某种算法,动态预测进程最可能要访问的那些页面。

  ● 清除策略与调入策略是相对的,它考虑到是——何时把一个修改过的页面写回外存,常用的两种方法是:请页式清除预约式清除

  ● 请页式清除:指仅当只有一页被选中置换,且在之前它已被修改过,才把这个页面写回外存。

  ● 预约式清除:指对只要更改过的页面,在需要之前就把它们都写回外存。

  ● 请页式清除和预约式清除或多或少都有点缺点,较好的方式是采用页缓冲技术:仅清除淘汰的页面,并使清除操作和置换操作不必成双进行。(这个只做简单了解即可)


7.2.4 页面分配策略

  ● 在请页式存储管理中,可采用两种策略分配页框给进程:固定分配可变分配。(其概念类似于前面讲过的 “固定分区” 和 “可变分区” )

  ● 在进行页面置换时,也可采用两种策略:局部置换全局置换

  ● 局部置换:指页面置换算法的作用范围局限于本进程。

  ● 全局置换:指页面置换算法的作用范围是整个系统。

  ● 固定分配往往和局部置换策略配合使用,每个进程运行期间分得的页框数不会改变,如果发生缺页中断,只能从进程在内存的页面中选出一页来置换,以保证进程的页框总数不变。

  ● 可变分配往往和全局置换策略配合使用,这是采用得较多的一种分配和置换算法。即先为系统中的每个进程分配一定数量的页框,操作系统自己保留若干空闲页框,当一个进程发生缺页中断时,系统将会从空闲页框中选出一个给进程,即把缺页调入这个空闲页框。

7.3 页面置换算法 ⭐️⭐️⭐️

  ● 页面置换算法:指在需要调入页面且内存已满时,确定将要换出页面的算法。(置换算法的好换将会直接影响系统的性能)

7.3.1 性能指标

  ● 假设进程 P 在运行中成功的内存访问次数为 s ,不成功的访问次数为 F,则缺页中断率为: R = F S + F R=\dfrac{F}{S+F} R=S+FF
  ● 影响缺页中断率 R 的因素如下:【越小越好】
    ① 内存页框数。(进程分得的内存块数越多,则缺页中断率就越低)
    ② 页面大小。(划分的页面越大,则缺页中断率就越低)
    ③ 页面置换算法。(置换算法的不同也会影响缺页中断率)
    ④ 程序特性。(程序的编制方法不同,对缺页中断的次数也有很大影响,这涉及到程序的局部性原理)

7.3.2 最佳置换算法(OPT)

  ● 最佳置换算法:置换页是以后不再访问或最长时间内不被访问的页面。

  ● 这是一种理想化的算法,有点 “先知” 算法的味道,故在实际上是难以实现的。但它可作为衡量各种实用的页面置换算法的标准。

  ● 样例:假设采用固定分配策略,为进程分配 3 个存储页框,进程运行时形成的访问地址走向为 2,3,2,1,5,2,4,5,3,2,5 和 2。则 OPT 算法运行结果如下。
在这里插入图片描述
  ◆ 说明
    ① 第一个红箭头:因为后面需访问地址里面没有 “1”,所以用 “5” 置换 “1”。
    ② 第二个红箭头:因为后面需访问的地址里面,“2” 是最长时间内不被访问的,所以置换它。
    ③ 当进程运行完毕时,系统进行了 3 次置换,缺页中断次数为 6 次,即蓝色箭头加上红色箭头的个数。缺页率为 6/12 = 50% 。


7.3.3 先进先出置换算法(FIFO)

  ● 先进先出置换算法:选择最先进入内存的页面进行置换,选择在内存中驻留时间最长的页面进行淘汰。

  ● 依旧沿用 7.3.2 的样例来图形化说明
在这里插入图片描述
  ◆ 说明
    ① 第一个红箭头:因为 “2” 最先进来,所以用 “5” 置换 “2”。
    ② 当进程运行完毕时,系统进行了 6 次置换,缺页中断次数为 9 次,即蓝色箭头加上红色箭头的个数。缺页率为 9 /12 = 75% 。


7.3.4 最近最久未使用置换算法(LRU)

  ● 最近最久未使用置换算法:即选择最近一段时间内最长时间没有被访问过的页面进行置换。

  ● 依旧沿用 7.3.2 的样例来图形化说明

在这里插入图片描述
  ◆ 说明
    ① 第一个红箭头:因为 “2” 最近被访问过,“1”刚刚才被调入,只有 “3” 最近最久未被访问,所以置换它。
    ② 当进程运行完毕时,系统进行了 4 次置换,缺页中断次数为 7 次,即蓝色箭头加上红色箭头的个数。缺页率为 7 /12 = 58% 。


7.3.5 时钟置换算法Clock (又称为 最近未使用算法 NRU)

  ● 它是 LRU 和 FIFO 的折中算法。算法机理如下
    ① 它首先将会把内存中的所有页面都通过指针连接成循环队列,然后在每一页上设置一个访问位。(扩充页表中的那个访问位)
    ② 若某位被访问时,则其访问位被置 1 。
    ③ 置换时首先检查访问位,如果是 0 ,则选择该页换出;
    ④ 若为 1 ,则重新将其置为 0 ,暂时不将其换出而给改页第二次驻留内存的机会。
    ⑤ 再按照 FIFO 算法检查下一个页面。
    ⑥ 当检查到队列的最后一个页面时,若其访问位仍为 1 ,则返回队首再去检查第一个页面。


7.3.6 最少使用置换算法 (LFU)

  ● 最少使用置换算法:即把当前为止被访问次数最少的页面进行淘汰。类似于 LRU 算法。


7.4 分段式虚拟存储管理 和 段页式虚拟存储管理

  ● 不管是分段,还是段页式,如果是虚拟存储管理,其基于的原理都是程序局部性原理。和页式虚拟存储管理是类似的。

  ● 分段式虚拟存储系统也是把所有分段的副本都存放在外存中。

  ● 只有进程被调度投入运行时,才把当前需要的一段或几段装入主存。

  ● 在执行过程中访问到不在主存的段时再动态装入(也会采用相应的置换算法)。



八、参考附录:

[1]《操作系统A》
上课用的慕课
链接: https://www.icourse163.org/course/NJUPT-1003219004?from=searchPage.

[2]《操作系统教程》
上课用的教材

[3]《逻辑地址、物理地址、页、页框(帧)、页框号》
链接: https://blog.csdn.net/weixin_44124632/article/details/109640412.

[4]《操作系统导论》学习笔记(六):逻辑地址空间管理
链接: https://blog.csdn.net/K_Xin/article/details/106463750.

[5] 分页式存储管理及地址转换(网易笔试题)
链接: https://www.cnblogs.com/jycboy/p/5312840.html.

上一篇文章地址链接: 【操作系统⑪】——存储管理(上)【分区存储管理 分页存储管理+详细样例】.

下一篇文章地址链接: 【操作系统学习笔记⑬】——设备管理(上) [直接查询、中断方式、DMA方式、缓冲技术、驱动调度技术与算法].

期末考试总复习——地址链接《操作系统期末总复习——绝地求生版》.


⭐️ ⭐️

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值