操作系统学习笔记第3章 (竟成)

第 3 章 内存管理

【考纲内容】

1.内存管理基础:

        1.内存管理的基本概念:逻辑地址空间与物理地址空间;地址变换;内存共享;内存保护;内存分配与回收;

        2.连续分配管理方式;

        3.页式管理;

        4.段式管理;

        5.段页式管理

2.虚拟内存管理:

        1.虚拟内存基本概念;

        2.请求页式管理;

        3.页框分配与回收;

        4.页置换算法;

        5.内存映射文件 (Memory - Mapped Flics);

        6.虚拟存储器性能的影响因素及改进方法

【考情统计】

年份

单选题

综合题

总分值

考点

2009

2

1

12

内存保护、地址变换、EAT、LRU、驻留集、分页

2010

2

1

12

动态分区、二级页表、分页、地址变换、置换算法

2011

3

0

18

缺页中断、抖动、地址变换、TLB

2012

1

1

10

虚存概念、驻留集、置换算法、局部性原理

2013

1

1

10

缺页中断、分页、地址变换、二级页表

2014

3

0

6

地址变换、TLB、置换算法、多级页表

2015

2

1

10

LRU、页框分配、分页、二级页表、地址变换

2016

3

1

20

置换算法、分段、地址变换、工作集、分页、TLB、缺页中断

2017

1

1

9

内存回收、分页、二级页表、地址变换

2018

0

1

8

分页、地址变换、置换算法

2019

4

0

8

段共享、LRU、二级页表、地址变换、动态分区、外部碎片

2020

1

1

10

EAT、二级页表、地址变换、局部性原理

2021

2

1

12

置换算法、二级页表、分页、地址变换、TLB、LRU

2022

2

0

4

缺页中断、置换算法

2023

2

0

4

虚拟内存管理、页框分配

2024

1

1

9

空闲分区分配与回收、内存管理综合题

【考点解读】

        基本概念和连续存储多以选择题形式考查,非连续分配的段式和段页式往年也多以选择题形式考查。非连续分配中的分页式往年会结合虚拟存储和计算机组成原理进行考查,也有单独考查的情况,但一般会深入到多级页表层次的内容。

        虚拟存储中虚存概念往年多以选择题形式考查。页框分配、置换算法和性能分析都是属于有时单独以选择题形式考查,也有时会结合请求分页进行综合性大题考查的内容。请求分页在往年考查中,多以大题形式出现,往往会与计算机组成原理结合考查。

【复习建议】

对于本章内容提出以下建议:

        1.基本概念一节概念性知识较多,考生要宏观把握内存管理的目的和功能,重点把握逻辑地址和物理地址、程序的装入和链接、内存保护三部分内容。

        2.连续存储一节,考生应宏观把握各种分区方法的优缺点及适用场景,重点掌握固定分区和动态分区。重点理解固定分区的分区方法和所需数据结构。重点掌握动态分区的分配与回收流程,做到能够自己详细地口述这一过程并对设定情景进行模拟。

        3.对于非连续方式,考生应宏观把握各种分区方法的优缺点及适用场景。考生需要重点掌握不含 TLB 和含 TLB 的地址变换流程,并熟练掌握一级及多级页表的地址变换计算。分段和段页式重点在理解概念。

        4.虚拟存储器概念一节,考生应着重理解虚拟内存概念和局部性原理,并清楚虚拟内存的容量是如何决定的。

        5.请求分页一节是本章考查重点,多以大题形式考查,该类大题一般可分为两种。其一是结合多级页表进行考查,其二是结合虚拟内存和组成原理中 cache 部分内容综合考查。考生需了解请求分页方式下页表各个字段的含义和用处,重点掌握地址变换及缺页中断流程,并能够对特定情境按照流程手动模拟。

        6.页框分配一节极少单独考查,一般放入题干中作为条件,考生需要理解三种分配策略和两类调入策略的相关概念。

        7.页面置换算法一节,考生应宏观把握各个算法的优缺点及适用场景,并能够手动模拟算法流程。着重理解 LRU 和 CLOCK 系列算法,并理解 FIFO 算法所存在的 Belady 异常现象。

        8.内存映射方法是考纲中较新的内容,考生应了解该方式的相关概念。

        9.虚拟存储器性能分析一节也是本章的重点内容,考生应当能够熟练进行内存访问有效时间的计算,并对计算过程进行分析。重点了解抖动与工作集的概念,理解工作集的评估是如何利用局部性原理的。

以下问题需要读者在学习的过程中着重思考:

        1.为什么要进行内存管理?内存管理有哪些功能?

        2.各非连续存储管理方式中,逻辑地址变换为物理地址的流程是如何的?

        3.为什么要引入虚拟存储器?虚拟存储器为什么有效?

        4.影响虚拟存储器性能的因素主要有哪些?

3.1 基本内存管理

3.1.1 基本概念

1.内存管理
        内存是计算机中一种有限的重要资源。虽然随着计算机硬件技术的发展,计算机的内存容量有了巨大的提高,但想要放入全部的程序和数据依旧是不可能的,正如帕金森定律所述:“不管存储器有多大,程序都可以把它填满。” 所以对计算机内存进行合理且有效的管理是必要的。

内存管理主要包括以下内容:
        (1) 内存的分配与回收:采取不同的分配与回收策略,记录内存的使用情况,使计算机系统可以合理高效地利用内存资源。
        (2) 地址转换:由于进程的逻辑地址与其在内存中的物理地址可能存在不一致,系统需要对进程的地址进行转换,即将进程的逻辑地址转换为物理地址。
        (3) 内存空间的逻辑扩充:采用虚拟存储器技术将内存从逻辑上进行扩充,从而高效利用内存并解决了大程序无法装入内存的问题。
        (4) 内存共享:使不同的进程之间共享同一部分内存。共享内存的用途在于让不同进程之间相互通信,以及减少内存的占用。
        (5) 内存保护:采用界地址保护和存取访问控制等方式,控制进程只能访问自己有权访问的内存部分,从而防止用户进程对操作系统的干扰或用户进程之间的相互干扰。

4.在适合多道程序运行的分区存储管理系统中,存储保护是为了( )。
A. 防止多道作业占用同一处理机
B. 防止各道作业相互干扰
C. 防止一道作业占用多个分区
D. 防止作业非法访问磁盘文件

4.【参考答案】 B
【解析】内存保护通过界地址保护和访问权限设置的方式,防止用户进程对操作系统和用户进程对其他用户进程的干扰。所以内存保护的目的是防止进程之间的互相干扰,所以 B 正确。

5.内存管理的基本任务是提高内存的利用率,使多道程序能在不受干扰的环境中运行,这主要是通过下列哪种功能实现的( )。
A. 内存分配
B. 内存扩充
C. 内存保护
D. 对换

5.【参考答案】 C
【解析】内存保护通过界地址保护和访问权限设置的方式,防止用户进程对操作系统和用户进程对其他用户进程的干扰。所以内存保护的目的是防止进程之间的互相干扰,所以 C 正确。

        内存管理由操作系统执行,上层程序用户并不需要关心其实现细节,这有效提高了计算机系统的易用性,提高了上层编程人员的开发效率。接下来从现代存储系统的多层结构开始,逐一对内存管理的各项功能做详细介绍。

2.多层结构存储系统
        存储系统的层次结构如图 3.1 所示,在层次结构中,越上层的存储器越接近 CPU,传输速度越快。本章主要介绍的层次为 CPU 寄存器、主存储器和辅存储器,其中的寄存器和主存储器可称为可执行存储器。可执行存储器与 CPU 直接交互,系统可以在较少的时钟周期内使用一条 load 或 store 指令对其进行访问,相较于辅存储器一般能快 3 个数量级甚至更多。

        【提示】固定磁盘和可移动存储介质都属于辅存储器,也可称外存。

        主存储器:又称主存或内存,程序在运行前需要先装入到主存中。主存与 CPU 直接交互,其运行速度与 CPU 相比较慢。为了缓和二者之间的速度差异,在主存储器之上引入了寄存器和高速缓存,其中高速缓存(Cache)与快表(Translation Lookaside Buffer, TLB)原理相似,其设置在主存和 CPU 寄存器之间。TLB 和 Cache 的存取速度快,TLB 中存储部分页表以加快 CPU 对页表的访问,Cache 中存储部分内存块中的内容以加快 CPU 对进程文件的访问。

        寄存器:寄存器造价高昂,在计算机中数量较少。其存取速度与 CPU 相近,多用于存放操作数等运行时数据,从而减少进程的访存耗时。

3.内存空间结构
        内存由一系列大小相同的存储单元组成,存储单元从 0 开始依次编址,一般来说编址单位可以是字节或字。按照字节(字)编址,是指该内存以一个字节(字)为一个存储单元,从 0 开始依次编址。

        【提示】考生在内存相关题目中务必认真审题,仔细看清题干中对编址方式的说明。若不做特殊说明,在本文接下来的叙述中,内存默认按照字节编址。

        内存大小中常见的单位换算:1T=2^10G=2^20M=2^30K=2^40

        内存空间通常还会被划分为系统区和用户区系统区仅供操作系统使用,位于内存的低址部分,本文讲述的内存分配任务大都在用户区进行。

        【举例】《古剑奇谭・梦付千秋星垂野》大小为 35GB。其中 35G 为数字,B(字节)为单位。若内存单元是以字节编址的,则该游戏要占用35×2^30个内存单元。每个内存单元对应一个地址,依次为,则至少需要=36位的二进制数才能完全表示。

        考生可以发现,大多数家用计算机都没有 35GB 的内存,并不能将该游戏装入内存之中,但却可以运行该游戏(游戏官方给出的最低内存要求是 8GB)。这其中的原委将在虚拟内存一节叙述,考生可以在此之前思考一下。

4.进程的内存映像
        进程的内存映像是指系统在内存中存放可执行程序文件的方式。

      进程初始化时,系统为进程分配存储空间,并在系统区为进程建立进程控制块(PCB)。PCB 是系统用以控制和管理进程的文件,其中记录了该进程的各种信息,之后将提到的进程页表起始地址就被记录在其中。

通常进程在内存中的存储情况如图 3.2 所示,主要被分为如下四个部分:
        (1) 代码段:代码段又称文本段,是程序装入内存的二进制代码,通常不可修改。代码段可重入,适合实现多进程共享。
        (2) 数据段:存放全局变量和静态变量等程序数据的部分,可读写。数据段在进程初始化后就具有一定大小,data 部分以确定的值初始化,随后在运行中被更改。
        (3) 堆:堆区初始化为空,c 语言中可用 malloc 和 free 动态地申请和释放该部分空间。
        (4) 栈:栈区初始化为空,随着程序的运行增长和缩减。如果调用函数需要的存储空间较大,寄存器不能满足需求,系统则会在进程栈区为其开辟一个栈帧,用以存储传递的参数、返回地址及各种局部变量等信息。

5.逻辑地址和物理地址
        逻辑地址宽泛来讲是指与当前数据在内存中的实际物理分配地址无关的访问地址,逻辑地址的范围称作逻辑地址空间,但需要注意的是在计算机中讲逻辑地址就等同于在讲相对地址。相对地址是逻辑地址的一种特例,指当前存储单元相对于程序开始处的存储单元的位置。逻辑地址是一个十分重要的概念,它将操作系统的上层用户从内存管理任务中解放出来,编程人员在编写程序的时候不再需要关心程序在内存中的实际存放位置。

        【提示】若不做特殊声明,接下来讲述中所提到的逻辑地址都是指相对地址。

        物理地址又称绝对地址,是指数据在内存中存放的实际位置,物理地址的范围则称作物理地址空间。系统需要使用物理地址来访问内存中的程序数据,所以在进行访存时需要进行地址变换。地址变换指的便是将数据的逻辑地址转换为物理地址的这一过程。

        图 3.3 和图 3.4 分别展示了没有逻辑地址和引入了逻辑地址的内存访问流程(图中的虚拟地址是逻辑地址的一种,这将在虚拟内存部分详细说明)。

        【举例】编程人员编写程序时,需要访问数组的某个元素。此时编程人员只需要使用高级程序语言说明,现在需要访问数组的第 n 个元素,系统就能据此结合数组起始地址来访问到该元素,而不需要指定其在内存中的实际内存地址。这里的第 n 个元素实际就是一种逻辑地址的概念(实际的逻辑地址是在编译后形成的),而数组元素被存放的实际内存地址就是物理地址。

        在各种内存管理方式中,分页存储管理方式和分段存储管理方式可以较好地体现逻辑地址到物理地址的转换,并且较为重要。图 3.5 和图 3.6 分别给出了这两种方式的地址转换简图,这将在对应章节详细讲解,此处了解即可。

6.重定位
        重定位是指将程序文件装入到与其文件内部地址空间不一致的外部地址空间时,需要完成的地址修改过程。这个过程可能发生在程序文件装入、内存置换和紧凑等过程中。重定位可分为静态重定位和动态重定位。

41.某系统采用分页式存储管理方式,以下关于该系统的说法中正确的有( )。
I. 分页存储系统不会产生外部碎片,但是会产生内部碎片
II. 若该计算机系统不使用快表(TLB),且页表只有一级,则进程访问内存数据时,需要进行至少两次内存访问
III. 分页存储管理系统可以采用静态重定位方式
IV. 分页存储管理系统中的页面概念对用户是透明的
A. I、II
B. II、III
C. 全部
D. I、II、IV

41.【参考答案】 D
【解析】分页存储管理方式下,进程装入内存后可能会改变位置,不能采用静态重定位,所以 III 错误。I、IV 正确。分页存储不用 TLB 时至少需要一次访存查页表,和一次访存取数据,所以 II 正确。

3.在多道程序环境中,用户程序的相对地址与装入内存后的实际物理地址不同,把相对地址转换为物理地址,这个功能是( )的。
A. 进程调度
B. 设备管理
C. 地址重定位
D. 资源管理

3.【参考答案】 C
【解析】在程序装入时,可采用地址重定位将程序内部相对地址重定位成物理内存中的绝对地址(物理地址)。C 正确。

        静态重定位是指程序文件在被装入内存时,一次性完成地址的修改,重定位在程序运行前就已经完成。下一节介绍的可重定位装入方式就是采用了静态重定位。

18.可以采用静态重定位的内存管理方式有( )。
I. 固定分区
II. 可变分区
III. 页式
IV. 段式
A. I、II、IV
B. I、IV
C. 仅 I
D. 全部

18.【参考答案】 C
【解析】固定分区方式中,程序装入后位置不再改变,可以采用静态重定位。其余三种方式均可能在运行过程中改变程序位置,不能采用静态重定位。所以只有 I 可以,选择 C 选项。

        动态重定位是指在 CPU 访问文件时使用动态地址变换机构这类硬件来自动完成地址变换,重定位发生在程序执行时。下一节介绍的动态运行时装入方式就是采用了动态重定位。

6.采用动态重定位方式装入作业,在执行中允许( )将其移走。
A. 用户有条件地
B. 用户无条件地
C. 操作系统有条件地
D. 操作系统无条件地

6.【参考答案】 C
【解析】动态重定位是指 CPU 访问内存时由地址变换机构自动将相对地址转换为绝对地址。采用动态重定位装入方式时,进程装入后仍保持其相对地址,访问时再重定位转换。并且在必要的时候可以由操作系统有条件地将装入后的进程移走,所以 C 选项正确。

7.程序的装入和链接
        从源程序到执行进程主要需经过三个步骤:编译、链接和装入,源程序经过编译成为一组目标模块(此时形成逻辑地址),然后经过不同的链接和装入过程成为执行进程。

         (1) 编译:使用相关编译程序编译源程序,形成一系列的目标模块 。
        (2) 链接:使用链接程序将编译所形成的目标模块连同所需要的相关库函数链接在一起,形成一个完整的装入模块。这期间需要对目标模块内的地址数据做修改,形成逻辑地址。

51.【2011】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是( )。
A. 编辑
B. 编译
C. 链接
D. 装载

51.【参考答案】 C
【解析】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是链接。

        (3) 装入:使用装入程序把链接形成的装入模块装入到内存 ,形成物理地址。

(1) 程序的装入
        ① 绝对装入方式:绝对装入方式是指在预先知道装入位置时,在编译过程中就将逻辑地址转换为物理地址。这一装入方式只适合于单道程序系统,因为在大多数系统中,程序的装入位置都是无法预先知道的。
        ② 可重定位装入方式:可重定位装入方式是指在装入的过程中,根据装入位置将装入模块中的逻辑地址修改为物理地址,即装入前是逻辑地址,装入后是物理地址。可重定位装入方式克服了绝对装入方式的缺点,不再需要预先知道装入位置,但该方式不允许程序在运行时移动位置。
        ③ 动态运行时装入方式:动态运行时装入是指模块被装入内存后不更改其中的逻辑地址,逻辑地址转换为物理地址的过程被推迟到模块执行时。系统需要提供一个基址寄存器(记录程序起始地址 )来支持这一地址变换过程,即物理地址 = 基址寄存器中的程序起始地址 + 逻辑地址。目标模块在装入后有可能还会调动位置,动态运行装入方式可以很好地应对这一情况。

        【提示】采用动态运行时装入方式,程序在装入内存后,所有地址依然是逻辑地址;只有在程序执行时,才会进行逻辑地址到物理地址的转换。

(2) 程序的链接
        (1) 如图 3.9 所示,静态链接方式是指将编译获得的目标模块在装入前链接成一个完整的装配模块后,再将其装入内存。
        (2) 装入时动态链接是指将目标模块一边装入内存一边进行链接,优点如下:
        (a) 由于目标模块并未被提前链接为一个整体,方便单独修改其中的一个或几个目标模块,而不需要重新打开整个装入模块。
        (b) 方便对其中的一个或几个目标模块进行重用,多个不同的装入模块可以使用同一个目标模块。
        (3) 运行时动态链接是指在运行前不将目标模块链接成整体,而是在程序运行过程中需要用到某一模块时,再将该模块调入内存进行链接。此方式可以加快程序装入过程,同时节省内存空间。

51.【2011】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是( )。
A. 编辑
B. 编译
C. 链接
D. 装载

51.【参考答案】 C
【解析】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是链接。

8.内存保护
        在多道程序处理系统中,为了保证进程运行的确定性和稳定性,需要为进程设置内存保护机制,以防止用户进程对操作系统的干扰及用户进程之间的互相干扰。内存保护是指设置一定的机构来保证进程在未被允许的情况下,不能访问分配给其他进程的内存空间,从而保护进程数据不受外界干扰,实现存储安全。

        内存保护中检查进程所要访问的内存单元是否属于自己,通常需要在运行时来检查所有的内存访问。在分页分段等存储方式中,统一在地址变换机构中实现了内存保护。

4.在适合多道程序运行的分区存储管理系统中,存储保护是为了( )。
A. 防止多道作业占用同一处理机
B. 防止各道作业相互干扰
C. 防止一道作业占用多个分区
D. 防止作业非法访问磁盘文件

4.【参考答案】 B
【解析】内存保护通过界地址保护和访问权限设置的方式,防止用户进程对操作系统和用户进程对其他用户进程的干扰。所以内存保护的目的是防止进程之间的互相干扰,所以 B 正确。

5.内存管理的基本任务是提高内存的利用率,使多道程序能在不受干扰的环境中运行,这主要是通过下列哪种功能实现的( )。
A. 内存分配
B. 内存扩充
C. 内存保护
D. 对换

5.【参考答案】 C
【解析】内存保护通过界地址保护和访问权限设置的方式,防止用户进程对操作系统和用户进程对其他用户进程的干扰。所以内存保护的目的是防止进程之间的互相干扰,所以 C 正确。

通常的内存保护机构有以下两种:
        (1) 一对上下限寄存器,分别记录当前作业的起始地址和尾址。CPU 访存时验证访问地址是否处于二者之间。
        (2) 一个重定位寄存器(或基址寄存器)和界地址寄存器(限长寄存器)。重定位寄存器记录作业的起始地址,界地址寄存器记录作业的长度,CPU 访存时比较访问地址是否处于起始地址和尾址(尾址 = 起始地址 + 长度 )之间。

50.【2009】分区分配内存管理方式的主要保护措施是( )。
A. 界地址保护
B. 程序代码保护
C. 数据保护
D. 栈保护

50.【参考答案】 A
        【解析】分区分配内存管理方式的主要保护措施是界地址保护。为保证进程之间互不干扰,每个进程拥有自己独立的内存空间,其他进程不可以随意访问。通过设置界地址寄存器来检测进程访问是否越界。

20.下面关于内存保护的描述不正确的是( )。
A. 一个进程不能未被授权就访问另外一个进程的内存单元
B. 内存保护可以仅通过操作系统(软件)来满足,不需要处理器(硬件)的支持
C. 内存保护的方法有界地址保护和存储键保护
D. 一个进程中的程序不能跳转到另一个进程的指令地址中

20.【参考答案】 B
        【解析】内存保护需要上下限寄存器或界地址寄存器和重定位寄存器的支持,需要硬件。所以 B 选项错误,A、C、D 均正确。

9.内存共享
        在多道程序处理系统中,几个不同的用户可能同时运行相同的程序,此时若在内存中为每一个用户进程都保留该程序的一个副本,则较为浪费内存空间。采取内存共享则可以有效地避免同一程序的不同副本带来的内存浪费。

        内存共享是指当多个用户进程需要用到同一个程序文件时,只在内存中保留该程序文件的一个副本,令共享该程序文件的进程都指向其所在的内存空间。由于进程运行时可能会对程序文件进行修改,这会造成不同进程之间的互相影响。所以被共享的内容应当是那些不会被修改的部分,这部分代码被称之为可重入代码又称为 纯代码。

        通常可将程序分为指令部分 I 和数据部分 D,其中的指令部分通常不会被修改。若程序能做到 I 和 D 的分离,将有利于进行内存共享。

        但是对 I 部分的共享依旧存在一定的问题,虽然 I 部分不会被修改,但当某个共享进程不再使用共享内容时,该部分文件将会被调出内存,这会造成其他共享进程的大量缺页。所以,对于被共享的文件内容,应当在所有共享进程都不再需要其时,再将其调出内存。要确定该文件内容是否已被所有共享进程所释放,系统需要遍历所有进程的页表,这一操作的代价较大。所以,系统中通常需要为此设立一个新的数据结构,用以记录内存中的共享内容、当前有多少进程共享该内容等信息,段式内存管理方式中介绍的共享段表便是这类数据结构的一种。

1.在以下四条与存储管理相关的叙述中,正确的一条是( )。
A. 虚拟内存管理方式需要有对应的硬件支持才能实现
B. 在虚拟存储系统中,作业的编址空间只与磁盘空间大小有关
C. 在多用户的分时系统中,用户平分所有的内存空间
D. 限制内存分配是内存保护的目的

1.【参考答案】 A
        【解析】A 选项。虚存大小与磁盘和内存容量和以及系统的寻址空间都有关系,B 错误。分时系统中用户划分的是时间,C 错误。内存保护的目的是防止进程之间的互相干扰,D 选项错误。

3.1.2 连续分配管理方式

        连续分配管理方式指系统为需要运行的程序分配一片连续的内存空间,并将其装入到这片空间中。该类方式需要将程序文件完整地放入到内存的一片连续空间里,即意味着对于单个程序,其文件的物理地址是相邻的。

        连续分配管理这一类方法的想法比较直接,是最早出现的内存管理方式,主要包括单一连续分配、固定分区分配、动态分区分配。其中的动态分区分配如果使用了动态重定位实现紧凑来解决外部碎片问题,则被称为动态可重定位分区分配。

1. 单一连续分配

        单一连续分配方式是指系统将用户区整体分配给一个进程单独使用,该方式只适用于单道程序环境。

        在单用户单任务的操作系统中,机器由一个用户独占,不存在其他用户的干扰,所以可以不设置存储器保护措施,该方式安全性较高且容易实现。

        单一连续分配方式下操作系统不能并发,CPU 有大量时间处于空闲状态(如等待 I/O),机器运作效率低下。
        (1) 优点:无外部碎片,无需内存保护,安全性较高且容易实现。
        (2) 缺点:有内部碎片,存储器利用率低,无法运行多道程序,操作系统效率低。

        【提示】内部碎片和外部碎片将在本章的后续部分阐明,此处只需对此有一定印象即可。

2. 固定分区分配

        20 世纪 60 年代及之后出现的多道程序系统,能同时将多个程序装入到内存之中。为了使程序之间互不影响,需要为这些程序各分配一片独立的内存空间,固定分区分配方式就是可以满足多道程序系统要求的内存管理方式之一。

        固定分区分配方式是指在初始化时将内存空间分割成固定大小的区域,当有程序需要运行时,系统从内存中寻找一片合适的空闲分区分配给该程序。等程序运行结束后,系统再将这片区域回收,并从待运行程序队列中选择一个合适大小的程序装入。

18.可以采用静态重定位的内存管理方式有( )。
I. 固定分区
II. 可变分区
III. 页式
IV. 段式
A. I、II、IV
B. I、IV
C. 仅 I
D. 全部

18.【参考答案】 C
【解析】固定分区方式中,程序装入后位置不再改变,可以采用静态重定位。其余三种方式均可能在运行过程中改变程序位置,不能采用静态重定位。所以只有 I 可以,选择 C 选项。

(1) 分区方法

        ·分区大小相等:所有用户空间的内存分区大小是一样的,这种方式灵活性较差,程序较小则会产生内部碎片,程序较大则无法装入。

16.某系统采用固定分区分配存储管理,内存空间为 430K,其中地址 0 到 30K 被系统占用,其他空间按分区大小相等的方法划为 4 个分区,则当有大小分别为 7KB、90KB、30KB、20KB 的作业进入内存时,浪费的内存为( )。
A. 53KB
B. 200KB
C. 253KB
D. 280KB

16.【参考答案】 C
【解析】系统占据了 30KB 的内存空间,将余下的 400KB 等分成 4 个分区,每个分区大小为 100KB,在固定分区分配管理中,每个分区只装入一道作业,浪费的内存大小为(100−7)+(100−90)+(100−30)+(100−20)=253KB,选项 C 正确。

        ·分区大小不等:根据用户运行程序大小的统计分布规律来决定用户空间的分区大小比例。内存通常被分为较多的小区域,适量多的中等区域,较少的大区域。装入程序时,根据程序的大小选择合适的分区,从而减少内部碎片造成的浪费,也在一定程度上缓解了大型程序无法装入运行的棘手问题。

12.在固定分区分配的方法中,每个分区的大小( )。
A. 相同
B. 随作业长度变化
C. 可以不同但预先固定
D. 可以不同但根据作业长度固定

12.【参考答案】 C
【解析】固定分区分配方法在初始化时就划分好分区,该方法的分区方式包括等分区和不等分区,所以选择 C。

(2) 内存分配方法

·需要的数据结构
        为了实现固定分区分配方法,系统需建立一张分区说明表,用以记录用户空间的区域分配情况。如下表所示,分区说明表包括分区号、分区大小、起始地址和分配状态四个表项,通过大小和起始地址两项可以完全描述分区的开始位置、结束位置以及空间大小。

·程序装入过程
        具体的程序装入过程:当待运行程序队列非空时,系统检查分区说明表,为队头程序寻找一片合适大小的空闲分区,然后将其分配给该程序。
其中合适分区的寻找如下:

        ·对于等分区的方式来说,任何一个可以装下该程序的区域都是等效的合适分区。

        ·对于不等分区的方式来说,常用策略是每次都选择可以装入该程序的最小分区。

(3) 优缺点分析

        ·优点:固定分区策略不存在外部碎片且实现简单,是系统开销很小的一种多道程序系统内存分配方法。

        ·缺点:① 预先划分区域会导致一些大程序无法装入。② 会产生较多的内部碎片。虽然使用分区大小不等的方法能使这种情况有所缓解,不过只有在系统初期就知道程序的大小分布时,该方式才能发挥出好的效果。

        【提示】程序在装入某个分区后,可能不会占满该分区的所有空间,被浪费的这部分分区内部空间就被称之为内部碎片。对于 “外部碎片” 的解释见下一节。

3. 动态分区分配

        动态分区方法是指系统在有待运行程序时,再从内存空间中划分出一块与程序大小相当的连续区域分配出去,而不是在初始化时就将内存划分好。

(1) 外部碎片和紧凑
        图 3.11 表示内存空间的某个局部状态,图 a - d 表示我们在这片区域相邻地装入 A、B、C 三个进程,图 e 和图 f 表示 B 进程运行完成后被略小一些的 D 进程替换出内存。从 f 图中可以看出此时在 D 进程和 C 进程之间有一块仅 4MB 的小内存空间,这样的空间就被称为外部碎片,它很难再装入一个完整的程序文件。这样的过程可能在内存的各个局部频繁发生,随着机器运行,整个内存中会存在越来越多这样的碎片。

        假设系统中存在十个 4MB 大小的外部碎片,此时有个 20MB 大小的程序文件需要装入内存,剩余内存空间大小是足够的,但剩余空间的不连续导致这个 20MB 的程序无法装入。

        如果使用了动态重定位实现紧凑来解决外部碎片问题,则该方式被称为动态可重定位分区分配。紧凑:操作系统移动内存中的程序,从而使程序之间相互连成一片。

        紧凑方法将小空间合并成大空间,消除了外部碎片。但每次移动程序文件都要进行读写,并修改地址信息,系统开销很大。因而操作系统需要设计巧妙的内存分配方法来尽量减少外部碎片的产生。

        【提示】实际上为了避免产生太多细小的外部碎片,部分系统在分配内存空间时会设定一个阈值,在某一片连续空间中装入程序文件后,当剩余的空间小于阈值时,将不再切割这片连续的内存空间,直接将这一片区域全部分配出去。

(2) 需要的数据结构

        空闲分区表:在系统中设置一个空闲分区表来管理内存,一个连续的空闲空间占用一个表目。如下表所示,表中包括分区号、分区大小、分区起始地址、分区状态等表项。

 

        空闲分区链:下图所示为空闲分区链,其在所有空闲分区头尾都添加了有关分区状态的信息以及指向上个、下个空闲分区的指针,用双向链表的方式将所有的连续空闲空间串起来。

(3) 分配算法
        不同于先前提到的固定分区方法,动态分区方法的每次空间分配都在改变内存空间的分区情况。所以在为用户程序分配内存空间时,需要充分考虑到这次分配对内存空间分区的影响。这就要求系统采取合适的策略来为程序选择装入分区,以达到高效利用内存空间的目的(主要是避免外部碎片)。常见的分配算法如下:
① 首次适应算法 (First Fit, FF)
        首次适应算法是指将空闲分区按照地址升序排序,每一次都从头向后查找,在第一个足以容纳该程序的连续空间中划分出程序所需的空间。
        该方法倾向于使用低址空间,优点:保留了高址空间的大连续空间,利于后续到来的大程序装入。缺点:① 频繁在低址部分划分空间,容易在这部分区域留下较多的外部碎片。② 每次查找都从低址开始,查找开销偏大(低址空间被优先分配出去了,但被查找的频率却最为频繁)。

9.计算机系统按字节编址采用可变分区分配存储管理方法,用空闲分区表管理空闲分区,分配内存采用首次适应算法,并将分区的高地址部分分配出去。内存低地址部分的 200KB 由操作系统占据,用户区从 200K 开始,大小为 386KB,初始时为空。接下来一段时间里内存中进行了以下操作:进程 A 申请 80KB,进程 B 申请 56KB,进程 C 申请 120KB,进程 A 释放 80KB,进程 C 释放 120KB,进程 D 申请 156KB,进程 E 申请 81KB。问完成这些操作后内存中最小空闲块的大小为( )。
A. 56KB
B. 13KB
C. 12KB
D. 89KB

9.【参考答案】 B
【解析】目前已有的空闲分区为 200K~586K,大小为 386KB,在进程 A 申请 80KB,进程 B 申请 56KB,进程 C 申请 120KB 后,此时的空闲分区为 586K~456K = 130K。此后进程 A 释放 80KB,进程 C 释放 120KB,此时的空闲分区为 200K~280K,336K~586K 两个空闲分区,进程 D 申请 156KB 分配在 336K~586K 的空闲分区,满足进程 E 申请的 81KB 的空闲分区为 492K~586K,此时最小的空闲分区为 586K~573K = 13KB。

② 循环首次适应算法 (Next Fit, NF)
        循环首次适应算法是指将空闲分区按照地址升序排序,设置一个查找指针从头向后查找,随后的每一次查找都从上次查找后指针的停留位置开始。
        优点:该方法可以在一定程度上缓解首次适应算法的两个弊端,使得空闲分区分布的更为均匀。缺点:该方法会将本可保存在内存末尾的大空闲区域分裂为小空闲区域,会造成缺少大空闲分区的状况。
③ 最佳适应算法 (Best Fit, BF)
        最佳适应算法是指将空闲分区按大小升序排列,依次查找,选择第一个可以容纳程序的空间分配出去。该方法选取最小的可以容纳程序的空闲分区进行分配。
        优点:能留下更多大分区以满足大进程需求,缺点:该方式从整体空间的利用效率来看不一定是真正的最佳,因为这样划分容易留下许多小空间分区,其外部碎片是这四种方法中最多的。该算法需要对空闲分区按大小排序,开销大。

54.【2019】在下列动态分区分配算法中,最容易产生内存碎片的是( )。
A. 首次适应算法
B. 最坏适应算法
C. 最佳适应算法
D. 循环首次适应算法

54.【参考答案】 C
【解析】最佳适应算法总是从符合装入程序大小的空闲区域中选择最小的分配出去,最为容易产生外部碎片。

53.【2017】某计算机按字节编址,其动态分区内存管理采用最佳适应算法,每次分配和回收内存后都对空闲分区链重新排序。当前空闲分区信息如下表所示。

回收起始地址为 60K、大小为 140KB 的分区后,系统中空闲分区的数量、空闲分区链第一个分区的起始地址和大小分别是( )。
A. 3、20K、380KB
B. 3、500K、80KB
C. 4、20K、180KB
D. 4、500K、80KB

53.【参考答案】 B
        【解析】回收分区的起始地址是 60K 与起始地址为 20K 的分区相邻,回收分区的尾部地址是60+140=200K与起始地址为 200K 的分区相邻。所以应当将这三个分区合并成一个起始地址为 20K,大小为 380KB 的空闲分区。所以系统中此时存在三个空闲分区。
        题目说明了,每次回收内存后都对空闲分区链重新排序。根据题目给出的空闲分区信息可以看出,空闲分区链是按照分区大小升序排序的。所以第一个即是最小的分区,该分区的起始地址为 500K 大小为 80KB。

 52.【2010】某基于动态分区存储管理的计算机,其主存容量为 55MB (初始为空),采用最佳适配 (Best Fit) 算法,分配和释放的顺序为:分配 15MB,分配 30MB,释放 15MB,分配 8MB,分配 6MB,此时主存中最大空闲分区的大小是( )。
A. 7MB
B. 9MB
C. 10MB
D. 15MB

52.【参考答案】 B
【解析】最佳适配算法是指,每次都从可装入该程序的最小空闲区域中,划分出和该程序大小相等的内存空间给该程序。经过题述的分配释放过程后,此时有开头15−6=9MB和末尾 2MB 两个空闲区域。所以答案选 B。过程如下图所示。

7.系统按字节编址,采用动态分区分配方式和最佳适应算法。某一时刻内存的使用情况如下图所示(操作系统从地址 0 开始存放),此时有一 85KB 的程序需要装入内存,则该程序分配到的分区首址为( )。

A. 100K
B. 190K
C. 330K
D. 410K

7.【参考答案】 B
【解析】最佳适配算法是指,每次都从可装入该程序的最小空闲区域中,划分出和该程序大小相等的内存空间给该程序。根据题目要求,要分配一个 85KB 大小的内存空间给该程序,其空闲分区首地址为100+80+10=190K。

10.某计算机系统按字节编址采用动态分区存储管理方式,内存分配采用最佳适应算法。内存低 32MB 被操作系统占据,用户区大小为 55MB,初始为空。接下来一段时间里内存中进行了以下操作:进程 A 分配 15MB,进程 B 分配 30MB,进程 A 释放 15MB,进程 C 分配 8MB,进程 D 分配 6MB。问完成上述操作后内存中最大的空闲分区大小是( )。
A. 15MB
B. 7MB
C. 9MB
D. 10MB

10.【参考答案】 C
【解析】最佳适应算法,每次都从可装入该程序的最小空闲区域中,划分出和该程序大小最相近的空闲分区分配给该程序。当给进程 A 分配 15MB,进程 B 分配 30MB 后,空闲分区是 45M~55M,大小为 10MB,此时将进程 A 释放,再为进程 C 分配 8MB,进程 D 分配 6MB。根据最佳适配算法,进程 C 分配的 8MB 为 45M~55M 的空闲分区,进程 D 分配的 6MB 为 0M~15M 的空闲分区,此时的最大空闲分区为 15MB - 6MB = 9MB。

④ 最坏适应算法 (Worst Fit, WF)
        最坏适应算法指选择所有空闲分区中最大的分区来分配给程序,若最大的空闲分区不够大,则分配失败。优点:可以减少外部碎片的产生,缺点:使得内存中缺少大空闲分区。

15.在动态分区存储系统中,空闲表的内容如下:

        此时,进程 P 请求 50KB 内存,系统从第一个空闲块开始查找,结果把第 4 个空闲块分配给了进程 P。请问系统采用的分区分配算法是( )。
A. 首次适应法
B. 最佳适应法
C. 最差适应法
D. 循环首次适应法

15.【参考答案】 C
【解析】从第一个空闲块优先查找。若使用首次适应算法,小地址空闲块优先分配,则会把空闲块 1 分配给进程 P,A 错误。若使用最佳适应算法,最小块优先分配,则会把空闲块 3 分配给进程 P,B 错误。若使用最差适应算法,最大块优先分配,则会把空闲块 4 分配给进程 P,C 正确。若使用循环首次适应法,当前地址优先分配,则也会把空闲块 1 分配给进程 P,D 错误。

        无论何种方法,都有各自的优点和缺点。为了减少外部碎片往往会造成大空闲分区的缺失,而反过来也是相同。所以在选择方法时,需要在这二者之间寻得一个合适的平衡点。实际上,看起来最简单的首次适应法在实际使用中的效果最好,它实现起来简单,需要的额外开销小,并且处于最佳适应和最坏适应之间,较为均衡。

(4) 回收内存
        程序运行完成后要释放相应的内存空间,系统需要将该空间回收,并加入到空闲分区表(链)中。下面以空闲分区表作为被使用的数据结构来详细介绍一下内存回收的过程。
回收的内存空间可能出现以下四种情况:
        (a) 回收空间的头与尾都不与任何空闲区域相邻,则在空闲分区表中增加一个表项来记录该回收空间。
        (b) 回收空间的头部与一个空闲区域相邻,则在该空闲区域表目中的空间大小数据项里加上所回收空闲区域的大小。
        (c) 回收空间的尾部与一个空闲区域相邻,则除了在该空闲区域表目中的空间大小数据项上加上所回收空间区域的大小,还要将起始地址数据项改为回收空间的起始地址。
        (d) 回收空间的头部及尾部都与现有空闲区域相邻,则要合并这两个空闲区域的表项,新表项的起始地址为低地址的空闲区域的起始地址,空间大小为三者的和,空闲分区表中减少一个表项。

11.系统采用动态分区方式管理内存,空闲分区使用空闲分区表记录,问什么情况下回收一个空闲分区,反而会使得系统的空间分区数减少 1( )。
A. 有下邻空闲区但无上邻空闲区
B. 有上邻空闲区也有下邻空闲区
C. 无上邻空闲区也无下邻空闲区
D. 有上邻空闲区但无下邻空闲区

11.【参考答案】 B
【解析】有上邻空闲区也有下邻空闲区时,这三个分区会合成一个分区,所以最终总分区数减一。选项 B 正确。

        【例 3.1】某计算机按字节编址,其动态分区内存管理采用最佳适应算法,每次分配和回收内存后都对空闲分区链重新排序。当前空闲分区信息如下表所示。回收起始地址为 60K、大小为 140KB 的分区后,系统中空闲分区的数量、空闲分区链第一个分区的起始地址和大小分别是 ()
A. 3、20 K、380 KB
B. 3、500 K、80 KB
C. 4、20 K、180 KB
D. 4、500 K、80 KB

                                                表 3.3 空闲分区情况

分区起始地址

20K

500K

1000K

200K

分区大小

40KB

80KB

100KB

200KB

        解:应选 B,回收分区的起始地址是 60K 与起始地址为 20K 的分区相邻,尾部地址是 60 + 140 = 200K 与起始地址为 200K 的分区相邻。所以应当将这三个分区合并成一个起始地址为 20K,大小为 380KB 的空闲分区。所以系统中此时存在三个空闲分区。
        题目说明了,每次回收内存后都对空闲分区链重新排序。根据题目给出的空闲分区信息可以看出,空闲分区链是按照分区大小升序排序的。所以第一个即是最小的分区,该分区的起始地址为 500K 大小为 80KB。

连续存储管理方式相关总结如下表所示。

【提示】建议考生在学到此处时,先将本节末的 1 - 16 小题完成,以巩固相关知识。

21.不会产生内部碎片的存储管理系统是( )。
A. 分页式存储管理
B. 固定分区式存储管理
C. 可变式存储管理
D. 段页式存储管理

21.【参考答案】 C
【解析】可变式分区管理方式中,进程需要多大的空间就划分出多大的内存分区给进程,所以不存在内部碎片。其他三种方式都存在内部碎片。选择 C 选项。

3.1.3 非连续分配管理方式

1. 非连续存储概述

        非连续分配管理方式是指将一个完整的程序分割开,放入不相邻的空闲分区中。
        非连续分配管理方式有效地解决了连续存储方式中存在的内存浪费(外部碎片)问题。不过由于需要存储额外的索引信息,该种方式下内存的存储密度比连续存储管理方式更低。

        【提示】存储密度是指有效信息在所有存储信息中的占比。

        按照程序逻辑空间分割大小是否固定,可分为分页存储管理方式、分段存储管理方式以及将二者相互结合的段页式存储管理方式。分页(段)存储管理方式按照是否有请求调入和页面置换功能,可以分为基本分页(段)存储管理方式和请求分页(段)存储管理方式。

        分页存储管理和分段存储管理方式将在本章接下来的内容中讲解,而请求分页管理方式则会在下一章节再做叙述。

内存管理方式分类如图 3.13 所示。

2. 分页存储管理方式

页面(Page):将程序空间(即逻辑地址空间)分割成大小固定的块,这些块称为页面。
页框(Frame):将内存空间(即物理地址空间)分割成大小固定的块,这些块称为页框(页框的大小与页面相同)。

        【提示】应选择适中的页面大小,并且该大小应是 2 的指数倍,主要选择设定在 1KB - 8KB 这个范围内。因为页面设置过大会导致内部碎片的增加,而页面设置过小则会使得一个程序占据过多的页面,使页表变得过于庞大,降低存储密度。

45.下列关于分页和分段的描述,正确的是( )。
A. 分段是信息的逻辑单位,段长由系统决定
B. 分段引入的主要目的是实现分散分配并提高主存利用率
C. 分页是信息的物理单位,页长由用户决定
D. 分页系统中,页面在物理内存中只能从页面大小的整数倍地址开始存放

45.【参考答案】 D
【解析】段式管理系统按照用户的设定去划分逻辑地址空间,段长由用户决定,选项 A 错误。分页是信息的物理单位,页长由系统决定且大小固定,选项 C 错误。分页的主要目的是为了实现离散分配,提高内存利用率,选项 B 错误。在页式存储管理中,将虚拟内存空间和物理内存空间划分为大小相同的页面,因此,页面在物理内存中只能从页面大小的整数倍地址开始存放,选项 D 正确。

24.以下对分页存储管理方式中页面大小的说法中正确的是( )。
I. 选择较大的页面可以降低页表的大小,提高有效数据存储密度
II. 选择较小的页面可以减少内部碎片,从而更充分地利用内存空间
III. 选择较大的页面可以减小页表,并减少内部碎片,所以页面越大越好
A. I、II
B. I、II、III
C. I
D. II、III

24.【参考答案】 A
【解析】进程最后一页中会产生平均半页的内部碎片,选择较小的页面时,可以减小这一内部碎片浪费。选择较大的页面可以降低页表的大小,提高有效数据存储密度。但页面太大会增加内部碎片,造成内存空间的浪费。所以应当选择大小均衡的页面大小,而不是越大越好。所以 I、II 正确,III 错误。

        分页存储管理方式是指将程序地址空间分割成一定大小的页面,按照一定的策略将这些页面调入到内存的页框中。同一个程序的页面被调入到的页框不一定相邻,系统为了管理这些分散的页面,需要为分页管理方式建立一个称之为页表的索引。

(1) 地址结构

        如图所示,系统按字节编址,用 32 位二进制数来表示程序的逻辑地址。32 位的二进制数可以表示的范围是,每个数字对应一个内存单元,共可编址 4G 个内存单元每个内存单元的大小是 1B,所以这一长度的地址可表示的程序最大应为 4GB。

46.在采用分页存储管理的系统中,地址结构长度为 18 位,其中 11 至 17 位表示页号,0 至 10 位表示页内偏移量,则主存容量最大可为( )KB,主存可分为( )个块。若有一作业依次被放入 2、3、7 号物理块,相对地址 1500 处有一条指令 “store 1,12500”,那么,该指令地址所在页的页号为 0,指令的物理地址为( ),该指令数据的存储地址所在页的页号为( )。
A. 256、256、5596、7
B. 256、128、500、7
C. 256、128、5596、6
D. 256、128、5500、6

46.【参考答案】 C
【解析】由题意可知,共有 7 位来表示页号,因此共有2^7个页面,页面大小为2^11B(2KB),主存最大容量为2^7×2KB=256KB,在分页存储管理系统中,内存块数 = 页面数=2^7。由于该指令所在页的页号为 0,其分配的物理块号为 2,采用的是相对地址,所以该指令的物理地址 = 基地址 + 相对地址=2×2KB+1500=5596。该指令数据的存储地址为 12500,其所在页的页号为12500/2KB=6,选项 C 正确。

43.在分页存储管理系统中,页表内容如下表所示 (均从 0 开始编号)。若页面大小为 4KB,则地址转换机构将逻辑地址 0 转换成物理地址( )。

A. 8192
B. 4096
C. 2048
D. 1024

43.【参考答案】 A
【解析】页面大小4KB=4096B,逻辑地址 0 对应页号 0,查表知该页存放在 2 号物理块。2 号物理块的起始地址为4096×2=8192,页内偏移量为 0。故物理地址为 8192 。

40.某虚拟存储器的逻辑地址空间大小为 512 页,页大小为 4KB,且该存储器的物理地址空间大小为 64 页。则逻辑地址和物理地址分别是多少位( )。
A. 9,18
B. 9,6
C. 21,6
D. 21,18

40.【参考答案】 D
【解析】页内偏移量位数=log2​4K=12,页号位数=log2​512=9,页框号位数=log2​64=6。所以逻辑地址位数=9+12=21,物理地址位数=6+12=18。

        现在将页面大小选定为 4KB,即进程最多有4GB/4KB=1M页。其中第 0 页所占的地址号为:0x00000000−0x00000fff,可以看到,地址的高 20 位(可以表示 1M 页)所表示的数字便是页号,低 12 位(可以表示 4KB 空间)表示的数字则是该内容在页内的偏移量。

(2) 页表
        在连续分配方式中,只需要在进程的 PCB 里记录其在内存中的首地址及程序大小,就可以轻松地找到该程序。但在分页存储管理方式中,程序文件的页面被分配在了内存中不相邻的分区中。于是系统需要提供一种被称为页表的数据结构来记录页面与页框的对应关系,每一个进程都有自己的页表。如图 3.15 所示,页表内包含一系列大小固定的页表项,页表项中记录了进程某一页所对应的页框号,页号则隐含在页表项相对页表起始地址的偏移量中。

32.某系统使用 32 位逻辑地址,页大小为 4Kbytes,以及 36 位物理地址。那么该系统中的页表大小为( )。
A. 2^20个页表项
B. 2^24个页表项
C. 2^4个页表项
D. 2^12个页表项

32.【参考答案】 A
【解析】逻辑地址空间大小为2^32B,页大小为4KB=2^12B,所以共有2^32B/2^12B=2^20页,因此页表有2^20个页表项。

(3) 地址变换
        由于地址变换的发生频率较高,理论上使用硬件来完成地址的变换能有效提高系统的运行效率。但是,为每一个页面都分配一个寄存器用以实现页表结构的代价十分昂贵,所以,系统通常只好将页表置于内存空间中,在系统中只设置一个页表寄存器来存放页表的起始地址

        【提示】多核 CPU 中,每个核心都有一套寄存器,其中就包括页表寄存器。所以在多核 CPU 中页表寄存器不只有一个,CPU 中的每个核心都有一个页表寄存器。

        页表的起始地址在程序装入时被记录在该页表进程的 PCB 中,当该程序上处理器时,才将页表起始地址存入页表寄存器(PTR),这样的实现方式下,所有进程可以共用一个页表寄存器。

39.以下对分页式存储管理方式的叙述中正确的是( )。
A. 计算机系统中只有一张页表,页表起始地址存放在寄存器中
B. 计算机系统中只有一张页表,页表起始地址存放在进程 PCB 中
C. 计算机系统为每一个进程都创建一张页表,每个进程都有专属寄存器存放页表起始地址
D. 计算机系统为每一个进程都创建一张页表,页表起始地址存放在各自进程的 PCB 中,运行时被写入寄存器

39.【参考答案】 D
        【解析】分页存储管理方式中每个进程的页表起始地址存放在各自的 PCB 中,当进程上处理机时,将页表起始地址调入 PTR。选 D。

35.在分页式存储管理方式的计算机系统中,用于组织页面的页表的起始地址一般存放在( )。
A. 快表(TLB)
B. 页表寄存器(PTR)
C. 物理内存
D. 虚拟内存

35.【参考答案】 B
【解析】分页存储管理方式中每个进程的页表起始地址存放在各自的 PCB 中,当进程上处理机时,将页表起始地址调入 PTR。

接下来详细地介绍将程序的逻辑地址转换为物理地址的过程。
① 基本的地址变换机构
如图 3.16 所示,当进程需要访问某个逻辑地址时,从逻辑地址到物理地址的变换过程如下:

        将逻辑地址的页号与页表长度做比较,若页号大于页表长度,则越界。

        若未越界,则通过页号在页表中定位到相应的页表项,再从该页表项中获得对应的页框号(块号)。

        最后将页框号和逻辑地址中的页内偏移量组合在一起,形成对应的物理地址。

33.一个进程的页表如下表所示,页的大小为 1024B。指令 MOV AX,[2586] 中地址 2586(十进制)对应的物理地址是( )。

A. 2586
B. 10240
C. 10778
D. 31258

33.【参考答案】 C
【解析】页号=⌊2586/1024⌋=2,页内偏移量=2586%1024=538。2 号页面对应 10 号物理块,该物理块起始地址为10×1024=10240,所以物理地址为10240+538=10778,选 C。

② 具有快表(TLB)的变换机构
        从前面的变换流程中可以看到,系统想要访问一个逻辑地址时,需要访问两次内存;第一次从内存里的页表中取出页框号,第二次根据物理地址取出相应的数据。
        系统的访存开销相较于连续分配管理方式增加了很多,这是因为多出了一次对内存中页表的访问。如果可以把页表存放在一个访问速度更快的存储器件中,就可以大大减小这一开销。
        为了提高访问效率,系统可以在 CPU 的 Cache 中设置一个具有并行查找能力的高速缓存来存储页表,这个存储器被称之为快表(也称 TLB),使用相联存储器实现。由于高速缓存造价昂贵无法做到很大,所以快表只是存储了页表的一小部分。

        加入快表后的变换过程如图 3.17 所示。该变换过程与未加入快表时的不同之处,在于系统会先从快表中查找该逻辑地址所对应的页框号。若快表中未找到就去内存中的页表里查询(也可实现为同时查找),并将查询到的页表项存入到快表中。当快表存满时就涉及如何选择合适的页表项换出的问题,这与虚拟内存中的页面置换方法相似,将在下一章中再做详细介绍。

        接下来分析设置快表对系统带来的影响,先引入内存的有效访问时间(Effective Access Time,EAT)这一概念,它代表从进程发出地址访问请求到从内存中获得该地址对应物理地址中所存数据的这一段时间。
        在只有一级页表的分页管理方式中,EAT 主要包括第一次访问内存从页表中获得页框号,以及第二次访问内存获得所需要的文件内容这两部分。在引入快表后,第一次访存时间以一定概率被替换成访问快表的时间,这个概率称之为快表命中率,即每次地址变换能直接从快表中获得页框号的几率。采用合适的调度算法,可以将快表的命中率控制在 90% 以上,而快表的访问时间远远低于访存时间,从而使得内存的有效访问时间大大减小。

27.下列措施中,能加快虚实地址转换的是( )。
I. 增大快表(TLB)
II. 让页表常驻内存
III. 增大交换区
A. 仅 I
B. 仅 II
C. 仅 I、II
D. 仅 II、III

27.【参考答案】 C
【解析】增大快表可以提高快表命中率,从而减少访存次数,所以 I 正确。页表常驻内存可以提高查询页表的速度,从而加速转换,所以 II 正确。增大交换区是内存不够用时的手段,与加速地址转换无关。所以 III 错误。

        【举例】假设系统访问快表用时 2μs,访问页表用时 500μs,快表的命中率为 90%,计算该系统访问一个逻辑地址的 EAT。

        快表和页表串行访问:(2+500)×0.9+(2+500+500)×0.1=552μs

        快表和页表并行访问:(2+500)×0.9+(500+500)×0.1=551.8μs

若不使用快表,该系统的EAT=1000μs。可见,快表的引入较大地提高了系统的访存效率。

        【提示】实际上这里的快表机制与组成原理中的 Cache 方法是十分相似的,考生可以将二者放在一起阅读学习,并且也可与后续的虚拟内存结合在一起分析对比。

17.以下对分页存储管理方式的描述中,正确的是( )。
I. 在不使用快表(TLB)的分页存储管理方式中(不考虑多级页表),CPU 每次取指令都需要访问两次内存
II. 分页存储管理方式不会产生外部碎片,但会产生内部碎片
III. 分页存储管理方式对用户是不透明的
IV. 分页存储管理方式不能采用静态重定位
A. I、II、IV
B. I、IV
C. 仅 I
D. 全都正确

17.【参考答案】 A
【解析】分页存储管理方式对用户透明,分段存储管理方式对用户不透明,所以 III 错误。不使用快表时,CPU 取指令需要先访问一次内存中的页表获得物理地址,之后再访问一次内存存取相应指令,I 正确。分页存储管理方式不存在外部碎片,但在进程最后一页会存在内部碎片,II 正确。分页存储管理方式下,进程装入内存后可能会改变位置,不能采用静态重定位,IV 正确。

41.某系统采用分页式存储管理方式,以下关于该系统的说法中正确的有( )。
I. 分页存储系统不会产生外部碎片,但是会产生内部碎片
II. 若该计算机系统不使用快表(TLB),且页表只有一级,则进程访问内存数据时,需要进行至少两次内存访问
III. 分页存储管理系统可以采用静态重定位方式
IV. 分页存储管理系统中的页面概念对用户是透明的
A. I、II
B. II、III
C. 全部
D. I、II、IV

41.【参考答案】 D
【解析】分页存储管理方式下,进程装入内存后可能会改变位置,不能采用静态重定位,所以 III 错误。I、IV 正确。分页存储不用 TLB 时至少需要一次访存查页表,和一次访存取数据,所以 II 正确。

(4) 两级和多级页表
        如前所述,操作系统在进程的 PCB 中记录页表起始地址和大小,这意味着系统默认页表只有一页,但当进程较大时页表也会很大,页表本身也需要被划分为许多页,这些用来存储页表的页在内存中同样会是分散不连续的,此种情况下只在 PCB 中记录页表的起始地址将行不通。此外,现如今大多数家用计算机都是 64 位机器,大多使用 48 位二进制数表示程序的逻辑地址。如果页的大小为 4KB,每个页表项长 8B,那么每个进程的页表都会占据惊人的248B/4KB×8B=512GB。这显然是无法接受的。

        因此设计者需要通过二级页表的组织形式来映射这些较大的程序,以及减少对内存的占用。内层页表是程序文件的索引,外层页表是内层页表的索引,PCB 中记录的内容也就相应更改为外层页表的起始地址。当然这依旧要求外层页表只能有一页,否则需要继续向上叠加索引,最终保证最外层页表只有一页。

57.【2014】下列选项中,属于多级页表优点的是( )。
A. 加快地址变换速度
B. 减少缺页中断次数
C. 减少页表项所占字节数
D. 减少页表所占的连续内存空间

57.【参考答案】 D
【解析】多级页表需要对各级页表分别进行一次查询,降低了地址变换速度。页面的缺页与内存容量、内存进程数以及置换算法相关,而多级页表并不能影响页面的缺页,且若多级页表未被调入内存,反而会增加缺页次数。页表项字段数量和各字段大小都与多级页表不相关,所以减小页表项大小不是多级页表的优点。多级页表中,外层页表索引内层页表,从而令内层页表可以不连续存放,所以减少了页表所占的连续空间。

        如图 3.18 所示,外层页表与内层页表都是逻辑地址到物理地址的映射。二者的主要区别在于外层页表所指向页框中的内容是内层页表,而内层页表所指向页框中的内容是程序文件。

        使用二级页表组织形式时,逻辑地址可被分割为图 3.19 所示的三部分。使用页目录号从外层页表中获得包含所需内层页表项的页框,再根据页号获得包含所需内容的页框,后续步骤则与单级页表无异。当然,使用二级页表组织形式时,外层页表依旧可能很大,但设计者可以像套娃一样不断向上叠加页表层次,直到最高层页表不大于一个页面,这就是多级页表。

56.【2010】某计算机采用二级页表的分页存储管理方式,按字节编址,页大小为2^10字节,页表项大小为 2 字节,逻辑地址结构如下图所示。逻辑地址空间大小为2^16页,则表示逻辑地址空间的页目录表中表项的个数至少是( )。

A. 64
B. 128
C. 256
D. 512

56.【参考答案】 B
【解析】一页可以放2^10/2=2^9个页表项,而逻辑地址空间大小为2^16页。页表最多可占2^16/2^9=2^7页。因此页目录表至少要能存2^7=128个表项,这样才能保证一定能记录所有页表。

        【提示】在叙述多级页表时,不方便直接使用外层与内层来描述页表层次。所以在接下来的内容中,将页表按层次由内到外依次命名为 1 级至 n 级页表
        需要注意的是,在题目中判断页表相对层次时,需要根据题目中出现的明确表述或者是地址结构形式。因为上述命名只是出于方便考虑,并无统一规定。但就 21 年 408 真题的第 29 题来说,未作说明应当以最内层作为 1 级页表。

61.【2021】在采用二级页表的分页系统中,CPU 页表基址寄存器中的内容是( )。
A. 当前进程的一级页表的起始虚拟地址
B. 当前进程的一级页表的起始物理地址
C. 当前进程的二级页表的起始虚拟地址
D. 当前进程的二级页表的起始物理地址

61.【参考答案】 B
【解析】页表寄存器应当存放多级页表中最外层页表的起始物理地址。这里 408 中的命名是将最外层称为一级页表,所以应当选择 B。

        而本文是以最内层作为 1 级页表来做叙述的,这是因为这一命名方式下,改变页表总层次时,内层页表名称不会产生变更,有利于笔者描述计算过程和考生理解多级页表的机制。

        接下来以 16GB(逻辑地址共 34 位)的程序文件为例做一次具体的计算。假设系统按字节编址,页面大小为 4KB,页表项大小为 4B,那么该程序文件共分为16GB/4KB=4M页。同样可以计算出一个页面所能存入的页表项为4KB/4B=1K个,因此页表应占据4M/1K=4K页。将页表使用二级页表索引起来,则共有4K/1K=4页二级页表。因此系统应当进一步使用三级页表来索引二级页表,三级页表只有一页,其中包含有四个页表项目,分别指向四个存储有二级页表的页框。

        多级页表的内存访问有效时间与一级页表情况下的计算过程是相似的。前面分析中一级页表需要一次访问内存查找页表的时间,那么从二级页表的机制可知,二级页表是一级页表的页表,即二级页表需要有两次访问内存查页表的时间,更高级别的时间只需类推即可。如上一段例子所述,该例中存在三级页表,则需要三次访问内存查页表时间,得到物理地址后再访问一次内存获得数据,全程共四次访问内存。

        【提示】假设页表有 n 级,访问 n ~ 2 级页表都是在获得其低一级页表中对应页面的页框号。而访问 1 级页表获得的则是所需内容存储位置的页框号,这时将该页框号与逻辑地址的页内偏移量组合在一起得到的就是所需内容的物理地址。最后需要根据该物理地址再进行一次内存访问,从而获得所需要的程序内容。

60.【2019】某计算机主存按字节编址,采用二级分页存储管理,地址结构如下图所示。虚拟地址 20501225H 对应的页目录号、页号分别是( )。

A. 081H、101H
B. 081H、401H
C. 201H、101H
D. 201H、401H

60.【参考答案】 A
【解析】将虚拟地址转换为 2 进制形式:0010 0000 0101 0000 0001 0010 0010 0101。取出前十位转回 16 进制即是页目录号:00 1000 0001 = 081H。取出中间对应页号的十位转回 16 进制即是页号:01 0000 0001 = 101H。

42.计算机系统按字节编址,采取分页存储管理方式管理内存。虚拟地址 64 位,页面大小为 4KB,页表的页表项大小为 4B。据此可以计算出该系统需要将页表组织成( )级。
A. 4
B. 5
C. 6
D. 7

42.【参考答案】 C
【解析】页面数=2^64B/4KB=2^52,一页可存放的页表项数=4KB/4B=2^10。所以应组织成⌈52/10⌉=6级。

23.系统按字节编址,采用分页式存储管理方式管理内存。在该系统中逻辑地址空间大小 256TB,页表项大小 8B,页面大小 4KB。请问系统页表组织需要使用( )级页表。
A. 2
B. 3
C. 4
D. 5

23.【参考答案】 C
【解析】一个页面中能装入的页表项数N=4KB/8B=512=2^9。逻辑地址空间页面数M=256TB/4KB=2^36个。最外层页表只能占一页,所以需要⌈36/9⌉=4级页表。C 正确。

29.系统按字节编址,采用请求分页存储方式管理内存,系统的逻辑地址空间大小为2^48B,页面大小为2^13B,页表项大小为 8B,则该系统页表的级数应当是( )。
A. 5
B. 3
C. 4
D. 2

29.【参考答案】 C
【解析】一个页面中能装入的页表项数N=213B/8B=210。逻辑地址空间页面数M=248B/213B=235个。最外层页表只能占一页,所以需要⌈35/10⌉=4级页表。C 正确。

28.系统按字节编址,采用分页式存储管理方式管理内存,逻辑地址结构如下图所示。假设逻辑地址空间大小为2^26B,页面大小为2^10B,页表项大小为 2B。问该系统的页目录表中至少需要包含多少个页表项( )。

A. 32
B. 128
C. 64
D. 256

28.【参考答案】 B
【解析】本题采用两级页表,一个页面可放置页表项数N=2^10/2=2^9,逻辑地址空间页数M=2^26/2^10=2^16。所以页表大小为2^16/2^9=2^7页。因此页目录表中应有2^7=128个表项。

3. 分段存储管理方式

        先前所介绍的这些内存管理方式都由操作系统来完成,其对工作于操作系统之上的用户来说是透明的。分段存储管理方式虽然在方法设计上与分页存储管理方式大同小异,但因其分段大小划分的灵活性,可以较好地满足用户在编程和使用上的自组织需求,也因如此,这个方式对于用户来说是不透明的。

        【提示】计算机系统中的透明一词的意思是指该过程对上层用户不可见。上层用户无需关注其实现细节,只需要知道该过程实现了什么功能,怎么使用这一功能即可。

        我们容易将透明理解为某一过程的上层遮挡物是透明的,从而将某一过程透明理解为对上层用户可见。实际上这里的透明与不透明指的是该过程本身而不是其上层遮挡物,所以透明是指某一过程对上层用户不可见,就好像该过程穿上了隐身衣一般。

34.在分页式存储方式中,页面这一概念是( )。
A. 对链接程序不透明,对操作系统透明
B. 对编译系统不透明,对操作系统透明
C. 对用户透明,对操作系统不透明
D. 对链接程序透明,对用户透明

34.【参考答案】 C
【解析】分页存储管理方式对操作系统不透明,对运行在操作系统之上的程序及工作在其上的编程人员透明。

(1) 分段存储管理方式的特点
        分段系统是指将程序(逻辑地址)划分为大小不等的块,这些块称为段。分段管理方式方便用户编程,利于编程人员组织程序的逻辑结构。该方式最根本的优点便是其管理方式的动态性和段的逻辑单位性,以下具体介绍其特点及优势之处。

36.对于采用分段式存储管理方式的计算机系统来说,以下相关描述中正确的是( )。
A. 程序分段对装入程序是可见的,程序如何分段在装入时决定
B. 程序分段对用户是可见的,程序如何分段在用户编程时决定
C. 程序分段对操作系统是可见的,程序如何分段在分配内存时决定
D. 程序分段对操作系统是可见的,程序如何分段在程序运行时决定

36.【参考答案】 B
【解析】程序分段对用户和操作系统都可见,但其分段多在用户编程时决定。

31.关于分段系统与分页系统的区别,描述不正确的是( )。
A. 页帧是信息的物理单位,段是信息的逻辑单位
B. 页和段的大小都是固定的
C. 分页对用户是透明的,分段对用户是可见的
D. 分段存储管理容易实现内存共享,分页存储管理较难实现内存共享

31.【参考答案】 B
【解析】页的大小是预先固定的,并且每一页大小相同,但段的大小是不定划分的,每个段的大小也不一定相同,B 错误。页帧是物理内存上的单位,是信息的物理单位,段是信息逻辑独立单位。分页由操作系统完成,分段需要编程人员划分,所以分页透明,分段不透明。由于段是独立逻辑单位,所以分段有利于共享,但分页中页不是。所以 A、C、D 错误。

(a) 方便编程
        汇编程序编写通常按照自身逻辑关系被划分为几个段,这与分段管理方式的逻辑地址空间形式十分契合,所以分段管理极大地便利了程序员的程序编写工作。
(b) 信息共享
        分段中的段不同于分页的页面,这里的段是一个有内容共性的逻辑单位体,这个特性有效提高了程序段的可复用性,多个进程可以方便地共享某段内存文件的内容。

        【提示】将段称为有内容共性的逻辑单位体是指每一个段都有其明确的完整作用,而不会像分页一样,完成某个内容的程序文件可能被分割在不同页中。

(c) 信息保护
        同样是因为程序段是一个逻辑单位的这一特性,系统可以方便地对特定的函数、数据等逻辑单位设定其读写方式和权限列表,有效保证进程的信息安全。
(d) 动态增长
        进程在运行的过程中,有部分内容会随着运行而增长,较为明显的就是数据段。这种情况下,分页存储管理方式比较适合预先分配,不利于应对这一状况,而分段系统中段长度可变,不需要确定各个段共同的固定大小,从而容易实现动态分配,可以较好地解决这一问题。
(e) 动态链接
        动态链接中,为了提高内存的利用率,系统只将进程当前需要用到的程序内容装入内存。对于实现这种动态链接的程序而言,该程序是一边运行一边进行链接的,其链接单元应当是一个个实现某一功能的独立逻辑单位,这恰符合分段管理方式中段的划分原则。所以分段管理方式十分利于实现动态链接。

19.以下内存管理方式中,最适合采用动态链接的是( )。
A. 单一连续分配管理方式
B. 分段存储管理方式
C. 固定分区管理方式
D. 分页存储管理方式

19.【参考答案】 B
【解析】分段存储管理方式中每个段都是一个独立的逻辑单位,程序中完成某一功能的代码不会被分割在不同段中,方便需要时动态链接。选 B 选项。

(2) 分段系统的基本原理
(a) 地址结构
        如图 3.20 所示,分段管理方式中,程序文件被划分为一个个逻辑单元,每个逻辑单元单独成段。所以,与分页系统相似,其地址结构由段号和段内地址两部分组成。

55.【2009】一个分段存储管理系统中,地址长度为 32 位,其中段号占 8 位,则最大段长是( )。
A. 2^8字节
B. 2^16字节
C. 2^24字节
D. 2^32字节

55.【参考答案】 C
【解析】逻辑地址共 32 位,去掉 8 位段号,剩下 24 位表示段内地址,最多表示224字节,这同时也就是最大段长。

30.采用分段存储管理的系统,若地址用 24 位表示,其中 8 位表示段号,则允许每段的最大长度是( )。
A. 2^16
B. 2^24
C. 2^28
D. 2^32

30.【参考答案】 A
【解析】段内偏移量所占位数 = 地址位数 - 段号位数=24−8=16。所以最大段长为2^16。

(b) 段表
        由于段与段之间的大小并不相等,所以想要记录一个段的信息必须要有两个变量,通常以段长和起始地址作为记录变量。如图 3.21 所示,段表中记录了从段号到(段长,起始地址)数据对的映射,所以一个段表项应要同时包含以上三个信息,其中的段号隐含在段表项与段表起始地址的相对位置中(段表项的大小是相等的)。

        段表项中包含该段在内存中的起始地址和段长两个数据项,而其段号为该表项在段表中所处的位置次序。(段表项从 0 开始依次编号 )

(c) 地址变换机构
分段存储管理方式的地址变换机构如图 3.22 所示。地址转换过程如下:
        ① 将逻辑地址的高位段号取出,与段表长作比较,段号大于表长则越界。
        ② 若未越界,则找到相应段表项,将段长与逻辑地址低位的段内偏移量比较,若偏移量大于段长则越界。
        ③ 若未越界,则将段表项中的段起始地址与逻辑地址的段内偏移量组合起来,获得对应的物理地址。

37.在采用分段式存储管理方式的计算机系统中,从 CPU 给出逻辑地址到取得内存中相应的数据,这一过程中总共需要进行( )次内存访问。
A. 1
B. 2
C. 3
D. 4

37.【参考答案】 B
【解析】分段需要一次访问内存查询段表,获得物理地址后再访问一次内存获取数据。共两次。选择选项 B。

(d) 段的共享与保护
        段的保护:由于分页与分段的保护方式大致相同,在此做统一说明。分页和分段的主要保护方式都为界地址保护和存取控制保护。
        界地址保护通过逻辑地址与段(页)表信息的比较来防止进程的越界访问。在分页方式中,将页号与页表的长度做比较,若页号 > 页表长度则产生越界中断。需要说明的是分页方式的页内偏移量与页表大小严格对应,不会造成越界。在分段方式中,段号和段内偏移量需要同时显性给出,判断访问是否越界也需要进行两次:1)若段号 ≥ 段表长度,则产生越界中断。2)查询段表时,若段内偏移量 > 段长,则产生越界中断。

58.【2016】某进程的段表内容如下表所示。当访问段号为 2、段内地址为 400 的逻辑地址时,进行地址转换的结果是( )。

A. 段缺失异常
B. 得到内存地址 4400
C. 越权异常
D. 越界异常

58.【参考答案】 D
【解析】段号为 2,所以查询到段表的第 3 行(编号由 0 开始)。比较段内地址和段长,发现段内地址 > 段长,所以产生了越界异常。

        存取访问控制通过对进程段(页)进行访问权限设置以保护其信息。系统内存中的段页设置只读、读 / 写、不可访问等限制,访问相关页面时进行权限检查。

        段的共享:实现段共享时,除了每个进程自身的段表外,系统还设置了一个供相关进程共同使用的共享段表。如图 3.23 所示,共享段表的表项中除记录该共享段的物理地址等相关信息外,还设置了一个 count 字段用于记录共享该段的进程数。

        当P1​进程与P2​进程共享段S时,段S在内存中只有一份,P1​与P2​的段表中对该共享段的记录与正常段相同,二者分别有一个段表项记录该段的物理地址。同时共享段表中也会有一个表项记录段S的物理地址等信息,并记录共享段S的进程数及相关信息。需要注意的是,段S的物理地址是唯一的,但其在P1​和P2​中的逻辑地址是不同的。自然,段S在P1​段表、P2​段表与共享段表中的段号是不一定相同的,三者没有必然关联。

59.【2019】在分段存储管理系统中,用共享段表描述所有被共享的段。若进程P1​和P2​共享段S,下列叙述中,错误的是( )。
A. 在物理内存中仅保存一份段S的内容
B. 段S在P1​和P2​中应该具有相同的段号
C. P1​和P2​共享段S在共享段表中的段表项
D. P1​和P2​都不再使用段S时才回收段S所占的内存空间

59.【参考答案】 B
【解析】段共享时,内存中只保留一份段 S 的内容,共享段表中记录该段的物理地址和共享该段的进程数等相关信息。共享进程P1​和P2​的段表中各有一个表项指向该物理内存位置。二者各自对应的段表项所指向的物理空间位置相同,但逻辑地址不一定相同,即段号是不一定相同的。所以 B 选项错误,A、C 选项正确。被共享的段,在共享段表中记录的共享该段的进程数为 0 时才回收该段的内存空间。D 选项正确。

        由于共享段被多个进程共享,在其中某一个进程释放该段时,系统并不会直接调出该段,而是将共享段表中的 count 减去 1。只有当共享段的 count 减至 0 时,系统才会将该段调出内存。

        【提示】在相关教材中,称分页的地址空间是一维的,而分段的地址空间是二维的。容易令考生产生困惑的是:分页与分段的地址结构都被分为页(段)号和页(段)内偏移量两个部分,而二者的空间维度却不同。
        从这两种方式的地址结构来看,它们都由两个变量组合而成,所以看上去都是二维空间。而之所以分页的地址空间为一维,是由于页号和页内偏移量并不是两个独立变量。我们可以只给出某一数据在逻辑地址空间中的相对位置这一个变量,根据页面大小来直接计算出数据处于的页号和页内偏移量。而分段系统中的段大小不等,所以段号和段内偏移量这两个变量是独立的,必须显性给出。
        例如,8086 CPU 就使用了分段式内存管理,其程序计数器 PC 就保存在 CS 和 IP 两个寄存器中,写作 CS:IP。CS(Code Segment,代码段寄存器)存储代码段的地址,IP(Instruction Pointer,指令指针寄存器)存储下一条指令在代码段中的段内偏移。这就是 “二维” 的体现。

22.页式存储管理方式、段式存储管理方式和段页式存储管理方式这三者的虚拟地址空间维度依次是( )。
A. 一维、一维、二维
B. 一维、二维、二维
C. 一维、二维、一维
D. 二维、一维、一维

22.【参考答案】 B
【解析】页式存储管理方式中页大小相同,页号和页内偏移量可直接通过逻辑地址计算得出,地址空间是一维的。而分段式和段页式中的段号和段内地址都要显式给出,地址空间是二维的。

4. 段页式存储管理方式

        如图 3.24 所示,段页式存储管理方式是分页式存储管理方式和段式存储管理方式的结合。段页式存储管理方式先将进程空间分段,再对进程空间的每一段进行分页,所以进程空间被划分的最小单位仍旧是页,这些页分属于进程的某一段。按此逻辑,物理内存空间也应当是要被划分为与页具有相同大小的内存块,实际上也确实如此。

(1) 地址结构
        如图 3.25 所示,段页式存储方式的地址结构由高位部分的段号、中间部分的页号和低位部分的页内偏移量三个部分共同组成。

(2) 地址变换机构
        段页式存储方式需要为整个进程提供一个段表,并为每一个段提供一个页表。如图 3.26 所示,地址变换过程如下:
(a) 用虚拟地址中的段号部分到段表中进行查询,获得该段号对应页表的首地址。
(b) 通过该首地址找到相应的页表。
(c) 用虚拟地址中的页号部分到页表中进行查询,获得该页号所对应的内存块号。
(d) 使用该内存块号与虚拟地址中页内偏移量拼接获得对应的物理地址。

        虽然段页式存储管理方式结合了分页式存储方式和分段式存储方式,克服了分段式的外部碎片问题。但该方式相较于页式存储管理方式来说,具有更多的内存碎片,且需要段表和大量的页表,实现复杂。所以,各种内存管理方式都有其适用的场合。

44.在内存管理中,内存利用率高且保护和共享容易的是( )方式。
A. 分区存储管理
B. 分页存储管理
C. 分段存储管理
D. 段页式存储管理

44.【参考答案】 D
【解析】分页存储有效解决了外部碎片问题,内存利用率高。分段存储系统的段具有独立逻辑单位性,易于共享和保护,但存在外部碎片。段页存储系统结合了分页和分段的优点,不存在外部碎片,内存利用率高,且易于共享和保护。

        【提示】段页式内存管理方式中,每个进程只有一张段表,但页表可能不只一张。每一个段都拥有一张页表,页表数与段数相同。

25.在下列内存管理方式中,会产生内部碎片的有( )。
I. 分段存储管理
II. 动态分区存储管理
III. 请求分页存储管理
IV. 段页式存储管理
A. I、II
B. I、II、III
C. 仅 I
D. III、IV

25.【参考答案】 D
【解析】分页存储管理方式中,进程的最后一页可能出现内部碎片。段页式存储管理方式中,段内的最后一页可能出现内部碎片。其他两种方式不存在内部碎片,所以选择 D。

3.1.4 习题精编

1.在以下四条与存储管理相关的叙述中,正确的一条是( )。
A. 虚拟内存管理方式需要有对应的硬件支持才能实现
B. 在虚拟存储系统中,作业的编址空间只与磁盘空间大小有关
C. 在多用户的分时系统中,用户平分所有的内存空间
D. 限制内存分配是内存保护的目的

1.【参考答案】 A
        【解析】A 选项。虚存大小与磁盘和内存容量和以及系统的寻址空间都有关系,B 错误。分时系统中用户划分的是时间,C 错误。内存保护的目的是防止进程之间的互相干扰,D 选项错误。

2.下列对存储管理目的的相关叙述中,完整且正确的是( )。
A. 增加物理内存实际容量
B. 方便用户和提高物理内存的利用率
C. 方便用户且增加物理内存实际容量
D. 提高物理内存的利用率

2.【参考答案】 B
【解析】存储管理的目的是提高物理内存的利用率并且方便用户使用,所以 B 正确。

3.在多道程序环境中,用户程序的相对地址与装入内存后的实际物理地址不同,把相对地址转换为物理地址,这个功能是( )的。
A. 进程调度
B. 设备管理
C. 地址重定位
D. 资源管理

3.【参考答案】 C
【解析】在程序装入时,可采用地址重定位将程序内部相对地址重定位成物理内存中的绝对地址(物理地址)。C 正确。

4.在适合多道程序运行的分区存储管理系统中,存储保护是为了( )。
A. 防止多道作业占用同一处理机
B. 防止各道作业相互干扰
C. 防止一道作业占用多个分区
D. 防止作业非法访问磁盘文件

4.【参考答案】 B
【解析】内存保护通过界地址保护和访问权限设置的方式,防止用户进程对操作系统和用户进程对其他用户进程的干扰。所以内存保护的目的是防止进程之间的互相干扰,所以 B 正确。

5.内存管理的基本任务是提高内存的利用率,使多道程序能在不受干扰的环境中运行,这主要是通过下列哪种功能实现的( )。
A. 内存分配
B. 内存扩充
C. 内存保护
D. 对换

5.【参考答案】 C
【解析】内存保护通过界地址保护和访问权限设置的方式,防止用户进程对操作系统和用户进程对其他用户进程的干扰。所以内存保护的目的是防止进程之间的互相干扰,所以 C 正确。

6.采用动态重定位方式装入作业,在执行中允许( )将其移走。
A. 用户有条件地
B. 用户无条件地
C. 操作系统有条件地
D. 操作系统无条件地

6.【参考答案】 C
【解析】动态重定位是指 CPU 访问内存时由地址变换机构自动将相对地址转换为绝对地址。采用动态重定位装入方式时,进程装入后仍保持其相对地址,访问时再重定位转换。并且在必要的时候可以由操作系统有条件地将装入后的进程移走,所以 C 选项正确。

7.系统按字节编址,采用动态分区分配方式和最佳适应算法。某一时刻内存的使用情况如下图所示(操作系统从地址 0 开始存放),此时有一 85KB 的程序需要装入内存,则该程序分配到的分区首址为( )。

A. 100K
B. 190K
C. 330K
D. 410K

7.【参考答案】 B
【解析】最佳适配算法是指,每次都从可装入该程序的最小空闲区域中,划分出和该程序大小相等的内存空间给该程序。根据题目要求,要分配一个 85KB 大小的内存空间给该程序,其空闲分区首地址为100+80+10=190K。

8.计算机系统采用动态分区内存管理方式,某一时刻内存中存在五个空闲区域,按地址由低至高排列为:110KB、430KB、230KB、180KB 和 500KB。地址分配指针指向内存地址的起始点,接下来依次有 216KB、420KB、115KB 和 428KB 共四个进程将申请使用内存。以下算法中能够成功分配的是( )。
A. 首次适应算法
B. 最佳适应算法
C. 最坏适应算法
D. 邻近适应算法

8.【参考答案】 B
【解析】当使用首次适应算法和邻近适应算法进行分配时,会导致 430KB 的空闲分区分配给 216KB,使得后面的 420KB 和 428KB 的进程无法分配。最坏适应算法也会优先占据大的空闲分区,导致 420KB 和 428KB 的进程无法分配,最佳适应算法能够成功分配。

9.计算机系统按字节编址采用可变分区分配存储管理方法,用空闲分区表管理空闲分区,分配内存采用首次适应算法,并将分区的高地址部分分配出去。内存低地址部分的 200KB 由操作系统占据,用户区从 200K 开始,大小为 386KB,初始时为空。接下来一段时间里内存中进行了以下操作:进程 A 申请 80KB,进程 B 申请 56KB,进程 C 申请 120KB,进程 A 释放 80KB,进程 C 释放 120KB,进程 D 申请 156KB,进程 E 申请 81KB。问完成这些操作后内存中最小空闲块的大小为( )。
A. 56KB
B. 13KB
C. 12KB
D. 89KB

9.【参考答案】 B
【解析】目前已有的空闲分区为 200K~586K,大小为 386KB,在进程 A 申请 80KB,进程 B 申请 56KB,进程 C 申请 120KB 后,此时的空闲分区为 586K~456K = 130K。此后进程 A 释放 80KB,进程 C 释放 120KB,此时的空闲分区为 200K~280K,336K~586K 两个空闲分区,进程 D 申请 156KB 分配在 336K~586K 的空闲分区,满足进程 E 申请的 81KB 的空闲分区为 492K~586K,此时最小的空闲分区为 586K~573K = 13KB。

10.某计算机系统按字节编址采用动态分区存储管理方式,内存分配采用最佳适应算法。内存低 32MB 被操作系统占据,用户区大小为 55MB,初始为空。接下来一段时间里内存中进行了以下操作:进程 A 分配 15MB,进程 B 分配 30MB,进程 A 释放 15MB,进程 C 分配 8MB,进程 D 分配 6MB。问完成上述操作后内存中最大的空闲分区大小是( )。
A. 15MB
B. 7MB
C. 9MB
D. 10MB

10.【参考答案】 C
【解析】最佳适应算法,每次都从可装入该程序的最小空闲区域中,划分出和该程序大小最相近的空闲分区分配给该程序。当给进程 A 分配 15MB,进程 B 分配 30MB 后,空闲分区是 45M~55M,大小为 10MB,此时将进程 A 释放,再为进程 C 分配 8MB,进程 D 分配 6MB。根据最佳适配算法,进程 C 分配的 8MB 为 45M~55M 的空闲分区,进程 D 分配的 6MB 为 0M~15M 的空闲分区,此时的最大空闲分区为 15MB - 6MB = 9MB。

11.系统采用动态分区方式管理内存,空闲分区使用空闲分区表记录,问什么情况下回收一个空闲分区,反而会使得系统的空间分区数减少 1( )。
A. 有下邻空闲区但无上邻空闲区
B. 有上邻空闲区也有下邻空闲区
C. 无上邻空闲区也无下邻空闲区
D. 有上邻空闲区但无下邻空闲区

11.【参考答案】 B
【解析】有上邻空闲区也有下邻空闲区时,这三个分区会合成一个分区,所以最终总分区数减一。选项 B 正确。

12.在固定分区分配的方法中,每个分区的大小( )。
A. 相同
B. 随作业长度变化
C. 可以不同但预先固定
D. 可以不同但根据作业长度固定

12.【参考答案】 C
【解析】固定分区分配方法在初始化时就划分好分区,该方法的分区方式包括等分区和不等分区,所以选择 C。

13.在请求页面式管理中,缺页中断率与以下哪种( )因素有关。
A. 页表的位置
B. 置换算法
C. 外存管理算法
D. 进程调度算法

13.【参考答案】 B
【解析】选择调出页面的算法称为页面置换算法。好的页面置换算法会有较低的页面缺失率(缺页中断率)。页表的位置,外存管理算法,进程调度算法与缺页中断率无关。

14.采用动态分区算法回收内存时,如果回收分区仅与空闲分区链插入点的前一个分区相邻接,那么需要在空闲分区表中( )。
A. 增加一个新表项
B. 修改前一个分区表项的大小
C. 修改前一个分区表项的起始地址
D. 修改前一个分区表项的大小和起始地址

14.【参考答案】 B
【解析】当即将回收的空闲分区与前一个空闲分区相邻时,只需要在空闲分区表中,修改前一个空闲分区表项的大小即可。

15.在动态分区存储系统中,空闲表的内容如下:

        此时,进程 P 请求 50KB 内存,系统从第一个空闲块开始查找,结果把第 4 个空闲块分配给了进程 P。请问系统采用的分区分配算法是( )。
A. 首次适应法
B. 最佳适应法
C. 最差适应法
D. 循环首次适应法

15.【参考答案】 C
【解析】从第一个空闲块优先查找。若使用首次适应算法,小地址空闲块优先分配,则会把空闲块 1 分配给进程 P,A 错误。若使用最佳适应算法,最小块优先分配,则会把空闲块 3 分配给进程 P,B 错误。若使用最差适应算法,最大块优先分配,则会把空闲块 4 分配给进程 P,C 正确。若使用循环首次适应法,当前地址优先分配,则也会把空闲块 1 分配给进程 P,D 错误。

16.某系统采用固定分区分配存储管理,内存空间为 430K,其中地址 0 到 30K 被系统占用,其他空间按分区大小相等的方法划为 4 个分区,则当有大小分别为 7KB、90KB、30KB、20KB 的作业进入内存时,浪费的内存为( )。
A. 53KB
B. 200KB
C. 253KB
D. 280KB

16.【参考答案】 C
【解析】系统占据了 30KB 的内存空间,将余下的 400KB 等分成 4 个分区,每个分区大小为 100KB,在固定分区分配管理中,每个分区只装入一道作业,浪费的内存大小为(100−7)+(100−90)+(100−30)+(100−20)=253KB,选项 C 正确。

17.以下对分页存储管理方式的描述中,正确的是( )。
I. 在不使用快表(TLB)的分页存储管理方式中(不考虑多级页表),CPU 每次取指令都需要访问两次内存
II. 分页存储管理方式不会产生外部碎片,但会产生内部碎片
III. 分页存储管理方式对用户是不透明的
IV. 分页存储管理方式不能采用静态重定位
A. I、II、IV
B. I、IV
C. 仅 I
D. 全都正确

17.【参考答案】 A
【解析】分页存储管理方式对用户透明,分段存储管理方式对用户不透明,所以 III 错误。不使用快表时,CPU 取指令需要先访问一次内存中的页表获得物理地址,之后再访问一次内存存取相应指令,I 正确。分页存储管理方式不存在外部碎片,但在进程最后一页会存在内部碎片,II 正确。分页存储管理方式下,进程装入内存后可能会改变位置,不能采用静态重定位,IV 正确。

18.可以采用静态重定位的内存管理方式有( )。
I. 固定分区
II. 可变分区
III. 页式
IV. 段式
A. I、II、IV
B. I、IV
C. 仅 I
D. 全部

18.【参考答案】 C
【解析】固定分区方式中,程序装入后位置不再改变,可以采用静态重定位。其余三种方式均可能在运行过程中改变程序位置,不能采用静态重定位。所以只有 I 可以,选择 C 选项。

19.以下内存管理方式中,最适合采用动态链接的是( )。
A. 单一连续分配管理方式
B. 分段存储管理方式
C. 固定分区管理方式
D. 分页存储管理方式

19.【参考答案】 B
【解析】分段存储管理方式中每个段都是一个独立的逻辑单位,程序中完成某一功能的代码不会被分割在不同段中,方便需要时动态链接。选 B 选项。

20.下面关于内存保护的描述不正确的是( )。
A. 一个进程不能未被授权就访问另外一个进程的内存单元
B. 内存保护可以仅通过操作系统(软件)来满足,不需要处理器(硬件)的支持
C. 内存保护的方法有界地址保护和存储键保护
D. 一个进程中的程序不能跳转到另一个进程的指令地址中

20.【参考答案】 B
【解析】内存保护需要上下限寄存器或界地址寄存器和重定位寄存器的支持,需要硬件。所以 B 选项错误,A、C、D 均正确。

21.不会产生内部碎片的存储管理系统是( )。
A. 分页式存储管理
B. 固定分区式存储管理
C. 可变式存储管理
D. 段页式存储管理

21.【参考答案】 C
【解析】可变式分区管理方式中,进程需要多大的空间就划分出多大的内存分区给进程,所以不存在内部碎片。其他三种方式都存在内部碎片。选择 C 选项。

22.页式存储管理方式、段式存储管理方式和段页式存储管理方式这三者的虚拟地址空间维度依次是( )。
A. 一维、一维、二维
B. 一维、二维、二维
C. 一维、二维、一维
D. 二维、一维、一维

22.【参考答案】 B
【解析】页式存储管理方式中页大小相同,页号和页内偏移量可直接通过逻辑地址计算得出,地址空间是一维的。而分段式和段页式中的段号和段内地址都要显式给出,地址空间是二维的。

23.系统按字节编址,采用分页式存储管理方式管理内存。在该系统中逻辑地址空间大小 256TB,页表项大小 8B,页面大小 4KB。请问系统页表组织需要使用( )级页表。
A. 2
B. 3
C. 4
D. 5

23.【参考答案】 C
【解析】一个页面中能装入的页表项数N=4KB/8B=512=2^9。逻辑地址空间页面数M=256TB/4KB=2^36个。最外层页表只能占一页,所以需要⌈36/9⌉=4级页表。C 正确。

24.以下对分页存储管理方式中页面大小的说法中正确的是( )。
I. 选择较大的页面可以降低页表的大小,提高有效数据存储密度
II. 选择较小的页面可以减少内部碎片,从而更充分地利用内存空间
III. 选择较大的页面可以减小页表,并减少内部碎片,所以页面越大越好
A. I、II
B. I、II、III
C. I
D. II、III

24.【参考答案】 A
【解析】进程最后一页中会产生平均半页的内部碎片,选择较小的页面时,可以减小这一内部碎片浪费。选择较大的页面可以降低页表的大小,提高有效数据存储密度。但页面太大会增加内部碎片,造成内存空间的浪费。所以应当选择大小均衡的页面大小,而不是越大越好。所以 I、II 正确,III 错误。

25.在下列内存管理方式中,会产生内部碎片的有( )。
I. 分段存储管理
II. 动态分区存储管理
III. 请求分页存储管理
IV. 段页式存储管理
A. I、II
B. I、II、III
C. 仅 I
D. III、IV

25.【参考答案】 D
【解析】分页存储管理方式中,进程的最后一页可能出现内部碎片。段页式存储管理方式中,段内的最后一页可能出现内部碎片。其他两种方式不存在内部碎片,所以选择 D。

26.某具有请求调入和页面置换功能的存储器中,CPU 给出逻辑地址到其被转换为物理地址的这一段过程中,不会出现以下哪一种情况( )。
A. 缺页
B. 访问权限错误
C. 地址越界
D. 内存溢出

26.【参考答案】 D
【解析】地址变换时若内存中无需要访问的页则造成缺页。当页(段)号大于页(段)表长度,会造成越界。当指令执行的操作与页面权限不符则会产生访问权限错误。所以 A、B、C 都有可能发生。而内存溢出是不会发生的,所以选择 D。

27.下列措施中,能加快虚实地址转换的是( )。
I. 增大快表(TLB)
II. 让页表常驻内存
III. 增大交换区
A. 仅 I
B. 仅 II
C. 仅 I、II
D. 仅 II、III

27.【参考答案】 C
【解析】增大快表可以提高快表命中率,从而减少访存次数,所以 I 正确。页表常驻内存可以提高查询页表的速度,从而加速转换,所以 II 正确。增大交换区是内存不够用时的手段,与加速地址转换无关。所以 III 错误。

28.系统按字节编址,采用分页式存储管理方式管理内存,逻辑地址结构如下图所示。假设逻辑地址空间大小为2^26B,页面大小为2^10B,页表项大小为 2B。问该系统的页目录表中至少需要包含多少个页表项( )。

A. 32
B. 128
C. 64
D. 256

28.【参考答案】 B
【解析】本题采用两级页表,一个页面可放置页表项数N=2^10/2=2^9,逻辑地址空间页数M=2^26/2^10=2^16。所以页表大小为2^16/2^9=2^7页。因此页目录表中应有2^7=128个表项。

29.系统按字节编址,采用请求分页存储方式管理内存,系统的逻辑地址空间大小为2^48B,页面大小为2^13B,页表项大小为 8B,则该系统页表的级数应当是( )。
A. 5
B. 3
C. 4
D. 2

29.【参考答案】 C
【解析】一个页面中能装入的页表项数N=2^13B/8B=2^10。逻辑地址空间页面数M=2^48B/2^13B=2^35个。最外层页表只能占一页,所以需要⌈35/10⌉=4级页表。C 正确。

30.采用分段存储管理的系统,若地址用 24 位表示,其中 8 位表示段号,则允许每段的最大长度是( )。
A. 2^16
B. 2^24
C. 2^28
D. 2^32

30.【参考答案】 A
【解析】段内偏移量所占位数 = 地址位数 - 段号位数=24−8=16。所以最大段长为2^16。

31.关于分段系统与分页系统的区别,描述不正确的是( )。
A. 页帧是信息的物理单位,段是信息的逻辑单位
B. 页和段的大小都是固定的
C. 分页对用户是透明的,分段对用户是可见的
D. 分段存储管理容易实现内存共享,分页存储管理较难实现内存共享

31.【参考答案】 B
【解析】页的大小是预先固定的,并且每一页大小相同,但段的大小是不定划分的,每个段的大小也不一定相同,B 错误。页帧是物理内存上的单位,是信息的物理单位,段是信息逻辑独立单位。分页由操作系统完成,分段需要编程人员划分,所以分页透明,分段不透明。由于段是独立逻辑单位,所以分段有利于共享,但分页中页不是。所以 A、C、D 错误。

32.某系统使用 32 位逻辑地址,页大小为 4Kbytes,以及 36 位物理地址。那么该系统中的页表大小为( )。
A. 2^20个页表项
B. 2^24个页表项
C. 2^4个页表项
D. 2^12个页表项

32.【参考答案】 A
【解析】逻辑地址空间大小为2^32B,页大小为4KB=2^12B,所以共有2^32B/2^12B=2^20页,因此页表有2^20个页表项。

33.一个进程的页表如下表所示,页的大小为 1024B。指令 MOV AX,[2586] 中地址 2586(十进制)对应的物理地址是( )。

A. 2586
B. 10240
C. 10778
D. 31258

33.【参考答案】 C
【解析】页号=⌊2586/1024⌋=2,页内偏移量=2586%1024=538。2 号页面对应 10 号物理块,该物理块起始地址为10×1024=10240,所以物理地址为10240+538=10778,选 C。

34.在分页式存储方式中,页面这一概念是( )。
A. 对链接程序不透明,对操作系统透明
B. 对编译系统不透明,对操作系统透明
C. 对用户透明,对操作系统不透明
D. 对链接程序透明,对用户透明

34.【参考答案】 C
【解析】分页存储管理方式对操作系统不透明,对运行在操作系统之上的程序及工作在其上的编程人员透明。

35.在分页式存储管理方式的计算机系统中,用于组织页面的页表的起始地址一般存放在( )。
A. 快表(TLB)
B. 页表寄存器(PTR)
C. 物理内存
D. 虚拟内存

35.【参考答案】 B
【解析】分页存储管理方式中每个进程的页表起始地址存放在各自的 PCB 中,当进程上处理机时,将页表起始地址调入 PTR。

36.对于采用分段式存储管理方式的计算机系统来说,以下相关描述中正确的是( )。
A. 程序分段对装入程序是可见的,程序如何分段在装入时决定
B. 程序分段对用户是可见的,程序如何分段在用户编程时决定
C. 程序分段对操作系统是可见的,程序如何分段在分配内存时决定
D. 程序分段对操作系统是可见的,程序如何分段在程序运行时决定

36.【参考答案】 B
【解析】程序分段对用户和操作系统都可见,但其分段多在用户编程时决定。

37.在采用分段式存储管理方式的计算机系统中,从 CPU 给出逻辑地址到取得内存中相应的数据,这一过程中总共需要进行( )次内存访问。
A. 1
B. 2
C. 3
D. 4

37.【参考答案】 B
【解析】分段需要一次访问内存查询段表,获得物理地址后再访问一次内存获取数据。共两次。选择选项 B。

38.在采用段页式存储管理方式的计算机系统中,从 CPU 给出逻辑地址到取得内存中相应的数据,这一过程中总共需要进行( )次内存访问。
A. 1
B. 2
C. 3
D. 4

38.【参考答案】 C
【解析】段页式需要一次内存访问来查询段表,获得该段页表起始地址,随后访问内存查询该页表。获得物理地址后,访问内存获取数据。共三次。

39.以下对分页式存储管理方式的叙述中正确的是( )。
A. 计算机系统中只有一张页表,页表起始地址存放在寄存器中
B. 计算机系统中只有一张页表,页表起始地址存放在进程 PCB 中
C. 计算机系统为每一个进程都创建一张页表,每个进程都有专属寄存器存放页表起始地址
D. 计算机系统为每一个进程都创建一张页表,页表起始地址存放在各自进程的 PCB 中,运行时被写入寄存器

39.【参考答案】 D
【解析】分页存储管理方式中每个进程的页表起始地址存放在各自的 PCB 中,当进程上处理机时,将页表起始地址调入 PTR。选 D。

40.某虚拟存储器的逻辑地址空间大小为 512 页,页大小为 4KB,且该存储器的物理地址空间大小为 64 页。则逻辑地址和物理地址分别是多少位( )。
A. 9,18
B. 9,6
C. 21,6
D. 21,18

40.【参考答案】 D
【解析】页内偏移量位数=log2​4K=12,页号位数=log2​512=9,页框号位数=log2​64=6。所以逻辑地址位数=9+12=21,物理地址位数=6+12=18。

41.某系统采用分页式存储管理方式,以下关于该系统的说法中正确的有( )。
I. 分页存储系统不会产生外部碎片,但是会产生内部碎片
II. 若该计算机系统不使用快表(TLB),且页表只有一级,则进程访问内存数据时,需要进行至少两次内存访问
III. 分页存储管理系统可以采用静态重定位方式
IV. 分页存储管理系统中的页面概念对用户是透明的
A. I、II
B. II、III
C. 全部
D. I、II、IV

41.【参考答案】 D
【解析】分页存储管理方式下,进程装入内存后可能会改变位置,不能采用静态重定位,所以 III 错误。I、IV 正确。分页存储不用 TLB 时至少需要一次访存查页表,和一次访存取数据,所以 II 正确。

42.计算机系统按字节编址,采取分页存储管理方式管理内存。虚拟地址 64 位,页面大小为 4KB,页表的页表项大小为 4B。据此可以计算出该系统需要将页表组织成( )级。
A. 4
B. 5
C. 6
D. 7

42.【参考答案】 C
【解析】页面数=2^64B/4KB=2^52,一页可存放的页表项数=4KB/4B=2^10。所以应组织成⌈52/10⌉=6级。

43.在分页存储管理系统中,页表内容如下表所示 (均从 0 开始编号)。若页面大小为 4KB,则地址转换机构将逻辑地址 0 转换成物理地址( )。

A. 8192
B. 4096
C. 2048
D. 1024

43.【参考答案】 A
【解析】页面大小4KB=4096B,逻辑地址 0 对应页号 0,查表知该页存放在 2 号物理块。2 号物理块的起始地址为4096×2=8192,页内偏移量为 0。故物理地址为 8192 。

44.在内存管理中,内存利用率高且保护和共享容易的是( )方式。
A. 分区存储管理
B. 分页存储管理
C. 分段存储管理
D. 段页式存储管理

44.【参考答案】 D
【解析】分页存储有效解决了外部碎片问题,内存利用率高。分段存储系统的段具有独立逻辑单位性,易于共享和保护,但存在外部碎片。段页存储系统结合了分页和分段的优点,不存在外部碎片,内存利用率高,且易于共享和保护。

45.下列关于分页和分段的描述,正确的是( )。
A. 分段是信息的逻辑单位,段长由系统决定
B. 分段引入的主要目的是实现分散分配并提高主存利用率
C. 分页是信息的物理单位,页长由用户决定
D. 分页系统中,页面在物理内存中只能从页面大小的整数倍地址开始存放

45.【参考答案】 D
【解析】段式管理系统按照用户的设定去划分逻辑地址空间,段长由用户决定,选项 A 错误。分页是信息的物理单位,页长由系统决定且大小固定,选项 C 错误。分页的主要目的是为了实现离散分配,提高内存利用率,选项 B 错误。在页式存储管理中,将虚拟内存空间和物理内存空间划分为大小相同的页面,因此,页面在物理内存中只能从页面大小的整数倍地址开始存放,选项 D 正确。

46.在采用分页存储管理的系统中,地址结构长度为 18 位,其中 11 至 17 位表示页号,0 至 10 位表示页内偏移量,则主存容量最大可为( )KB,主存可分为( )个块。若有一作业依次被放入 2、3、7 号物理块,相对地址 1500 处有一条指令 “store 1,12500”,那么,该指令地址所在页的页号为 0,指令的物理地址为( ),该指令数据的存储地址所在页的页号为( )。
A. 256、256、5596、7
B. 256、128、500、7
C. 256、128、5596、6
D. 256、128、5500、6

46.【参考答案】 C
【解析】由题意可知,共有 7 位来表示页号,因此共有2^7个页面,页面大小为2^11B(2KB),主存最大容量为2^7×2KB=256KB,在分页存储管理系统中,内存块数 = 页面数=2^7。由于该指令所在页的页号为 0,其分配的物理块号为 2,采用的是相对地址,所以该指令的物理地址 = 基地址 + 相对地址=2×2KB+1500=5596。该指令数据的存储地址为 12500,其所在页的页号为12500/2KB=6,选项 C 正确。

47.某计算机按字节编址,并从 0 开始进行编号,采用动态分区管理的方式来管理空闲区,采用空闲分区表来记录空闲区。其主存中的用户区大小为 60MB(初始为空),分配时优先分配到空闲区的小地址部分。分配和释放的操作序列为:分配 20MB,分配 12MB,分配 4MB,分配 15MB,释放 12MB,分配 8MB,释放 15MB,分配 6MB。已知空闲分区表的表项为 <分区始址,分区大小>,则当执行完操作后:
(1) 若采用的是首次适应(First Fit)算法,请画出此时的空闲分区表?
(2) 若采用的是最佳适应(Best Fit)算法,请画出此时的空闲分区表?

47.【参考答案】
(1) 由题知,分配时优先分配到空闲分区的小地址部分,采用首次适应算法,会将符合分区大小的低地址部分分配出去,见表 3.6。

(2) 由题知,采用最佳适应算法时,会将空闲分区按大小进行排序,在进行分配时,查找已排好序的空闲分区链,找到第一个能满足大小的空闲分区,见表 3.7。

表 3.7 最佳适应算法

分区起始地址

分区大小

59M

1MB

26M

6MB

36M

15MB

48.计算机系统按字节编址,存储器采用分页式存储管理方式,内存被划分为 64B 大小的内存块,进程 A 的大小为 702B。进程页表如下表 (a) 所示,进程快表如下表 (b) 所示。请分别说明系统遇到八进制逻辑地址 0205,0645,0723,02311 时的处理过程。

48.【参考答案】
        注意该逻辑地址为八进制逻辑地址。
        当访问 0205 时,对应的二进制地址为:00 1000 0101B,由于内存块大小 64B,故低 6 位为块内地址,其页号为 2,访问快表得到其块号为 F3,将块号和页内地址合成,访问其物理地址。
        访问 0645 时,对应的二进制地址为:01 1010 0101B,其页号为 6,访问快表缺失,访问页表得到其块号为 FA,将块号和页内地址合成,访问其物理地址。
        访问 0723 时,对应的二进制地址为:01 1101 0011B,其页号为 7,访问快表缺失,访问页表得到其块号为 FB,将块号和页内地址合成,访问其物理地址。
        访问 02311 时,地址越界。

49.在一个分页存储管理系统中,地址空间分页 (每页 1KB),物理空间分块,设主存总容量是 256KB,描述主存分配情况的位示图如图 3.27 所示 (0 表示未分配,1 表示已分配) 此时作业调度程序选中一个长为 5.2KB 的作业投入内存。试问:
(1) 为该作业分配内存后 (分配内存时,先分配低地址的内存空间),填写该作业的页表内容。
(2) 页式存储管理有无内存碎片存在?若有,会存在哪种内存碎片?为该作业分配内存后,会产生内存碎片吗?如果产生,那么大小为多少?
(3) 假设一个 64MB 内存容量的计算机,采用页式存储管理 (页面大小为 4KB),内存分配采用位示图方式管理,请问位示图将占用多大的内存?

49.【参考答案】
(1) 页面大小为 1KB,由题意可知,作业大小为 5.2KB,管理系统为该作业分配 6 个页面。根据位示图可得,前 6 个空闲块号为 21、27、28、29、34、35。
(2) 页式存储管理会存在内部碎片。因为该作业的大小为 5.2KB,需要为其分配 6 个页面,最后一个页面会产生0.8KB的内部碎片。
(3) 64MB 内存,页面大小为 4KB,共有2^14个页面,位示图通过 1bit 表示 1 个页面,共需要2^14个 bit,也就是2^14/8=2KB大小的内存来表示位示图。

3.1.5 真题演练

50.【2009】分区分配内存管理方式的主要保护措施是( )。
A. 界地址保护
B. 程序代码保护
C. 数据保护
D. 栈保护

50.【参考答案】 A
【解析】分区分配内存管理方式的主要保护措施是界地址保护。为保证进程之间互不干扰,每个进程拥有自己独立的内存空间,其他进程不可以随意访问。通过设置界地址寄存器来检测进程访问是否越界。

51.【2011】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是( )。
A. 编辑
B. 编译
C. 链接
D. 装载

51.【参考答案】 C
【解析】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是链接。

52.【2010】某基于动态分区存储管理的计算机,其主存容量为 55MB (初始为空),采用最佳适配 (Best Fit) 算法,分配和释放的顺序为:分配 15MB,分配 30MB,释放 15MB,分配 8MB,分配 6MB,此时主存中最大空闲分区的大小是( )。
A. 7MB
B. 9MB
C. 10MB
D. 15MB

52.【参考答案】 B
【解析】最佳适配算法是指,每次都从可装入该程序的最小空闲区域中,划分出和该程序大小相等的内存空间给该程序。经过题述的分配释放过程后,此时有开头15−6=9MB和末尾 2MB 两个空闲区域。所以答案选 B。过程如下图所示。

53.【2017】某计算机按字节编址,其动态分区内存管理采用最佳适应算法,每次分配和回收内存后都对空闲分区链重新排序。当前空闲分区信息如下表所示。

回收起始地址为 60K、大小为 140KB 的分区后,系统中空闲分区的数量、空闲分区链第一个分区的起始地址和大小分别是( )。
A. 3、20K、380KB
B. 3、500K、80KB
C. 4、20K、180KB
D. 4、500K、80KB

53.【参考答案】 B
        【解析】回收分区的起始地址是 60K 与起始地址为 20K 的分区相邻,回收分区的尾部地址是60+140=200K与起始地址为 200K 的分区相邻。所以应当将这三个分区合并成一个起始地址为 20K,大小为 380KB 的空闲分区。所以系统中此时存在三个空闲分区。
        题目说明了,每次回收内存后都对空闲分区链重新排序。根据题目给出的空闲分区信息可以看出,空闲分区链是按照分区大小升序排序的。所以第一个即是最小的分区,该分区的起始地址为 500K 大小为 80KB。

54.【2019】在下列动态分区分配算法中,最容易产生内存碎片的是( )。
A. 首次适应算法
B. 最坏适应算法
C. 最佳适应算法
D. 循环首次适应算法

54.【参考答案】 C
【解析】最佳适应算法总是从符合装入程序大小的空闲区域中选择最小的分配出去,最为容易产生外部碎片。

55.【2009】一个分段存储管理系统中,地址长度为 32 位,其中段号占 8 位,则最大段长是( )。
A. 2^8字节
B. 2^16字节
C. 2^24字节
D. 2^32字节

55.【参考答案】 C
【解析】逻辑地址共 32 位,去掉 8 位段号,剩下 24 位表示段内地址,最多表示224字节,这同时也就是最大段长。

56.【2010】某计算机采用二级页表的分页存储管理方式,按字节编址,页大小为2^10字节,页表项大小为 2 字节,逻辑地址结构如下图所示。逻辑地址空间大小为2^16页,则表示逻辑地址空间的页目录表中表项的个数至少是( )。

A. 64
B. 128
C. 256
D. 512

56.【参考答案】 B
【解析】一页可以放2^10/2=2^9个页表项,而逻辑地址空间大小为2^16页。页表最多可占2^16/2^9=2^7页。因此页目录表至少要能存2^7=128个表项,这样才能保证一定能记录所有页表。

57.【2014】下列选项中,属于多级页表优点的是( )。
A. 加快地址变换速度
B. 减少缺页中断次数
C. 减少页表项所占字节数
D. 减少页表所占的连续内存空间

57.【参考答案】 D
【解析】多级页表需要对各级页表分别进行一次查询,降低了地址变换速度。页面的缺页与内存容量、内存进程数以及置换算法相关,而多级页表并不能影响页面的缺页,且若多级页表未被调入内存,反而会增加缺页次数。页表项字段数量和各字段大小都与多级页表不相关,所以减小页表项大小不是多级页表的优点。多级页表中,外层页表索引内层页表,从而令内层页表可以不连续存放,所以减少了页表所占的连续空间。

58.【2016】某进程的段表内容如下表所示。当访问段号为 2、段内地址为 400 的逻辑地址时,进行地址转换的结果是( )。

A. 段缺失异常
B. 得到内存地址 4400
C. 越权异常
D. 越界异常

58.【参考答案】 D
【解析】段号为 2,所以查询到段表的第 3 行(编号由 0 开始)。比较段内地址和段长,发现段内地址 > 段长,所以产生了越界异常。

59.【2019】在分段存储管理系统中,用共享段表描述所有被共享的段。若进程P1​和P2​共享段S,下列叙述中,错误的是( )。
A. 在物理内存中仅保存一份段S的内容
B. 段S在P1​和P2​中应该具有相同的段号
C. P1​和P2​共享段S在共享段表中的段表项
D. P1​和P2​都不再使用段S时才回收段S所占的内存空间

59.【参考答案】 B
【解析】段共享时,内存中只保留一份段 S 的内容,共享段表中记录该段的物理地址和共享该段的进程数等相关信息。共享进程P1​和P2​的段表中各有一个表项指向该物理内存位置。二者各自对应的段表项所指向的物理空间位置相同,但逻辑地址不一定相同,即段号是不一定相同的。所以 B 选项错误,A、C 选项正确。被共享的段,在共享段表中记录的共享该段的进程数为 0 时才回收该段的内存空间。D 选项正确。

60.【2019】某计算机主存按字节编址,采用二级分页存储管理,地址结构如下图所示。虚拟地址 20501225H 对应的页目录号、页号分别是( )。

A. 081H、101H
B. 081H、401H
C. 201H、101H
D. 201H、401H

60.【参考答案】 A
【解析】将虚拟地址转换为 2 进制形式:0010 0000 0101 0000 0001 0010 0010 0101。取出前十位转回 16 进制即是页目录号:00 1000 0001 = 081H。取出中间对应页号的十位转回 16 进制即是页号:01 0000 0001 = 101H。

61.【2021】在采用二级页表的分页系统中,CPU 页表基址寄存器中的内容是( )。
A. 当前进程的一级页表的起始虚拟地址
B. 当前进程的一级页表的起始物理地址
C. 当前进程的二级页表的起始虚拟地址
D. 当前进程的二级页表的起始物理地址

61.【参考答案】 B
【解析】页表寄存器应当存放多级页表中最外层页表的起始物理地址。这里 408 中的命名是将最外层称为一级页表,所以应当选择 B。

【2013】某计算机主存按字节编址,逻辑地址和物理地址都是 32 位,页表项大小为 4 字节。请回答下列问题:
(1) 若使用一级页表的分页存储管理方式,逻辑地址结构如下:

则页的大小是多少字节?页表最大占用多少字节?
(2) 若使用二级页表的分页存储管理方式,逻辑地址结构如下:

设逻辑地址为 LA,请分别给出其对应的页目录号和页表索引的表达式。
(3) 采用 (1) 中的分页存储管理方式,一个代码段起始逻辑地址为 0000 8000H,其长度为 8KB,被装载到从物理地址 0090 0000H 开始的连续主存空间中。页表从主存 0020 0000H 开始的物理地址处连续存放,如下图所示 (地址大小自下向上递增)。请计算出该代码段对应的两个页表项的物理地址、这两个页表项中的页框号以及代码页面 2 的起始物理地址。

62.【参考答案】

        1.页内偏移量占 12 位,按字节编址,所以页大小为2^12B=4KB。页号占 20 位,所以最多有2^20页,意味着需要2^20个页表项,每个页表项 4B,所以页表最多占2^20×4B=4MB。

        2.页目录号:((unsigned int) LA)/4M,页表索引号:((unsigned int) LA>>12)%1K。

        3.由题目给的图可知,页框号 1 对应的这个页表项的页面被装入到 0090 0000H (页框号:00900H),所以该页为题目所述逻辑地址为 0000 8000H 的页面。0000 8000H 的页号为高 20 位,即 0 0008H = 8 页。所以此页面对应表项为页表的第 8 项,可计算出物理地址 1 为 0020 0000H + 8×4 = 0020 0020H。
        页框号 2 在页框号 1 的下一页,故页框号 2 为 00900H + 1H = 00901H。
        物理地址 2 与物理地址 1 相差一个表项,所以物理地址 2 为 0020 0020H + 4 = 0020 0024H。
        代码页面 1 与代码页面 2 相差一个页面,所以物理地址 3 为 0090 0000H + 4K = 0090 1000H。

3.2 虚拟内存管理

3.2.1 虚拟存储器概述

1.虚拟存储器的引入
        前面我们提到了游戏《古剑奇谭・梦付千秋星垂野》,该游戏程序有 35GB 大,但却只需要 8GB 的内存就可以正常运行。这是因为现在的计算机系统大多实现了虚拟存储器的机制。在这种机制下,系统只需要将进程的部分页面调入内存,待需要使用不在内存中的页面时,再将相应的页面调入即可。
        本节内容之前所介绍的一系列连续或不连续的内存管理方式,可以统称为传统内存管理方式。在传统内存管理方式中,设计者的主要关注点在于如何去提高内存的利用率,但这些方法需要将程序全部装入内存,所以不论如何提高利用率,系统所能支持的并发进程数始终受内存空间大小限制
        随着计算机相关产业的发展,软件越来越大,需要处理的数据也越来越多,内存大小的增长速度却远不及此,计算机系统可支持的进程并发数大幅下降,甚至出现有的程序比内存更大而导致无法运行的情况。
        所以从硬件上提高内存大小以满足软件需求变得越来越不现实。设计者需要从其他角度去寻求方法来解决这一问题,虚拟存储器这一技术便是一种优秀的解决方案。

2.虚拟存储器概念
        虚拟存储器是一种从逻辑上扩充内存的方法,具有请求调入功能和置换功能
        具体来说,由于程序并不需要一次性全部调入内存就能运行,所以可以在采用非连续存储管理方式的基础上,只调入程序文件的一部分页面进入内存,当进程需要用到未调入内存的程序文件页时,再从磁盘中调入,这一过程就是请求调入。当请求调入遇到内存已满的情况时,系统需要从内存中选择一部分暂时用不上的页面调出,腾出的空间用来调入当前需要的页面,这一过程称为内存置换。
        内存置换和请求调入都由操作系统完成,在上层用户的眼中,这些并发程序的所有页面好像都被装入了内存之中,内存空间也就在逻辑上被扩大了。这个虚拟存储器即是一种逻辑上的内存空间(这与非连续分配中引入的逻辑空间是一样的,只是它的大小不再受限于内存,而是受限于内存和外存的容量和)。这样所形成的虚拟存储器大小与较大的外存相近,而运行速度与较快的内存相近。
        【提示】虚拟存储器理论上的最大容量由 CPU 的寻址范围决定,而虚拟存储器的实际容量 = MIN (CPU 寻址范围,内存和外存的容量之和)。

3.局部性原理
        我们知道从外存中调入文件是比较耗费时间的,如果每次访问内存都需要进行磁盘调入,CPU 将花费大量的时间来等待磁盘 I/O。这种情况下,虚拟存储器的运行速度退化为接近于外存的水平,那么虚存就失去了意义。不过幸运的是,在采取合适的置换策略时,需要进行磁盘调入的内存访问占比是很小的,这一切都归功于软件程序所具有的局部访问特性,也就是著名的局部性原理。
        局部性原理是指 CPU 的访问在一段时间内局限于程序文件中的几个部分,可以将其细分为时间局部性和空间局部性。
        时间局部性:被访问过一次的内存区域(如指令、变量、数组)在未来通常会被多次访问。
        空间局部性:若一块内存区域被访问,则其附近的内存在未来通常也会被访问。

        局部性原理的存在,主要是由于程序中存在大量的循环和顺序结构。处于循环中的元素,将被按照一定的时间周期被不断访问,即存在时间局部性。循环遍历时相邻元素会被依次访问,即存在空间局部性。程序语句不出现跳转,每一条指令都将会按顺序执行,这些被连续执行的指令多是被连续存储的,即形成了空间局部性。

3.2.2 请求分页存储管理方式

        请求分页存储管理方式是虚拟存储器的最常用实现方法,该方法是指在分页管理的基础上,增加请求调入和内存置换两个功能。
        为了实现请求分页存储管理方式,系统需要提供请求页表机制、缺页中断机构和地址变换机构的硬件支持。

1.请求页表机制
        如图 3.28 所示,请求页表在传统页表的基础上增加了状态位、访问字段、修改位和外存地址四个新字段,用于支持请求调入和内存置换的功能实现。其中用于支持请求调入的状态位和外存地址是必须要有的,而修改位和访问字段则需要根据具体的写回策略和置换策略是否需要来决定。

        状态位:用以标记该逻辑地址页面是否存在于内存中,用以支持请求调入。
        访问字段:在状态位为真时有效,用以标记该逻辑地址页面在最近是否有被访问(其修改策略由内存置换算法决定),用以支持各种内存置换策略。
        修改位(脏位):在状态位为真时有效,用以标记该逻辑地址页面被调入内存后是否有被修改过。修改位的主要意义在于:页面有修改时,将导致该页面在磁盘与内存中的内容存在区别,则当该页被调出时需要写磁盘。因为写磁盘的代价较大,所以在有些置换算法中,会考虑优先调出未被修改的页面。
        外存地址:用以记录该页面在外存中的地址。发生缺页中断时,系统根据该地址从外存中调入相应页面。
2. 缺页中断机构
        CPU 访问的页面不存在于内存中时,会产生缺页中断来调入相应的页面。缺页中断作为中断的一种,与一般中断具有相同的流程。
缺页中断也有其特别之处:
        (1) CPU 在每条指令的执行周期结束之后(中断周期),才会去处理那些在此之前触发的一般中断。而对于缺页中断来说,当其在执行周期内被触发后,CPU 就会开始对其进行处理。这样才能保证所需访问的页面被及时调入内存,否则指令将无法正常执行。
        【提示】CPU 对一条指令的取出和执行的过程总和被称为指令周期,指令周期又可以细分为取指周期、间址周期、执行周期和中断周期。一般的中断过程会被延迟到最后的中断周期来执行,但像缺页中断这种会阻碍指令执行的中断则需要立即处理。
        (2) 在一条指令的执行过程中缺页中断能被多次触发,所以相关硬件机构需要能记录多次中断的 CPU 状态,以便结束之后能被恢复。
        【提示】某条指令所要访问的几个数据可能分别在不同的页面,若这些页面都未被调入内存,则在一条指令的执行期间就会发生多次缺页中断。
3. 地址变换机构
        请求分页系统的地址变换过程如图 3.29 所示。该流程与传统分页系统的主要区别就在于加入了缺页中断流程,即图中左半部分。

请求分页形成物理地址的流程如下:
        (1) 系统按照传统分页管理方式进行地址转换,若快表命中,则可直接从快表中取出该页面的页框号,若快表未命中则检查页表。
        (2) 检查页表时若页面存在于内存中,则在页表中取出相应页框号。
        (3) 检查页表时若页面不在内存,则需要进行缺页中断处理。当页面被成功调入内存后,系统获得页框号并修改快表。
        (4) 最后将页框号和页内偏移量拼接成相应的物理地址。
        通过以上流程对逻辑地址的拆分转换,获得逻辑页号对应的物理页号,再将物理页号与页内偏移量拼接在一起,这样就获得了相应的物理地址。
        【提示】上述流程较为综合地描述了地址变换过程,考生可以尝试结合存储部分已讲述的内容,详细地理解阅读该流程。最好是能做到自己独立画出该流程,这对地址变换的细节性问题及综合性大题将会有较大的帮助。
        对于参加 408 统考的考生,可以尝试在学过计算机组成原理的 Cache 部分内容后,按照自己的理解将其整合进这张流程图中。可参考 2018 年 408 真题第 44 题。

3.2.3 页框分配

1.页框分配数的影响
        缺页率:系统访问内存时缺页的次数与总访问次数的比值。
        请求分页存储管理系统中不需要将进程的所有文件一起调入,那应该为一个进程分配多大的空间合适呢?要解决这个问题,需要综合考虑到系统的并发率和系统的缺页率。
        符合直觉的是,提供越多的页框给一个进程,该进程的缺页率整体来说应当要下降,但是过高的页框分配数又会导致系统的并发率下降。所以我们需要采取合适的内存分配策略来选择一个均衡的页框分配数。
        【提示】驻留集指系统为进程分配的页框集合,若题目中说明某一进程的驻留集是 n,即说明系统为该进程分配了 n 个页框。注意与工作集的概念做区分。

2.内存分配策略
        内存分配策略分为固定分配和可变分配两种,固定分配是一种事先的估算分配,可以是对每一个进程都分配同样的页框数量,也可以是根据进程大小来分配不同的页框数量。
        由于影响进程所需页框数的因素过多,要事先获得合适的页框数十分困难,所以可变分配在大多数时候更加有效。可变分配是在初始分配结束后,观察进程的运行情况,再据此对分配数量做调整。
        当进程的所有页框被占满时就需要进行页面置换,这又可以分为全局置换和局部置换两种。局部置换是指置换操作只能作用于隶属于本程序的物理块上,而全局置换是指置换操作可作用在系统所保留的空闲物理块及任意用户程序下属的物理块上,系统会先分配保留的空闲物理块,若无该类空闲物理块时,则从内存中选择一页换出,这一页可属于任意用户程序。
        将分配与置换组合成一个整体则有如下三种策略。
        (1) 固定分配局部置换:为每个进程分配固定数量页框,页面置换也只在这些页框上进行。
        【提示】由于全局置换一定会导致进程所拥有的页框数量变化,所以不存在固定分配全局置换的策略。
        (2) 可变分配局部置换:该方式与固定分配局部置换在置换权限方面相同,二者都只能在进程所拥有的页框中进行置换,这可以有效保护进程之间互不干扰。但在分配角度,这一策略会根据进程运行情况增加或减少分配给进程的页框数。
        (3) 可变分配全局置换:系统可以维护一个空闲页框队列,每当有程序发生缺页时就为其分配一个空闲页框。当不存在空闲页框时,就从整个内存空间中选出一个合适的页面换出。这样便简单有效地实现了可变分配和全局置换。

3.调入策略
页面调入操作存在着何时调入页面与从何处调入页面这两个问题:
(1) 何时调入页面
        (a) 预调页策略:由于进程的页面很多都是在磁盘空间中连续存储的,连续调入几个页面比分次调入要高效许多。并且根据局部性原理,相邻的页面很有可能在接下来被使用。所以可以在缺页中断时,将当前所需页面的相邻页面也一并调入。
        (b) 请求调页策略:该策略每次缺页中断只调入一个页面,I/O 频率较高。但其不存在无用调入页且实现简单,所以目前虚存大多用此策略。
(2) 从何处调入页面
        请求分页系统的外存除了普通的文件区外,通常还会设置一个特殊的对换区。文件系统中对外存文件的组织形式与内存相似,也存在大量的离散分配,I/O 时需要进行文件偏移到外存块地址的转换。而对换区不包含普通的文件系统,采取连续分配的组织形式,可以连续读写。因此避免了块地址转换开销的对换区,其 I/O 效率会比文件区更高一些。但对换区资源有限,需要系统按照不同的情况,采取合适的策略来合理使用这一资源。
        (a) 系统拥有足够多的对换区,则在进程运行前就将其所有文件拷贝到对换区,后续缺页中断时全都从对换区调入,以提高 I/O 效率。
        (b) 系统缺少足够多的对换区,则优先将更可能被修改的文件放入对换区。因为文件被修改过后,调出就需要写磁盘,连续写可以有效降低这一代价。而那些不可能被修改的文件,由于不需要写回磁盘,则直接从文件区调入。
        (c) UNIX 方式。未运行过的页面都存放在文件区并直接从文件区调入,换出的页面才放入对换区,后续再次用到时则从对换区调入。

3.2.4 页面置换方法

置换页面的完整过程可以概括为以下三步:

        ·根据当前为该进程分配的页框数和其已使用页框数,判断是否页框已满。根据相关策略,确定是否置换。当所有页框都已被使用:

                ·若为可变分配,则视情况选择额外分配页框或者置换。

                ·若为固定分配,则需要置换。

        ·确定置换范围:

                ·局部置换,只能从属于当前进程的页面中选取。

                ·全局置换,既可以从当前进程页面中选取,也可从其他用户进程页面中选取。

        ·按照一定的页面置换方法,选取一个合适的页面。
        其中,页面置换方法是置换功能的核心,其性能能直接决定了虚拟存储器的运行效率。下面来详细介绍这些算法。

1.最佳置换算法(Optimal page replacement algorithm,OPT )
        最佳置换算法是指在每一次置换中都把将来不会再使用或者最长时间不再使用的页面调出这是最高效的算法,但很明显的问题是,系统并不能预知接下来需要用到哪些页面,所以无法实现该算法。虽然这一算法不能实现,但其可以作为衡量调入算法性能的标杆。
        此方法相关习题在习题精编中有收录,见节末习题精编。

2.先进先出(First In First Out,FIFO)页面置换算法
        FIFO 算法是指每次置换都将最早被调入的页面调出内存。该算法是基于队列实现的,存在 Belady 异常。即在一定的情况下,增加为进程分配的页框数,缺页率反而会增加。如下例所示。
【举例】访问队列为:{1、2、3、4、1、2、5、1、2、3、4、5},按照分配页框数 3 和 4,分别计算缺页中断次数。
        (1) 分配 3 个页框时,如表 3.8 所示,最终结果是共发生了 9 次缺页中断。
        (2) 分配 4 个页框时,如表 3.9 所示,最终结果是共发生了 10 次缺页中断,这比只分配 3 个页框时还多出 1 次缺页中断,即发生了 Belady 异常。
        并且 FIFO 没有利用上局部性原理,其性能较差,所以几乎不会被使用。

3.最近最久未使用(Least Recently Used, LRU)置换算法
        LRU 算法是指将最长时间未被使用的页面置换出内存。
        最佳置换算法性能优秀,但无法实现,究其原因就在于无法预知未来有哪些页面将会被 CPU 访问。但可以将局部性原理运用于算法之中来预测未来一段时间较有可能被使用的页面有哪些。基于时间局部性,最近有被使用过的页面很有可能还会被使用,自然在做页面置换时应当将那些最久未被使用的页面换出内存。这就是我们所说的 LRU 置换算法。
        下面以一个例题来对 LRU 算法的执行过程做详细说明。
        【例 3.2】系统为某进程分配了 4 个页框,该进程已访问的页号序列为 2,0,2,9,3,4,2,8,2,4,8,4,5。若进程访问的下一页的页号为 7,依据 LRU 算法,应淘汰页的页号是( )。
A. 2
B. 3
C. 4
D. 8
        解:选 A。对于考查 LRU 算法的题目可以使用如下表格来进行解题。表格的最后一列描述的是当前页面被处理过后,内存中所存在的页面,并且这是一个按照最后访问时间排列好的队列。


处理当前页面从而生成最后一列内容的方式总结如下:
        ① 若当前页面已存在于内存中,则将当前页面调整至队尾,其他部分不变。
        ② 若当前页面不在内存中,则将当前页面加入到队尾,若加入当前页面后内存中页面数大于页框数,则将队头页面移除,该页面则为被置换出内存的页面。
        实际解题时主要需要记录的只有该表的最后一列,前三列是为了保证题解的清晰程度额外书写的。
        LRU 算法利用局部性原理,通过页面使用历史来对未来的页面使用做预测,需要使用页表项中的访问字段。虽然该算法没有最佳适应算法效果好,但其可实现,并且相比 FIFO 置换算法,LRU 的性能有了非常明显的提升。但是 LRU 算法实现困难,系统开销大。
        【拓展】LRU 算法可以用软件方式实现,也可以依靠硬件实现,但不论采用哪种方式其带来的系统开销都比较大。以下对这两种实现方式各举一简单例子来加以说明:
        软件方式实现:系统维护一个双向链表,表头是最近使用页面,表尾是最近最久未使用页面。这个链表在每次访问页面之后都需要进行更新。置换时,选择表尾页面换出。
        硬件方式实现:系统设置一个计数器,每个页面需要留出空间用来写入计数器的值。系统每执行一条指令计数器就加 1,并且将计数器中的数字写入页面的预留位置。置换时,遍历所有页面,找出记录计数器值最小的页面换出。

4.最少使用(Least Frequently Used, LFU)置换算法
        LFU 算法是指将最近使用次数最少的页面置换出内存
        LFU 算法与 LRU 算法的思想相同,其区别只在于,LRU 关注的是某一页面上一次使用的时间,而 LFU 关注的是页面在最近一段时间内的使用频率。

5.简单的时钟(Clock)置换算法
        时钟置换算法将所有页面链接成一个循环队列每个页面置一个访问位,每次该页面被访问到,都将访问位设为 1。当发生置换时,查询指针前进一位。若所指向的页面访问位为 0,则换出该页。若访问位为 1,则将其置为 0,且查询指针前进一位。循环往复直到找到第一个访问位为 0 的页面换出,实际上一次换出最多进行两轮扫描。
下面以一个具体的例题来帮助理解。
        【例 3.3】若某进程最多需要 6 页数据存储空间,操作系统采用固定分配局部置换策略为此进程分配 4 个页框。在时刻 260 前的该进程访问情况如表 3.10 所示(访问位即使用位 )。


        当该进程执行到时刻 260 时,要访问 5 号页内的数据。请回答:
        若采用时钟(CLOCK)置换算法,此次访问是否会发生缺页中断?其 5 号页面对应的页框号是多少?要求给出计算过程(设搜索下一页的指针沿顺时针方向移动,且当前指向 2 号页框,如图 3.30 所示)。
        解:页面 5 未被调入内存,所以会引发缺页中断以调入该页面。此时进程被分配到的页框只有 4 个,已被全部占满,需要进行页面置换。
根据 CLOCK 算法寻找换出页面,从 2 号页开始顺时针扫描。
(1) 指针指向 2 号页面,2 号页面访问位为 1,将访问位置 0 继续扫描。
(2) 指针指向 1 号页面,1 号页面访问位为 1,将访问位置 0 继续扫描。
(3) 指针指向 0 号页面,0 号页面访问位为 1,将访问位置 0 继续扫描。
(4) 指针指向 3 号页面,3 号页面访问位为 1,将访问位置 0 继续扫描。
(5) 指针指向 2 号页面,2 号页面访问位为 0,选择 2 号页面换出,扫描结束。
所以 5 号页面被装入到 2 号页面对应的 2 号页框中。
        LRU 算法的效果好,但是需要较多的硬件支持,实现起来也比较复杂。CLOCK 算法则是 LRU 的一种近似算法,它并不追求严格的最近最久未使用,可以认为是将最近较久未访问的页面换出。自然,CLOCK 算法实现起来相对较简单,不需要太多的硬件支持。

6.改进的时钟(Clock)算法
        未被修改的页面被调出时不需要进行写磁盘操作,置换代价更小,可考虑优先被置换。为此,可以在页表项中增加一个修改位,用来表示该页面在被调入内存之后是否有被修改过。将内存中的页面分为如下 4 类,并按照如下的优先级来选择调出页面(P 表示访问位,M 表示修改位 ):
(1) 第一类(P = 0, M = 0)页面:最近未被访问且未被修改,优先级最高。
(2) 第二类(P = 0, M = 1)页面:最近未被访问但被修改,优先级次之。
(3) 第三类(P = 1, M = 0)页面:最近有被访问但未被修改,换出优先级第三。
(4) 第四类(P = 1, M = 1)页面:最近有被访问且被修改,优先级最低。
        在具体的实现中,系统要寻找的是第一类(P = 0, M = 0)或第二类(P = 0, M = 1)页面,然后将其换出。最多将所有页面循环扫描四轮即可成功找到要换出的页面。具体流程如下:
第一轮:寻找第一类(P = 0, M = 0)页面,找到第一个即换出,未找到则进行第二轮。
第二轮:寻找第二类(P = 0, M = 1)页面,找到第一个即换出,并且每遇到一个非第二类(P = 0, M = 1)页面都将该页面的访问位置为 0,若未找到则进行第三轮。
        
第三轮:继续寻找第一类页面,找到第一个即换出,未找到则进行第四轮。

【提示】由于第二轮查找时修改了访问位,这一轮实际上所找的是最初的第三类页面。       
第四轮:继续寻找第二类页面,找到第一个即换出,这一轮的查找是一定能成功的。

【提示】由于第二轮查找时修改了访问位,这一轮所找的实际上是最初的第四类页面。

    

【提示】考生学到此处时,可先完成本节末习题精编部分的第 01~24 题,以巩固相关知识。

3.2.5 内存映射文件

        虚拟存储器解决了内存空间不足的问题,但这一机制同时也会给系统带来较多的 I/O 开销。如图 3.31 所示,若能使用内存映射文件(memory - mapped file)则可以对这一机制做进一步的完善。
        内存映射文件是指进程通过发起一个系统调用,实现从进程对应磁盘文件到其虚拟内存空间中某部分的映射。这一机制可以提升系统的 I/O 效率,从而减少虚拟存储器带来的 I/O 开销。

        【提示】想要了解内存映射文件为什么可以带来系统 I/O 效率的提升,考生需要了解设备管理部分关于 I/O 系统中内存交换缓冲区的内容。内存映射文件这部分知识并不影响考生接下来的学习,若考生暂时未能理解,大可先略过此节,待学习过内存交换缓冲区的内容后再学习此节内容。
        现在先对基本的 I/O 过程做一个简单介绍,I/O 指计算机主机与各种设备之间的通信过程,而各种外部设备的读取速度差距巨大,并且大多都与 CPU 的处理速度存在巨大的差距。为了缓解这一速度矛盾,系统在内存中开辟一块连续区域作为交换缓冲区,这块区域属于操作系统的内核部分。主机与设备之间需要传输的数据都统一先暂存到这片交换缓冲区中,待具有一定规模后再统一写出到设备或写入到用户区。
        所以在一般的 I/O 操作中,从磁盘调入的文件会先写入到交换缓冲区,然后再统一由 CPU 写入到用户区。有了这一概念之后,就可以开始介绍内存映射文件的具体步骤了。步骤如下:
        (1) 进程通过系统调用将文件映射到其虚拟内存空间的一部分,但实际上并未将这一文件调入到物理内存。
        (2) 进程需要访问该文件的内容时查询页表,发现映射的文件并未调入物理内存,产生缺页异常。
        (3) 从交换缓冲区寻找所需页面,若无则从磁盘调入相应页面。
        (4) 此后进程可使用指针直接对该文件进行操作,若写操作产生了脏数据,系统会自动在一段时间后将其写回磁盘。
        对比内存映射文件中读入文件的过程与一般的 I/O 操作调入文件的过程,我们可以看到内存映射文件跳过了其中写入交换缓冲区的这一步,改为直接将文件写入到映射到的物理内存之中,从而大大提高了系统的 I/O 效率。
        最后需要提到的是,当有多个进程映射到同一个文件时,它们将共用同一段物理内存。任意一个进程在该文件上的写入操作都可以迅速地被其他进程的读操作观察到,因此,这一方式也能为不同进程提供一个高带宽的通信通道。

3.2.6 虚拟存储器性能分析

1.访问内存的有效时间
        现在来分析一下请求分页式管理方式的访问内存有效时间。为了清晰起见,先考虑不使用快表的情况。
(1) 不考虑快表的情况
        请求分页式的访问内存有效时间可分为以下两种情况(考虑一级页表,且设访问内存时间为 α,处理缺页中断的时间为 β;CPU 处理速度远高于访存速度,故分析逻辑地址、获取页号和页内偏移量等 CPU 处理时间忽略不计):
(a) 若所访问的页面在内存中:
        ① 系统第一次访问内存中页表,获得访问页的物理地址,用时 α。
        ② 第二次访问内存,获得访问页,用时 α。
                                                                EAT=α+α                                                 (3.1)
(b) 若所访问的页面不在内存中:
        ① 访问内存中页表,发现访问页未调入内存,用时 α。
        ② 进行缺页中断处理(更新页表的操作已经包含在了其中),用时 β。
        ③ 获得物理地址后进行第二次访问内存,获得访问页,用时 α。
                                                               EAT=α+β+α
        现在引入缺页率概念,若缺页则时间的计算应当是第二种情况,反之则为第一种,从而可计算出系统的 EAT 计算公式如下(设缺页率为 f):
                                                EAT=(1−f)×(α+α)+f×(α+β+α)
化简如下:
                                                        EAT=2α+f×β
        即至少会有两次对内存的访问,而缺页中断只有在出现缺页时需要
(2) 考虑快表的情况
        加入快表之后的计算过程也与前述大致相同,详细如下(设快表访问时间为 ϵ):
(a) 访问页在内存且其页表项在快表中:
        ① 访问快表,获得访问页的物理地址,用时 ϵ。
        ② 访问内存,获得访问页,用时 α。
                                                                EAT=ϵ+α
(b) 访问页在内存,但其页表项未被调入快表:
        ① 系统访问快表,未命中,用时 ϵ。
        ② 访问内存中的页表,获得物理地址,用时 α。
        ③ 第二次访问快表对其进行修改,用时 ϵ。
        ④ 第二次访问内存,获得访问页,用时 α。
                                                                EAT=ϵ+α+ϵ+α
        【注意】这里是按照串行访问 TLB 和页表的情况进行计算的,但是对这二者的访问也可以设计为并行形式(访问快表的同时访问内存)。此时对快表的访问的用时就被包含在对内存的访问用时中,那么上述公式的第一个 ϵ 和第三个 ϵ 就应去掉(下面的公式也类似)。至于应当按哪种形式计算,考生应仔细阅读题目要求。
(c) 访问页不在内存中,自然快表也不能命中:
        ① 系统访问快表,未命中,用时 ϵ。
        ② 访问内存页表,发现访问页未被调入内存,用时 α。
        ③ 进行缺页中断处理,用时 β。
        ④ 页面被调入后修改快表,用时 ϵ。
        ⑤ 使用获得的物理地址访问内存获得访问页,用时 α。
                                                                EAT=ϵ+α+β+ϵ+α
考虑快表命中率(ρ)和虚存缺页率(f)后,系统 EAT 计算式如下:
                        EAT=ρ×(ϵ+α)+(1−ρ)×(1−f)×(ϵ+α+ϵ+α)+(1−ρ)×f×(ϵ+α+β+ϵ+α)
化简如下:
                                                        EAT=ϵ+α+(1−ρ)×(ϵ+α)+(1−ρ)×f×β
        公式的意义即为,第一次访问快表和获取访问页的这次访存都是必须的,当快表未命中时才会有访问内存中页表和修改快表的操作开销,而只有快表没有命中且缺页的情况下才需要进行缺页中断处理。
        【例 3.4】请求分页管理系统中,假设某进程的页表内容下表所示。

        页面大小为 4KB,一次内存的访问时间是 100ns,一次快表(TLB)的访问时间是 10ns,处理一次缺页的平均时间108ns(已含更新 TLB 和页表的时间),进程的驻留集大小固定为 2,采用最近最久未使用置换算法(LRU)和局部淘汰策略
        假设:① TLB 初始为空;② 地址转换时先访问 TLB,若 TLB 未命中,再访问页表(忽略访问页表之后的 TLB 更新时间);③ 有效位为 0 表示页面不在内存,产生缺页中断,缺页中断处理后,返回到产生缺页中断的指令处重新执行。若有虚地址访问序列 2362H、1565H、25A5H,请依次访问上述三个虚地址,各需多少时间?
        解:首先确定地址结构,由页面大小 4KB 知虚地址和物理地址的低 12 位是页内偏移量。其余高位为页号(页框号)。

        2362H:拆成页号 2H 和页内偏移量 362H。访问快表(初始为空)用时 10ns,未命中。访问页表用时 100ns,得到页框号 254H。将页框号和页内偏移量拼接成物理地址,访问物理地址用时 100ns。总用时 210ns。

        1565H:拆成页号 1H 和页内偏移量 565H。访问快表用时 10ns,未命中。访问页表用时 100ns,未命中,引发缺页中断用时108ns。缺页中断过程中,该进程的驻留集已满,需要进行页面置换。根据 LRU 算法,最近被访问的是 2 号页面,所以应当调出 0 号页面。调入页面后,重新执行访址指令:首先访问快表操作并且命中,其用时 10ns,其次访问物理地址用时 100ns。总用时108ns + 220ns。

        25A5H:拆成页号 2H 和页内偏移量 5A5H。访问快表用时 10ns,由于访问 2362H 时将 2 号页面信息调入了快表,所以命中获得页框号 254H。将页框号和页内偏移量拼接成物理地址,访问物理地址用时 100ns。总用时 110ns。

2.抖动与工作集
(1) 多道程序度与抖动
        在一定大小的内存中,调入越多的程序,系统的多道程序度就越高,但为每一个程序分配的内存块便少了。以系统的多道程序度为横坐标,CPU 的利用率为纵坐标绘制图 3.32。

        观察图 3.32,符合直觉的是,系统多道程序度越高,则处理器的空闲时刻越少。但从图中的后半段可看出,系统多道程序度高到一定程度后,CPU 利用率反而开始下降。
        这是因为系统出现了抖动现象,即单个进程分配到的内存块少于某个数目时(这个数目大致就是工作集大小),该进程的页面会频繁地进行换入换出,导致缺页率急剧升高。从访问内存的有效时间计算可以看出,系统访问效率与虚存的缺页率高度相关。所以,CPU 在系统出现抖动时,将会花费大量时间用以访存等待(缺页导致 I/O,访存时间大大增加)。
(2) 工作集
        为了降低系统的缺页率,并保证多道程序度,则需要找到合适的内存块分配数目。工作集所描述的概念是一个优秀的解决方案。
        工作集的概念由 Denning 提出,所描述的是在一段时间间隔内,某一进程实际所要访问页面的集合。对单个进程而言,工作集可以记为一个二元函数w(t,Δ),t 表示当前的时刻,Δ表示一段时间间隔,通常将这一段时间称为工作集的 “窗口尺寸”,即 t 在 t 时刻接下来的Δ长度的时间里,进程实际需要访问页面的集合。工作集模型认为,要想减少换页率、消除抖动,应当将一个应用程序的工作集同时保持在物理内存中。
        但系统并不能知道进程接下来究竟需要访问哪些页面。所以,这里与 LRU 算法一样,依旧是根据局部性原理,通过过去一段时间的访问情况来预测未来一段时间进程所需要访问的页面集合。所以我们在求工作集时,实际考虑的是(t−Δ,t)这段时间内的访问页面。
【例 3.5】某进程访问页面的序列如下图所示。

若工作集的窗口大小为 6,则在 t 时刻的工作集为( )。
A. 6, 0, 3, 2
B. 2, 3, 0, 4
C. 0, 4, 3, 2, 9
D. 4, 5, 6, 0, 3, 2
解:应选 A,t 时刻前访问的最后 6 个页面为{6,0,3,2,3,2},去掉重复的页面得到工作集{6,0,3,2}。
        【提示】题目中的工作窗口通常是使用访问的页面数量来衡量的,即假设页面均匀到来,则访问的页面数量可以对应表示一段时间。
(3) 抖动的预防方法
        为了保证系统的运行效率,系统需要采取相关的措施来预防抖动现象的发生,我们应主要了解如下三种方式:
        (a) 采取局部置换策略。
        (b) 利用工作集概念:即调入新作业时,需要利用工作集理论来确认该次调入是否会对系统缺页率产生较大影响。调入作业前应检查各个进程获得的内存块是否足够,若内存块不足则说明此次作业调入会明显增大系统缺页率,则此时不应调入新作业。
        (c) 跟踪缺页率并选择暂停进程:发现系统缺页率过高时,将一些进程挂起,释放内存空间并将其交给缺页率较高的进程使用。

3.2.7 计算总结与重难题剖析

        内存部分是操作系统的考查重点,本节旨在分析考题规律,总结答题技巧,以帮助考生在解题时做到游刃有余。

1.给定地址计算页号和页内偏移量的方式
        以页面大小 4KB(说明页内偏移量占低 12 位),虚拟地址空间 16MB(即虚拟地址共 24 位,同时说明页号占高 12 位),虚拟地址:8BC403H 为例。
(1) 转换为二进制,直接按所占位数拆开
        (a) 转换为二进制:1000 1011 1100 0100 0000 0011B。
        (b) 按位数拆开,页号:1000 1011 1100B = 8BCH,页内偏移量:0100 0000 0011B = 403H。
(2) 用虚拟地址除页面大小,商为页号,余数为页内偏移量

        编程语言形式为:(int) 8BC403H / 4KB = 8BCH,(int) 8BC403H % 4KB = 403H
(3) 将虚拟地址右移页内偏移量所占位数,得到的就是页号。等价于除法的商。
                                                8BC403H>>12=8BCH

2.地址变换
        地址变换是内存管理部分大题的主要考点,同时也是一大难点,这部分涉及多种数据结构的相关计算问题,408 考试中有时还会将其与计算机组成原理中的 Cache 部分结合考查。
        图 3.33 是一次完整的地址转换过程,若不涉及 Cache 内容,此后只需要根据获得的物理地址,做一次简单内存访问,便可取得相应数据。若涉及 Cache 内容,系统将先查询 Cache 中是否缓存有相应物理地址的数据,此查询过程与 TLB 相似,都涉及相联映射的内容。若 Cache 中不存在相应的数据,系统才会去内存中查询,并回改 Cache。对于 Cache,可以将其理解为一次 “缺页处理”,处理过程包含将页面数据调入 Cache 和 Cache 满时置换页面数据。

下面提供一个处理该类题目中部分固定内容的思路:
(1) 根据题目信息确定页面大小、逻辑(物理)地址空间大小从而确定逻辑地址结构和物理地址结构。
(2) 按照题目所给信息确定 Cache 和 TLB 的映射方式(是直接映射还是组相联映射,若是组相联则又是几路组相联),以确定组号字段与标记字段位数(对于 Cache,需要额外使用到 Cache 数据块大小信息)。
(3) 根据前两步分析的结果,按照图 3.33 的流程进行地址变换,获得物理地址。
(4) 获得物理地址后,转入查询 Cache 的流程。
3. 分析题目所给信息
        在分析地址变换相关问题时,要求考生能够充分收集到题目所给信息。这些信息可以通过以下两种方式获得:
(1) 文字信息
        (a) 由逻辑空间大小计算逻辑地址总位数,由物理空间大小计算物理地址总位数。
        【题目表述】假设题目表述是,计算机按字节编址,逻辑地址空间(进程)大小为 64MB,物理地址空间(内存)大小为 4GB。
【解题思路】
        ① 根据题目表述将数字转为 2 的幂形式:逻辑地址空间64MB=2^26B,物理地址空间4GB=2^32B。
        ② 根据其幂次形式可知,逻辑地址空间需要 26 位的 2 进制数来表示,物理地址空间需要 32 位的 2 进制数来表示。因此逻辑地址 26 位,物理地址 32 位。
(b) 由页面大小计算页内偏移量所占位数,并根据上一类计算中的信息得到页框位数和页号位数。
        【题目表述】计算机按字节编址,页面大小为 4KB。则据此可知页框大小也为 4KB(页框与页面大小相同)。
【解题思路】
        ① 据此将数字转为 2 的幂形式:逻辑地址空间64MB=2^26B,物理地址空间4GB=2^32B,页面 / 页框大小为4KB=212B。
        ② 根据其幂次形式可知,逻辑地址和物理地址的页内偏移量都占 12 位。(物理地址和逻辑地址的页内偏移量相互对应,数值和位数都相同)。
        ③ 根据 1 中信息可知,页号占26−12=14位,至此确定逻辑地址中高 14 位是页号,低 12 位是页内偏移量。同理,页框号占32−12=20位,至此确定物理地址中高 20 位是页框号,低 12 位是页内偏移量。
(c) 由页面大小和页表项大小计算单页可容纳的页表项。若涉及多级页表,则需要计算一个页面能够存放多少个页表项,以此确定多级页表的级数及页号部分的细分结构。
        【题目表述】计算机按字节编址,逻辑地址空间(进程)大小为 1GB (占 30 位),页面大小为 4KB (占 12 位),页表项大小为 4B。
【解题思路】
        ① 先计算进程文件页数M,1GB/4KB=256K页。
        ② 计算一个页面所能容纳的页表项数N,4KB/4B=1K个。
        ③ 计算页表所占据的页数S=⌈M/N⌉,⌈256K/1K⌉=256页。页表占据的页数不止 1 页,需要使用页目录表将其索引起来。
        ④ 计算页目录表所占页数I=⌈S/N⌉,⌈256/1K⌉=1页,页目录表只有 1 页,无需继续索引。
        ⑤ 计算页目录号位数。将S转成 2 的幂次方形式:256=2^8,由此可知页目录号占 8 位,页号占中间30−8−12=10位。
(d) 相联映射情况:与计算机组成原理结合考查时,需要计算相联映射对页号或物理地址的分割。
        ① 全相联:对于 TLB,则所有的页号都作为标记字段。对于 Cache,根据 Cache 数据块大小计算出 Cache 的块内偏移量占m位,余下的物理地址都为标记字段。
        ② n路组相联:对于 Cache,每组含有n个 Cache 行,

,再根据 Cache 数据块的大小计算出块内偏移量所占位数m,余下为标记字段。
        ③ 直接映射:设表项有2^n个。对于 TLB,组号占n位,页号其他部分为标记字段。对于 Cache,物理地址中组号占n位,再根据 Cache 数据块的大小计算出块内偏移量所占位数m,余下为标记字段。这其实是2^n路组相联的一种极限情况(相联组数 = 表项数)。
(2) 图片信息

        图片信息是指题目给出类似图 3.34 所示的地址变换机构供考生分析信息。下面以图 3.34 的地址变换机构为例,展示可以获得哪些有用信息以及相关分析过程。
① 逻辑地址
        找到图中含有页号或虚页号字段的地址结构,分析得逻辑地址有 20 位是页号,12 位是页内偏移量。
② 物理地址
        从页表或 TLB 中找出实页号或页框号字段,获得该项所占位数为4×4=16位。物理地址的页内偏移量与逻辑地址相同。
③ 页表所含字段
        找出页表分析页表项有哪些字段,计算页表项有多大。(此图无需分析这一部分,但从页表形式可知该系统采用了二级页表)
④ 确定硬件的存在情况
        确定是否存在 TLB 或 Cache 部分,本图都存在。
⑤ TLB 映射方式
        TLB(Cache)的相联映射方式→根据 TLB 的 Tag 字段位数可知 TLB 是全相联映射。Cache 部分,通过物理地址的字段组成知:高 20 位被作为标记字段,低 5 位是块内偏移量,中间 3 位是组号。Cache 有两个比较器,所以 Cache 是 2 路组相联。
【提示】地址变换的重点便是分析逻辑地址结构和物理地址结构,然后确定 TLB 和 Cache 的相联映射方式。

3.2.8 习题精编

1.基于程序的一般特点,采用请求分页存储方式一般都可以有较好的效果,但在以下的哪一种情况下,不适合采用这一管理方式 ( )。
A. 冒泡排序
B. 二分搜索
C. 顺序搜索
D. 数组初始化

1.【参考答案】B
        【解析】二分查找时,对数据的查找具有较强的随机性,局部访问特性弱所以不适合虚拟存储管理方式。其他三个选项都具有较好的局部访问特性。选 B。

2.以下说法中正确的有 ( )。
I. 由于进程某段时间只会使用到部分页面,所以虚拟存储中为了提高系统并发率,只调入进程的部分页面到内存
II. 请求分页存储管理方式与基本分页存储管理方式中,页面大小都是相同的
III. 段页式存储管理方式中逻辑地址空间的管理单位是段,物理地址空间的管理单位是页,一个进程一张段表,一个段一张页表
IV. 虚拟存储器的大小只与内存和外存的容量和有关
A. I、II
B. II、III
C. 全部
D. I、II、III

2.【参考答案】D
        【解析】虚拟存储器理论上的最大容量由 CPU 的寻址范围决定,而虚拟存储器的实际容量 = MIN (CPU 寻址范围,内存和外存的容量和)。所以 D 错误。其他选项正确。

3.为使虚拟存储管理系统具有良好的性能,应用程序应具备的特征是 ( )。
A. 程序模块变化程度高,由许多小模块组成
B. 良好的局部性
C. 程序的 I/O 操作较少
D. 程序实际大小应小于实际物理内存容量

3.【参考答案】B
        【解析】虚拟存储器的基石是局部性原理,当程序具有较好的局部性时,虚拟存储器才能拥有接近内存的存取速度。所以选 B。A、C、D 选项都会对虚拟存储器的存储性能产生细微的影响,但并不是核心因素。

4.系统采用请求分页式存储管理方式,分配给进程的页框数固定为 4。某一时刻进程的 4 个页框都已经存在页面,此时访问页面 A,该页面不存在于内存中。请问操作系统接下来会如何处理 ( )。
A. 选择淘汰页、缺页中断、调出淘汰页、调入访问页
B. 缺页中断、选择淘汰页、调出淘汰页、调入访问页
C. 选择淘汰页、调出淘汰页、缺页中断、调入访问页
D. 选择淘汰页、调出淘汰页、调入访问页、缺页中断

4.【参考答案】B
        【解析】页面不在内存时触发缺页中断,由于页框满,所以需要先选择淘汰页。选择了淘汰页后调出淘汰页,调入访问页。所以选 B。

5.以下对虚存和分页存储管理方式的描述中错误的有 ( )。
I. 请求分页存储管理方式中,如将页面的大小缩减为原来的一半,则缺页中断的次数将增加为原来的两倍
II. 基本分页存储管理方式在逻辑上增大内存的容量,解决了大作业无法调入内存的问题。
III. 基本分页存储管理中,增大页面大小,会导致产生更多的内部碎片,造成内存浪费,所以页面大小的选择应当越小越好
IV. 外存容量加上内存容量有多大,虚拟存储器的地址空间的大小就有多大
A. I
B. I、II
C. II、III
D. 全部

5.【参考答案】D
        【解析】页面大小会影响缺页率,但是二者不存在反比关系,I 错误。请求分页存储管理方式在逻辑上增大了内存的容量,解决了大作业无法调入内存的问题,II 错误。页面太小会导致页表过大,所以应当选择适中的页面大小,III 错误。虚存容量还与系统的寻址范围有关,IV 错误。

6.在采用请求分页式存储管理方式的计算机系统中,使用 TLB 且页表只有一级。从 CPU 给出逻辑地址到取得内存中相应的数据,这一过程中最少和最多分别需要 () 次内存访问 (包括写内存和读内存,且不考虑 cache)。
A. 2,4
B. 1,4
C. 2,3
D. 1,3

6.【参考答案】B
        【解析】一、TLB 命中,页在内存,只需一次访问内存存取数据。
二、TLB 没命中,页不在内存,一次查页表,一次写入外存页面数据和一次修改页表(这部分在缺页中断中),最后一次访问内存存取数据。

7.采用请求分页存储方式的计算机系统,在发生缺页中断后,会执行缺页中断处理程序。在缺页中断处理程序执行完成后系统将会执行以下哪一条指令 ( )。
A. 产生缺页中断的指令
B. 产生缺页中断的指令的前一条
C. 产生缺页中断的指令的后一条
D. 产生缺页中断的进程的第一条指令

7.【参考答案】A
        【解析】产生缺页中断时,系统记录当前指令执行时的上下文,待缺页中断处理完成后恢复上下文,继续处理先前产生缺页中断的指令。

8.计算机系统采用请求分页式存储管理方式。某一时刻运行进程 A 需要访问页面 M,由于页面 M 此时还未被调入内存,系统发生缺页,转入缺页处理程序。请问在缺页处理时,以下操作一定会发生的有 ( )。
I. 修改页表
II. 分配页框
III. 磁盘 I/O
IV. 页面置换
A. I、II
B. II、III
C. I、II、III
D. 全部

8.【参考答案】C
        【解析】如果页框未满则不需要进行页面置换,所以页面置换不一定发生。其他三个过程是调入缺页页面所必需的。所以选择 C。

9.计算机系统按字节编址(从 0 开始编址),采用请求分页式存储管理方式。物理内存大小为 256KB,被划分为 64 个内存块。进程 A 大小为 2MB,某一时刻有页号为 15、3、7 三个页面分别被存放在物理块 0、1、2 中,请问逻辑地址为 [7,30] 的数据对应的物理地址是 ( )。
A. 8222
B. 4126
C. 28702
D. 28672

9.【参考答案】A
        【解析】块大小 = 256KB / 64 = 4KB,页大小 = 块大小 = 4KB。7 号页面被装入在块号为 2 的内存块。所以物理地址 = 2×4K + 30 = 8222。

10.关于 (进程) 页表的页表项,基本分页存储管理方式和请求分页存储管理方式均须设立的字段为 ( )。
A. 状态位
B. 访问字段
C. 修改位
D. 物理块号

10.【参考答案】D
        【解析】页表是逻辑地址到物理地址的映射,既然要映射到物理地址,则必须要有物理地址信息,所以物理块号是必须的。所以选择 D。访问字段和修改位需要看系统采取的各类算法是否需要,若不需要,则可以没有,B、C 错误。基本分页方式下,所以页面都被调入内存,不需要状态位,A 错误。

11.虚拟分页存储管理中有页表若干项,当内存中某一页面被淘汰时,可能根据下列哪项来决定是否将该页面写回外存?( )
A. “是否在内存中” 标志
B. 外存地址
C. “修改” 标志
D. “访问” 标志

11.【参考答案】C
        【解析】“修改” 标志即修改位,用以记录页面被调入内存后是否有被修改。页面调出时是否需写回外存取决于该页面装入内存后是否被修改,被修改过的页面才需写回外存。所以选 C。

12.采用固定分配局部置换策略时,若物理页面数增加,则作业的缺页率 ( )。
A. 升高
B. 降低
C. 不变
D. 以上都有可能

12.【参考答案】D
        【解析】若采用 FIFO 算法,由于该算法存在 Belady 异常,所以缺页率可能升高、不变或降低。所以选 D。

13.下列内存分配策略中不可行的是 ( )。
A. 固定分配局部置换
B. 可变分配局部置换
C. 固定分配全局置换
D. 可变分配全局置换

13.【参考答案】C
        【解析】由于全局置换中各个进程分配到的页框数会发生变化,所以不可能实现固定分配。因此 C 选项不能实现。

14.以下关于页面调入策略的说法中错误的是 ( )。
A. 由于进程的页面多是在磁盘空间中连续存储的,所以可以采用预调页策略提高效率
B. 对换区采用连续分配的组织形式可连续读写,所以对换区 I/O 效率比文件区高
C. UNIX 方式中未运行过的页面存放在文件区并直接从文件区调入,换出的页面才放入对换区
D. 请求调页策略实现简单,但存在无用调入页

14.【参考答案】D
        【解析】请求调入方式在需要时才会调入页面,不存在无用页面调入的情况。预调页策略预先批量调入页面,存在无用页面调入情况。

15.系统采用请求分页式存储管理方式,页框的分配和置换采用固定分配局部置换。操作系统给进程 A 分配的页框数为 4,初始为空。接下来一段时间中进程陆续访问了如下页面:1、8、1、7、8、2、7、2、1、8、3、8、2、1、3、1、7、1、3、7。若采用 LRU 算法置换页面,则发生缺页中断的次数是 ( )。
A. 3
B. 5
C. 6
D. 8

15.【参考答案】C
        【解析】操作系统为进程 A 分配了 4 个页框,当第一次访问页面时会发生缺页中断,所以当第一次访问页面 1、8、7、2 都会发生缺页中断。采用的是 LRU 最近最久未使用置换算法访问 1(缺页)、8(缺页)、7(缺页)、2、2(缺页)、7、2、1、8、3(缺页)、8、2、1、3、1、7(缺页)、1、3、7。发生缺页中断的次数为 6 次,选 C。

16.以下哪些页面置换算法存在 Belady 异常 ( )。
I. 最近最久未使用置换算法(LRU)
II. 先进先出置换算法(FIFO)
III. 时钟置换算法(CLOCK)
IV. 最佳页面置换算法(OPT)
A. I、II
B. II、III
C. 仅 II
D. I、III、IV

16.【参考答案】C
        【解析】Belady 异常:当为进程分配的物理块数增多,而缺页次数不减反增。在页面置换算法中,只有 FIFO 会出现 Belady 异常。

17.系统按字节编址,采用请求分页存储系统,页框的分配和置换采用固定分配局部置换方式。某一时刻,进程 A 的页框全部空闲,在接下来的一段时间中依次访问了如下页面:1,3,2,1,1,3,5,1,3,2,1,5。若使用 LRU 算法选择置换页,请问进程 A 分配页框数为 3 和 4 时的缺页率各是 ( )。
A. 20%,33%
B. 50%,33%
C. 25%,66%
D. 50%,80%

17.【参考答案】B
        【解析】当为进程 A 分配页框数为 3 时,访问页面顺序 1(缺页),3(缺页),2(缺页),1,1,3,5(缺页),1,3,2(缺页),1,5(缺页)。缺页率 = 6/12 = 50%。参考下表。

当为进程 A 分配页框数为 4 时,访问页面顺序 1(缺页),3(缺页),2(缺页),1,1,3,5(缺页),1,3,2,1,5。缺页率 = 4/12 = 33%,选 B。参考下表。

18.系统按字节编址,采用请求分页存储方式管理内存,页框分配与置换使用固定分配局部置换方式。系统对数组按行存放,一个 int 型数据大小 4B,页面大小 1600B。某进程要初始化创建的二维数组,在有以下两种初始化写法。该进程有 10 个页框可以用来存放数组数据,若采用 FIFO 置换算法,以下两种写法的缺页次数是 ( )。

// 写法 1
int arr [200][400];
for (int i = 0; i < 200; ++i){
    for (int j = 0; j < 400; ++j){
        arr [i][j] = i * j;
    }
}
// 写法 2
int arr [200][400];
for (int j = 0; j < 400; ++j){
    for (int i = 0; i < 200; ++i){
        arr [i][j] = i * j;
    }
}

A. 200,400
B. 400,200
C. 200,80000
D. 80000,200

18.【参考答案】C
        【解析】页面大小 1600B,一个 int 型数据大小 4B,一个页面可以存储 400 个 int 型数据,正好是二维数组的一行。二维数组的存储方式采用行优先存储。当访问 arr [i][j] 的时候,会将 arr [i] 行所在的页面调入内存,故写法一会发生 200 次缺页中断。在写法二中,每次访问 arr [i][j] 时,都会将 arr [i] 所在页面调入内存,因此每次访问 arr [i][j] 都会发生缺页中断,共发生 400×200 = 80000 次。

19.以下关于页面调度算法的说法中,正确的有 ( )。
I. OPT 算法将未来最长时间不使用或不再使用的页面调出内存,性能最好
II. 性能良好的页面调度算法可以有效减少页面的调入调出,减少抖动现象
III.LRU 算法利用局部性原理设计,将过去最长时间未被使用的页面调出内存,性能好,但需要特殊硬件支持
IV.FIFO 算法将最早调入内存的页面调出,存在 Belady 异常
A. I
B. I、II
C. I、II、III
D. 全部

19.【参考答案】D
        【解析】OPT 算法是最佳置换算法,优先选择以后永不使用或者最久不使用的页面,性能最好,I 对。性能良好的页面调度算法可以有效减少页面的调入调出,减少抖动现象,II 对。LRU 算法是最近最久未使用置换算法,需要用到寄存器和栈的硬件支持,III 对。FIFO 先进先出页面置换算法,会出现 Belady 异常,IV 对。

20.在一个请求分页系统中,假如一个进程的页面访问顺序为:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1,当分配给该进程的物理块数为 3 时,采用 FIFO 和 LRU 页面置换算法的过程中,缺页次数分别为 ( )。
A. 15、12
B. 12、12
C. 15、15
D. 12、15

20.【参考答案】A
【解析】当采用 FIFO 页面置换算法时,访问页面的顺序如下表所示:


此时,缺页次数为 15 次。
当采用 LRU 页面置换算法时,访问页面的顺序如下表所示:


此时,缺页次数为 12 次。选项 A 正确。

21.假设系统为某进程分配了三个物理块,考虑以下页面号引用串:5,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,5,0,1,若采用最佳置换算法,则发生 ( ) 次页面置换。
A. 8
B. 7
C. 6
D. 5

21.【参考答案】C
        【解析】最佳页面置换算法即 OPT 算法。5(缺页),0(缺页),1(缺页),2(置换页面 5),0,3(置换页面 1),0,4(置换页面 0),2,3,0(置换页面 4),3,2,1(置换页面 3),2,0,1,5(置换页面 2),0,1。共发生 6 次页面置换,选 C。

22.在一个请求分页系统中,系统为某进程分配了 4 个物理块,考虑以下页面序列 8、1、3、6、9、8、6、1、7、0,若使用 OPT 页面置换算法,则访问页面 9 时会淘汰页面 ( )。
A. 8
B. 1
C. 3
D. 6

22.【参考答案】C
        【解析】访问页面 9 时,此时物理块中的 4 个页面分别是 8,1,3,6。根据 OPT 最佳置换算法,将会淘汰以后永不使用或最久不使用的页面,也就是页面 3,选 C。结果如下表所示。

23.某虚拟页式存储管理系统采用 LRU 算法置换页面,假设内存中为某进程共分配 4 个物理页框,对于如下页面访问序列:1,2,5,3,8,2,1,7,2,6,7,3,被置换出去的页面按序依次是 ( )。
A. 1,5,3,8,1
B. 1,2,5,3,8
C. 1,5,3,8
D. 1,2,5,3

23.【参考答案】A
        【解析】页面访问顺序如下表所示,被置换出去的页面按序依次是 1,5,3,8,1,A 正确。

24.给一个进程分配 4 个页框,其页表如下。在时间 164 产生虚页号 4 缺页。分别按照 FIFO、LRU、CLOCK 策略,被置换出的页框号是 ( )。

A. 0、1、2
B. 3、2、0
C. 1、2、3
D. 3、1、2

24.【参考答案】D

        【解析】根据 FIFO 策略,最先置换出去的页面是最早进入的,最早进入的页框号是 3,所以按照 FIFO 策略,会将页框号为 3 的页面置换出去。根据 LRU 策略,最先置换出去的是最近最久未使用的页面,由引用时间可知,最近最久未使用的页框为 1 号页框,所以会将 1 号页框置换出去。根据 CLOCK 策略,会将引用位为 0 的页面置换出去,所以会将 2 号页框置换出去。选项 D 正确。

25.以下关于内存映射文件的说法中错误的是 ( )。
A. 一般的 I/O 操作中,从磁盘调入的文件会先写入到交换缓冲区,内存映射文件可以略过此过程,I/O 效率更高
B. 内存映射文件实现了从进程对应磁盘文件到其虚拟内存空间中某部分的映射
C. 内存映射文件能为不同进程提供一个高带宽的通信通道
D. 进程通过系统调用将文件映射到其虚拟内存空间的一部分,并将这一文件调入到物理内存

25.【参考答案】D

        【解析】A、B、C 选项正确,参见内存映射方法一节。D 选项错误,进程通过系统调用将文件映射到其虚拟内存空间的一部分,但实际上并未将这一文件调入到物理内存。本题四个选项大致是本书内存映射方法一节的重点。

26.为判断一个请求分页存储管理系统的运行性能,对系统中各设备的利用率进行测试,结果如下:CPU 利用率为 15%,磁盘交换区利用率为 99.1%,其他 I/O 设备利用率为 6%。以下措施中可以改进 CPU 利用率的是 ( )。
I. 使用容量更大的内存
II. 减少系统多道程序度数
III. 增加多道程序度数
IV. 增大磁盘交换区的容量
V. 使用存取速度更快的磁盘交换区
VI. 使用处理速度更快的 CPU
A. I、II
B. I、III
C. II、III、V、VI
D. I、II、III、IV

26.【参考答案】A

        【解析】由题目可以得出,大部分时间消耗在磁盘交换区,也就是说,物理内存太小,导致数据需要频繁的换进换出,因此使用容量更大的内存可以改进 CPU 利用率。此外 CPU 和 I/O 利用率都很低,说明 CPU 一次读取了太多的程序放入内存中,因此减少系统多道程序度数,使每个进程可以分配到更多页框,也可以改进 CPU 利用率。选 I,II。

27.以下对置换算法和抖动的描述中正确的有 ( )。
I. 使用时钟(CLOCK)置换算法可能会产生 Belady 现象
II. 使用先进先出(FIFO)页面置换算法可能会产生 Belady 现象
III. 如果进程的工作集都被调入到了物理内存中,则进程的缺页率可以保持一个较低水平,否则会出现抖动现象
IV. 如果进程的工作集都被调入到了虚拟内存中,则进程的缺页率可以保持一个较低水平,否则会出现抖动现象
A. I 、III
B. I 、IV
C. II 、III
D. II 、IV

27.【参考答案】C

        【解析】只有 FIFO 算法会导致 Belady 异常,I 错误,II 正确。如果进程的工作集都被调入了虚拟内存中,还是会发生缺页中断,且不会保持在较低水平。而如果进程的工作集都被调入物理内存中,进程的缺页率可以保持一个较低水平,III 对,IV 错。

28.抖动是指请求分页存储系统中,由于 ( ) 设计不当或进程分配的物理页面数太少,造成刚被淘汰的页面很快又要被调入,如此反复,使得大量的 CPU 时间花费在页面置换上的现象。
A. 进程调度算法
B. 磁盘调度算法
C. 作业调度算法
D. 页面置换算法(即页面淘汰算法)

28.【参考答案】D

        【解析】根据题意,抖动是请求分页存储系统中出现的问题,因此选 D,当页面置换算法设计不当或进程分配的物理页面太少会造成抖动现象。

29.系统采用分页存储管理方式管理内存,页表只有一级且全部存放于内存中。已知访问一次内存需耗费 300ns,访问一次快表(TLB)需耗费 2ns。假设快表的命中率是 80%,快表和页表并行访问,请问在不考虑快表和考虑快表的情况下,有效访问时间(EAT)分别是多少 ( )。
A. 361.6ns,600ns
B. 600ns,361.6ns
C. 600ns,360.6ns
D. 360.6ns,600ns

29.【参考答案】B

        【解析】不考虑快表时,有效访问时间 = 访问页表时间 + 访问内存时间 = 300ns + 300ns = 600ns。

        考虑快表的情况下,有效访问时间 = 快表命中率 × 快表访问时间 + 快表未命中率 × 访问页表时间 + 访问内存时间 = 2ns×0.8 + 300ns×0.2 + 300ns = 361.6ns。

        【提示】很多教材不考虑缺页中断后再次访问快表的时间,为了和多数同学的本科教材衔接,本章的习题也采取这种思路。但实际考试中,是有可能需要考虑这段时间。若题目中有明确给出类似 “缺页中断后,返回到产生缺页中断的指令重新执行” 的条件,那么必须考虑再访问一次快表的时间。

30.进程 A 在 t 时刻前访问了如下页面:3、6、3、4、6、5、9,在接下来的一段时间里还将访问页面:2、5、6、4、8、9。设工作集窗口大小为 4,则进程 A 在 t 时刻时的工作集是 ( )。
A. 6、4、8、9
B. 3、4、6、5
C. 2、5、6、4
D. 4、6、5、9

30.【参考答案】D

        【解析】工作集是指在某段时间间隔内,进程要访问的页面集合,由题意可知,工作集窗口大小为 4,在 t 时刻,进程 A 访问过前 4 个页面是 4,6,5,9,选 D。

31.某计算机系统采用带快表的分页式存储管理方式。已知访问内存需要用时 1μs,查询快表需要用时 0.2μs,忽略快表更新等时间。若快表和内存的查询是串行的,请问在快表命中率为 85% 和 50% 时,系统的平均访问时间分别是多少 ( )。
A. 1.5μs,1.8μs
B. 1.35μs,1.7μs
C. 1.15μs,1.5μs
D. 1.2μs,2.0μs

31.【参考答案】B

        【解析】当快表命中率为 85% 时,系统的平均访存时间 = 快表命中率 × 快表访问时间 + 快表未命中率 ×(访问快表时间 + 访问页表时间) + 访问内存时间 = 0.85×0.2 + (1 + 0.2)×0.15 + 1 = 1.35。

        当快表命中率为 50% 时,系统的平均访存时间 = 快表命中率 × 快表访问时间 + 快表未命中率 ×(访问快表时间 + 访问页表时间) + 访问内存时间 = 0.5×0.2 + (1 + 0.2)×0.5 + 1 = 1.7。选 B。

32.某计算机系统按字节编址,采用请求分页式存储管理方式,页表由寄存器保存,访问一次内存需 100μs。在系统发生缺页中断时,若不需要调出页面或调出页面未被修改不需要写回磁盘,则缺页处理需要 9ms。若调出页面被修改过,需要写回磁盘,则缺页处理需要 21ms。若系统中有 80% 的页面未被修改过,要保证有效访问时间不超过 286μs,则缺页率不可以超过 ( )。
A. 3%
B. 4%
C. 2%
D. 1%

32.【参考答案】D

        【解析】设缺页率为 x,有效访存时间 = 100μs×(1 - x) + x (0.9×21 + 0.8×100μs) = 18.6x ms + 100μs,要使有效访问时间不超过 286μs,即 18.6x ms < 186μs,有 x < 0.01,即缺页率不超过 1%。

        【提示】做题时注意审题:题目已经说了页表由寄存器保存,故访问页表不需要访问内存。

33.假设某系统中的 TLB 的命中率大约是 75%,并且使用了二级页表,则平均访存次数是 ( )。(访问 TLB 的时间忽略)
A. 平均需要 1.25 次内存访问
B. 平均需要 1.5 次内存访问
C. 平均需要 1.75 次内存访问
D. 平均需要 2 次内存访问

33.【参考答案】B

        【解析】根据题意,忽略 TLB 访问时间。若快表命中则可直接获得物理地址,需要一次内存访问,若快表未命中,则需要访问页目录表、页表才能获得物理地址,共需要三次内存访问。所以,平均访存次数 = 0.25×3 + 0.75×1 = 1.5 次内存访问。

34.考虑一个分页式存储管理系统,其页表常驻内存,试回答以下两种情况下的有效访问时间:
(1) 如果内存访问耗时 200ns。
(2) 如果引入快表(TLB)机制,而且假如 75% 的页面表项可以从快表中找到。(假设访问快表的时间可以忽略不计)
有效访问时间分别是 ( )。
A. 200ns,150ns
B. 400ns,150ns
C. 400ns,250ns
D. 600ns,250ns

34.【参考答案】C

        【解析】访问内存中的数据分两步,第一步访问页表获得要访问数据的物理地址,第二步访问该物理地址,共需访存两次,访存时间为 400ns。引入快表(TLB)后,有效访存时间为命中 TLB + 未命中 TLB 两种情况,有效访存时间 = 0.75×200 + 0.25×(200 + 200) = 250ns,选 C。

35.下列有关驻留集和工作集的表述正确的是 ( )。
I. 驻留集是进程已装入内存的页面的集合
II. 工作集是某段时间间隔内,进程运行所需要访问页面的集合
III. 在正常运行的计算机中,工作集是驻留集的子集
A. I
B. I、II
C. II、III
D. I、II、III

35.【参考答案】D

        【解析】驻留集是进程已装入内存的页面的集合,I 对。工作集是某段时间间隔内,进程运行所需要访问页面的集合,II 对。为了正常运行,防止抖动现象,一般要让驻留集大于工作集,即工作集是驻留集的子集,III 对,选项 D 正确。

36.有关颠簸的描述正确的有 ( )。
I. 颠簸时,CPU 利用率迅速下降
II. 颠簸时,应该增加进程,使 CPU 利用率提高
III. 颠簸时,通过挂起进程,可以缓解内存
IV. 可变分配中的局部置换,不会发生颠簸现象
A. I、II
B. II、III
C. I、II、IV
D. I、III、IV

36.【参考答案】D

        【解析】在页面置换过程中,颠簸指刚刚换入的页面马上就要被换出,刚刚换出的页面马上又要换入内存,这种频繁的页面调度行为称为颠簸或抖动。当发生颠簸时,处理器的大部分时间将用来负责交换页面,从而导致 CPU 利用率迅速下降,I 对。颠簸发生的主要原因是进程访问的页面数目高于可用的物理块数,因此,应当适当减少进程,增加其他进程的可用物理块,从而提高 CPU 利用率,II 错。颠簸时,通过挂起进程可以缓解内存的使用,III 对。在可变分配的局部置换中,如果进程发生频繁的缺页,系统会为该进程多分配几个物理块,从而抑制其发生颠簸现象,反之,如果进程在运行中缺页率特别低,则会适当减少分配给该进程的物理块,因此,在可变分配中的局部置换,不会发生颠簸现象,IV 对,选项 D 正确。

37.讨论请求分页存储管理方式时,我们说系统在执行某一条进程指令时,可能会触发多次缺页中断。请说明在何种情况下,系统执行某一条指令时会发生多次缺页中断?(提示:可以从指令的存放位置和指令中所涉及操作数的存放位置等方向去思考。)

37.【参考答案】

        【解析】在分页存储管理方式中,地址空间被划分为页(页框)。同一条指令可能部分处于 P 页面,部分处于 Q 页面,若 P、Q 都不在内存中,则执行这一指令时会发生两次缺页中断。一条指令可能涉及多个操作数,这些操作数可能存放在不同的页面中,若这些页面都不在内存。则会产生多次缺页中断。

38.计算机系统按字节编址,采用请求分页式存储管理方式管理内存,逻辑地址空间大小为 32KB,物理地址空间大小为 16KB,页面大小为 1KB。进程 A 此时的页表情况如下表所示。该进程大小为 12KB。进程 A 随后发起了一次内存访问请求,请分别对逻辑地址 16C5H、1EC6H、36E3H 分析系统的处理过程。

39.系统按字节编址,采用请求分页存储方式管理内存。系统对数组按行优先方式存放,一个 int 型数据大小 4B。某进程要初始化创建一个二维数组,现在有以下两种初始化写法。该进程有两个页框可以使用,其中一个用来存放程序,另一个用来存放数组数据。请分别计算页面大小为 800B 和 1600B 情况下,以下两种写法的缺页次数。计算结果说明了什么?

// 写法 1
int arr [200][200];
for (int i = 0; i < 200; ++i){
    for (int j = 0; j < 200; ++j){
        arr [i][j] = i * j;
    }
}
// 写法 2
int arr [200][200];
for (int j = 0; j < 200; ++j){
    for (int i = 0; i < 200; ++i){
        arr [i][j] = i * j;
    }
}

39.【参考答案】

        当页面大小为 800B 时,一个页面可以存放 200 个 int 型数据,由于采用的是数组行优先方式存放,每行数组元素 arr [i] 占据一个页面,所以写法 1,共发生 200 次缺页中断。写法 2 每次访问 arr [i][j] 时都会发生缺页中断,共发生 200×200 = 40000 次。

        当页面大小为 1600B 时,一个页面可以存放 400 个 int 型数据,每两行数组元素 arr [i] 和 arr [i + 1] 占据一个页面,在写法 1 的情况下,共发生 100 次缺页中断。写法 2,每访问两个数组元素发生一次缺页中断,共发生 200×200×1 / 2 = 20000 次。

        计算结果说明,对于按行优先存放的数组,应当行优先遍历,这样写出来的程序局部性才是良好的。

40.某虚存大小为 32GB 的计算机,按字节编址,采用页式存储管理策略,页表项大小固定 4B。物理地址空间大小为 32MB,页框大小为 4KB。则:
(1) 内存中的一页能存储多少页表项?
(2) 若要实现进程对全部逻辑地址空间的映射,并将页表全部调入到内存中,需要分配多大的连续内存空间给页表?这样做合适吗?
(3) 选择合适的页表结构,设计逻辑地址划分的结构,并标出每一项的位数。

41.某请求分页管理系统的主存大小为 16KB,按字节编址,页框大小为 1KB。某进程的驻留集大小固定为 5,分别装入的主存块号是 1,4,5,9,15。注意本题中用十进制表示地址。
(1) 请画出该进程的页表结构。
(2) 进程访问逻辑地址 2333 和 4189 对应的物理地址分别是多少?

        (2) 2333/1024 向下取整,得 2,故逻辑页号为 2,对应的物理块号为 5,又 2333%1024 = 285,即页内偏移量为 285。因此,逻辑地址 2333 映射到物理地址为 5×1024 + 285 = 5405。

        逻辑地址 4189/1024 向下取整,得 4,故逻辑页号为 4,对应的物理块号为 15,又 4189%1024 = 93,即页内偏移量为 93,因此,逻辑地址 4189 映射到物理地址为 15×1024 + 93 = 15453。

42.计算机系统采用请求分页式存储管理方式,页框的分配和置换采用固定分配局部置换方式,置换算法采用 LRU 算法。对于初始页框都为空的进程 A,在此后的一段时间内依次访问了如下页面:3、1、5、2、1、3、4、1、4、5、1,分别计算分配页框数为 3 和 4 的情况下系统的缺页次数和缺页率。

42.【参考答案】

        根据题意,采用的是 LRU 最近最久未使用置换算法。当分配页框数为 3 时,访问页面顺序为:3(缺页)、1(缺页)、5(缺页)、2(缺页)、1、3(缺页)、4(缺页)、4、1、4、5(缺页)、1。缺页次数为 7 次,缺页率 = 7/12 = 58%。

        当分配页框数为 4 时,访问页面顺序为:3(缺页)、1(缺页)、5(缺页)、2(缺页)、1、3、4(缺页)、4、1、4、5(缺页)、1。缺页次数为 6 次,缺页率 = 6/12 = 50%。

43.某虚拟存储采用页式内存管理和局部置换策略,一个进程访问页面的页号序列为 2,3,5,9,2,7,5,7,2,4,9,8,2,8,系统为进程预分配了 4 个页框。则采用以下置换算法过程中,产生页置换的次数和未命中的次数以及命中率分别为多少。
(1) 最佳置换算法。
(2) 先进先出置换算法。
(3) 最近最久未使用算法。

43.【参考答案】

        (1) 采用 OPT 最佳置换算法,访问页面的序列为:2(未命中)、3(未命中)、5(未命中)、9(未命中)、2、7(置换页面 3)、5、7、2、4(置换页面 7)、9、8(置换页面 4)、2、8。产生页面置换次数为 3 次,未命中的次数为 7 次,命中率 7/14 = 50%。

        (2) 采用 FIFO 先进先出置换算法,访问页面的序列为:2(未命中)、3(未命中)、5(未命中)、9(未命中)、2、7(置换页面 2)、5、7、2(置换页面 3)、4(置换页面 5)、9、8(置换页面 9)、2、8。产生页面置换次数为 4 次,未命中的次数为 8 次,命中率 6/14 ≈ 42.86%。

        (3) 采用 LRU 最近最久未使用置换算法,访问页面的序列为:2(未命中),3(未命中),5(未命中),9(未命中),2,7(置换页面 3),5,7,2,4(置换页面 9),9(置换页面 5),8(置换页面 7),2,8。产生页面置换次数为 4 次,未命中次数为 8 次,命中率 6/14 ≈ 42.86%。

44.计算机系统按字节从 0 开始编址,采用请求分页式存储管理方式管理内存,内存块采取固定分配局部置换方式管理,页号以及块号从 0 开始编号。进程 A 被分配的内存块数量为 4,进程 A 在 186 时刻的内存块使用情况如下表所示。

(1) 若在 186 时刻进程发出对页面 5 的访问请求,请分别按照 FIFO、LRU、改进型 CLOCK 作为采用的置换算法来说明系统的处理过程,并给出处理过后的内存块使用情况(按上表的形式给出)。
(2) 若在 186 时刻后的一段时间里有如下访问页面:5、0、4、0、2、4、2、1、3、5、2。采用 LRU 置换算法,请说明系统产生的缺页次数。

44.【参考答案】

        (1) 在 186 时刻访问页面 5,若为 FIFO 置换算法,则将页号 2 替换,此时,页号为 5,块号为 6,装入时间 186,最近访问时间 186,访问位 1,修改位 0。

若为 LRU 算法,则将页号 1 替换,此时页号为 5,块号为 3,装入时间 186,最近访问时间 186,访问位 1,修改位 0。

        若为改进型 CLOCK 置换算法,则将页号 1 替换,此时页号为 5,块号为 3,装入时间 186,最近访问时间 186,访问位 1,修改位 0。

        (2) 对于 LRU 置换算法,建议考生根据本章【例 3.2】介绍的方法,采用队列处理。设置一个大小为 4 的队列,将内存中 4 个初始页面按照最近访问时间先后依次入队,访问某个页面时按如下情况处理:① 若缺页,则将队首元素出队,并将缺页元素加入队尾;② 若未缺页,则将队列中本次访问的页号元素移到队尾。按照上述方法,访问页面的顺序为:5(缺页)、0、4(缺页)、0、2、4、2、1(缺页)、3(缺页)、5(缺页)、2。缺页次数为 5 次。

45.页式虚拟存储系统采用改进型 CLOCK 替换算法,固定分配局部置换策略。给进程 P 预分配了 3 个页框。进程 P 的代码段、数据段、栈空间、堆空间依次占据 0、1、2、3 号页面,对应外存的块号分别为 34,60,61,90。在进程 P 调入内存开始运行后,代码段被调入内存的 17 号页框且已进行了修改,数据段调入内存的 20 号页框,栈空间分配在 15 号页框。
(1) 请将下表补充完整。

(2) 当时间为 188 时,用户申请堆内存,操作系统会如何处理?页表会如何变化?(指针当前指向最早调入内存的页面)

45.【参考答案】

(1) 页表如下表所示。

        (2) ① 由题意已知,采用改进型 CLOCK 替换算法,操作系统会优先将使用位为 0、修改位为 0 的页面替换出去。由访问时间可以推断出,页面 0、1、2、3 的使用位分别为 1、1、1、0。

        ② 题目已说明指针当前指向最早调入内存的页面,而进程的代码段最先调入内存,故指针当前指向 0 号页面。③ 指针当前指向的 0 号页面使用位为 1,修改位为 1;继续检测 1 号页面,使用位为 1;检测 2 号页面,使用位为 1。检测的同时将使用位都置为 0。由于只为进程 P 分配了三个页框,会从头开始扫描 0 号页面,由于 0 号页面修改位为 1,继续扫描 1 号页面,1 号页面的使用位置为 0,修改位为 0,故将页面 1 替换出去。更新后的页表如下表所示。

46.某计算机系统按字节编址,采用请求分页式存储管理方式,访问一次内存需要 2μs,访问一次快表(TLB)需要用时 1μs。在系统发生缺页中断时,页表与 TLB 串行访问,如果不需要调出页面或调出页面未被修改不需要写回磁盘,那么缺页处理需要 11μs。如果调出页面被修改过,需要写回磁盘,那么缺页处理需要 35μs。若系统中有 75% 的页面被修改过,要保证有效访问时间不超过 6μs,分别计算快表命中率为 50% 和 90% 时,缺页率最大值约是多少?

46.【参考答案】

设快表命中率为 Q,缺页率为 P。

①快表命中时,需要一次 TLB 访问取物理地址和一次内存访问取数据。访存时间 =(1μs + 2μs)= 3μs,概率为 Q。

②快表未命中,不发生缺页时,需要一次 TLB 访问和两次内存访问,第一次内存访问获取物理地址,第二次内存访问获取数据。访存时间 =(1μs + 2μs + 2μs)= 5μs,概率为 (1 - Q)×(1 - P)。

③快表未命中且发生缺页中断时,上一情况的一次 TLB 访问和两次内存访问共 5μs 仍然需要,还会增加一次额外的缺页中断时间,再加一次修改 TLB 信息的时间。

访存时间 = 25%×(5μs + 11μs + 1μs)+ 75%×(5μs + 35μs + 1μs)= 35μs,概率为 (1 - Q)×P。

综上所述,平均访存时间 = Q×3μs + (1 - Q)×(1 - P)×5μs + (1 - Q)×P×35μs。

令平均访存时间 ≤ 6μs,并分别带入 Q = 50% 和 Q = 90% 可以依次计算出缺页率 P 不超过 18.75% 和 93.3%。

47.计算机系统按字节编址,内存大小为232B。
(1) 若系统采用分页式存储管理方式管理内存,访问一次内存需要 100ns,访问一次快表(TLB)需要 10ns。若系统串行访问页表和 TLB,且 TLB 的命中率为 98%,请分别计算页表为一级和页表为二级时的有效内存访问时间。
(2) 在上题的条件下(除去 TLB 命中率),忽略缺页处理时间以及快表更新时间,页表为一级时若要有效内存访问时间小于 120ns,请问 TLB 的命中率至少应当是多少?
(3) 若系统采用请求分页存储管理方式,虚拟存储器大小为2^48B,页面的大小为 4KB,页表项大小 8B。请问该系统的页表应当组织为几级?
(4) 若系统采用段页式存储管理方式管理内存,段长最大可达2^32B,页面大小为 4KB,页表项大小为 8B。请问段内页表应是多少级的?

47.【参考答案】

(1) 一级页表时,有效内存访问时间 = 10×0.98 + (10 + 100)×0.02 + 100 = 112ns。

二级页表时,有效内存访问时间 = 10×0.98 + (10 + 100 + 100)×0.02 + 100 = 114ns。

(2) 根据题意,在页表为一级时要求有效内存访问时间小于 120ms,设 TLB 命中率为 x,有效内存访问时间 = 10×x + (10 + 100)×(1 - x)+ 100 < 120,得 x > 0.9,即 TLB 命中率至少应该是 90%。

(3) 根据题意,虚拟存储器大小为 2⁴⁸B,页面大小为 4KB,则共有 2⁴⁸B/2¹²B = 2³⁶个页面,每个页面可存储页表项 = 2¹²B/8B = 2⁹。该系统的页表应当组织为 4 级页表。

(4) 每个页面可存储页表项 2⁹个,段内页面的最大页数 = 最大段长 / 页面大小 = 2³²B/2¹²B = 2²⁰页。因此,段内页表应是 3 级页表。

48.将页表存储在主存中,需要两次访存操作才能取到数据。因此为了降低虚拟地址到物理地址的转换开销,引入了快表 TLB 的概念。TLB 会预存一部分页表的内容,若命中则可节省一次访存操作的时间。已知某分页式虚拟存储系统有如下性质:一次内存访问的时间是 100ns;一次 TLB 的访问时间是 10ns;处理一次缺页的平均时间是 1ms(同时更新 TLB 和页表);TLB 命中率为 80%;缺页率为 2%;快表和页表串行访问。请回答以下问题:
(1) TLB 命中时的访存时间。
(2) TLB 未命中,内存中页表命中的访存时间。
(3) 缺页时的访存时间。
(4) 一次访存操作的平均时间。

48.【参考答案】

(1) TLB 命中时,访存时间 =(10ns + 100ns)= 110ns。

(2) TLB 未命中,页表命中时,访存时间 =(10ns + 100ns + 100ns)= 210ns。

(3) 缺页时,访存时间 =(10ns + 100ns + 1ms + 100ns)= 1000210ns。

(4) 访存的平均操作时间 = 80%×110ns + 20%×98%×210ns + 20%×2%×1000210ns = 4130ns。

49.当单个进程分配到的内存块少于某个数目时,该进程的页面会频繁地进行换入换出,导致缺页率急剧升高,即系统出现了抖动现象。此时将会花费大量时间用以访存等待,严重影响系统工作效率。根据以下参数判断系统状态,并将下表补充完整。

49.【参考答案】

如下表所示。情况 1 中 CPU 利用率高,对换区利用率低,说明 CPU 被充分利用,且进程运行良好,缺页率低。

情况 2 中磁盘对换区利用率低说明不是抖动现象造成的 CPU 利用率低,所以这应当是运行进程少造成的,需要增加并发进程数。

情况 3 中磁盘对换区占满,说明系统在频繁地调入调出页面,是抖动造成了 CPU 利用率低,所以此时应该减小并发进程数。

50.某请求分页管理系统,预分配给某进程的页框数为 2,采用局部置换的方式,页表当前状态下表所示。页面大小为 4KB,内存的平均存取时间是 100ns,TLB 的平均访问时间是 10ns,一次缺页中断处理的时间是 0.1s。TLB 初始为空,采用 LRU 置换算法。若依次访问虚拟地址 0835H、2450H、0ABAH、2101H,请回答以下问题:

(1) 各需多少时间?(页表和 TLB 串行访问)
(2) 对应的物理地址分别是多少?
(3) 访问完成后 TLB 和页表的内容分别是什么?

50.【参考答案】

(1) 页面大小为 4KB,则虚拟地址低 12 位为页内地址。高 4 位是虚拟页号。

①访问虚拟地址 0835H 时,对应页号为 0 号页面,查询 TLB 为空,需要到内存中访问页表,在页表中,页号为 0 所对应的页框号为 233H,同时将该页表项调入 TLB,访问内存中该地址所需时间 = 10ns + 100ns + 10ns + 100ns = 220ns。

②访问虚拟地址 2450H 时,对应页号为 2 号页面,查询 TLB 为空,需要到内存中访问页表,在页表中,页号为 2 所对应的页框号为空,出现缺页中断,由于系统采用 LRU 置换算法,会将页号为 1 所对应的页框号 02AH 分配给页面 2,同时将该页表项调入 TLB,访问内存中该地址所需时间 = 10ns + 100ns + 0.1s + 10ns + 100ns = 100.00022ms。

③访问虚拟地址为 0ABAH 时,对应页号为 0,直接访问 TLB 即可,访问内存中该地址,所需时间 = 10ns + 100ns = 110ns。

④访问虚拟地址为 2101H 时,对应页号为 2,直接访问 TLB 即可,访问内存中该地址,所需时间 = 10ns + 100ns = 110ns。

(2) ①虚拟地址 0835H 的页号为 0,所占的页框号为 233H,对应的物理地址是 233835H。

②虚拟地址 2450H 的页号为 2,由于页表中页号为 2 所对应的有效位为 0,发生缺页中断,根据 LRU 替换算法,将页号为 1 的页框号 02AH 分配给 2 号页面,对应的物理地址是 02A450H。

③虚拟地址 0ABAH 的页号为 0,所占的页框号为 233H,对应的物理地址是 233ABAH。

④虚拟地址 2101H 的页号为 2,所占的页框号为 02AH,对应的物理地址是 02A101H。

(3) 访问完成后,TLB 如表 3.12 所示。页表如表 3.13 所示。

51.某计算机的内存大小为 256MB,按字节编址,采用 2 路组相联的映射方式。cache 容量为 64KB,每个数据块的大小为 256B,并采用 LRU 替换算法。默认每次访存为 cache 和主存同时访问。已知访存开始前的 cache 第 0 组地址阵列如下表所示。请回答以下问题:

(1) 请画出主存地址划分后的结构,并标出每一项的位数。
(2) 若 CPU 要顺序访问地址为 0100023H、1018058H、35080BAH 和 3508064H 这 4 个主存单元。每次访问 cache 是否命中?四次访问结束后,cache 第 0 组的内容是什么?
(3) 已知 cache 的存取周期为 20ns,主存的存取周期为 200ns。若 cache 完成存取的次数为 8000 次,主存完成存取的次数为 200 次。求 cache 的命中率,和 cache - 存系统的效率。
【提示】此题是操作系统内存管理与组相联 cache 部分的综合应用题。408 考试中也经常这样综合考察。考生可在学完组相联 cache 部分后再做此题。

51.【参考答案】

(1) 由题意已知,按字节编址,内存大小为 256MB,则主存地址占 28 位,每个数据块的大小为 256B,则块内地址占 8 位,cache 容量为 64KB,共有 64KB/256B = 2⁸块,又采用 2 路组相联,则组号占 7 位,标记位 = 主存地址位数 - 块内地址位数 - 组号 = 13 位。

主存地址如下图所示。

(2) ①当 CPU 访问 0100023H 时,由主存地址结构可知,组号为 0,标记为 0020H,访问 cache 第 0 组地址阵列,命中。

②当 CPU 访问 1018058H 时,由主存地址结构可知,组号为 0,标记为 0203H,访问 cache 第 0 组地址阵列,命中。

③当 CPU 访问 35080BAH 时,由主存地址结构可知,组号为 0,标记为 06A1H,访问 cache 第 0 组地址阵列,未命中,由 LRU 替换算法,替换组内块号为 1 的块,将 Tag 位置为 06A1H。

④当 CPU 访问 3508064H 时,由主存地址结构可知,组号为 0,标记为 06A1H,访问 cache 第 0 组地址阵列,命中。

四次访问结束后,cache 第 0 组的内容如下表所示。

52.某计算机采用分页式虚拟存储管理方式,按字节编址,虚拟地址为 32 位,页大小为 4KB,物理存储容量 16MB,Cache 采用 2 路组相联映射方式,共 8 组,主存与 Cache 之间交换的块大小为 64 字节,TLB 采用组相联映射。存储访问过程如图 3.35 所示,系统运行到某一时刻时,页表的部分内容、Cache 的部分内容和 TLB 的内容如图 3.35 所示,图中物理页号和标记字段的内容均为十六进制。请回答下列问题:
(1) 虚拟地址、物理地址字段的位数各是多少?
(2) 使用物理地址访问 Cache 时,地址中 X、Y 和 Z 字段的含义是什么,各占多少位?
(3) 如何判断虚拟地址 0000 38AEH 所在页面在主存中,对应的物理地址是多少?访问该地址时 Cache 是否命中?说明理由。
(4) 若引入一个 2 路组相联的 TLB,该 TLB 共有 4 个组,若其当前内容如图 3.35 所示,此时处理器用虚拟地址 000A5 3CAH 进行访问,问从何处获得物理地址?说明理由。
(5) TLB 起何作用?

52.【参考答案】

(1) 由题意可知,虚拟地址为 32 位,物理存储容量 16MB = 2²⁴B,物理地址占 24 位。

(2) 使用物理地址访问 Cache 时,由于主存与 Cache 之间交换的块的大小为 64 字节,占 6 位,共有 8 组 Cache,组号占 3 位,标记位占 24 - 3 - 6 = 15 位。其中 X 表示标记占 15 位,用于比较所查找的物理地址所在的物理块是否在 Cache 中,Y 表示组号占 3 位,代表 Cache 中的某一组,Z 代表块内地址,占 6 位。

(3) 页的大小为 2¹²B,占 12 位,虚拟页号占 32 - 12 = 20 位,在 TLB 中查询虚拟页号为 00003H 的页面,命中,其对应的物理页号为 863H,合成物理地址为 8638AEH。物理地址 8638AEH 中,组号为 2,标记为 431C,在 Cache 的组 2 中,未找到该标记的数据块,所以未命中。

(4) 虚拟地址 000A53CAH 的虚拟页号为 000A5。其中,虚拟页号的低 2 位 (01) 代表 TLB 组号,为 1 (5H 对应的二进制为 0101)。在组 1 中,能找到该虚拟页号 (000A5H 去掉低 2 位、高为补 2 个 0,得到 00029H),故从 TLB 获得其物理地址。

(5) TLB 实现虚拟地址到物理地址的快速转换,减少访存次数。

3.2.9 真题演练

53.【2012】下列关于虚拟存储的叙述中,正确的是 ( )。
A. 虚拟存储只能基于连续分配技术
B. 虚拟存储只能基于非连续分配技术
C. 虚拟存储容量只受外存容量的限制
D. 虚拟存储容量只受内存容量的限制

53.【参考答案】B

        【解析】虚拟存储器中,需要将程序进行部分调入调出,所以只能基于非连续分配技术。而虚拟存储器的容量理论上只由寻址范围限制,实际上受内存和外存容量和的限制。

54.【2013】若用户进程访问内存时产生缺页,则下列选项中,操作系统可能执行的操作是 ( )。
I. 处理越界错
II. 置换页
III. 分配内存
A. 仅 I、II
B. 仅 II、III
C. 仅 I、III
D. I、II 和 III

54.【参考答案】B

        【解析】越界检查发生在查询页表之前,而此处产生了缺页中断,说明已经正常进行到查询页表的阶段,所以系统此时并无越界错。产生缺页时系统会为调入页分配内存,若内存已满也会有置换页的操作发生。

55.【2014】下列措施中,能加快虚实地址转换的是 ( )。
I. 增大快表(TLB)容量
II. 让页表常驻内存
III. 增大交换区(swap)
A. 仅 I
B. 仅 II
C. 仅 I、II
D. 仅 II、III

55.【参考答案】C

        【解析】增大快表容量可以提高快表命中率,让页表常驻内存,使得查询页表时可直接从内存中查询,有效提高了查询页表的速度。交换区用于缓和外部设备和 CPU 之间的读取速度差异,与地址变换无关。

56.【2015】请求分页系统中,分配策略与置换策略不能组合使用的是 ( )。
A. 可变分配,全局置换
B. 可变分配,局部置换
C. 固定分配,全局置换
D. 固定分配,局部置换

56.【参考答案】C

        【解析】由于全局置换会破坏固定分配的性质,所以二者不能组合使用。详见本章页框分配一节。

57.【2011】在缺页处理过程中,操作系统执行的操作可能是 ( )。
I. 修改页表
II. 磁盘 I/O
III. 分配页框
A. 仅 I、II
B. 仅 II
C. 仅 III
D. I、II 和 III

57.【参考答案】D

        【解析】缺页处理需要调入内存中缺失的页面,需要磁盘 I/O,并为调入的页面分配页框。调入页面后需要修改页表,记录该调入页面的信息。所以 I、II、III 都正确,选择 D。

58.【2014】在页式虚拟存储管理系统中,采用某些页面置换算法,会出现 Belady 异常现象,即进程的缺页次数会随着分配给该进程的页框个数的增加而增加。下列算法中,可能出现 Belady 异常现象的是 ( )。
I. LRU 算法
II. FIFO 算法
III. OPT 算法
A. 仅 II
B. 仅 I、II
C. 仅 I、III
D. 仅 II、III

58.【参考答案】A

        【解析】只有基于队列的 FIFO 算法会导致 Belady 异常,OPT 和基于堆栈的 LRU 算法不存在该情况。所以选 A。

59.【2015】系统为某进程分配了 4 个页框,该进程已访问的页号序列为 2,0,2,9,3,4,2,8,2,4,8,4,5。若进程要访问的下一页的页号为 7,依据 LRU 算法,应淘汰页的页号是 ( )。
A. 2
B. 3
C. 4
D. 8

59.【参考答案】A

        【解析】LRU 算法将最近最久未被使用的页面调出,进程被分配四个页框,其置换过程如下表所示。当访问页面 7 时,页面 2 是最久未被访问的 (倒数第二列),所以页面 2 被换出。选择 A。

60.【2016】某系统采用改进型 CLOCK 置换算法,页表项中字段 A 为访问位,M 为修改位。A=0 表示页最近没有被访问,A=1 表示页最近被访问过。M=0 表示页没有被修改过,M=1 表示页被修改过。按 (A, M) 所有可能的取值,将页分为四类:(0, 0)、(1, 0)、(0, 1) 和 (1, 1),则该算法淘汰页的次序为 ( )。
A. (0, 0),(0, 1),(1, 0),(1, 1)
B. (0, 0),(1, 0),(0, 1),(1, 1)
C. (0, 0),(0, 1),(1, 1),(1, 0)
D. (0, 0),(1, 1),(0, 1),(1, 0)

60.【参考答案】A

        【解析】改进 CLOCK 算法同时考虑访问位和修改位,优先调出最近未被访问的页面以减少缺页率。在访问情况相同时,优先调出未被修改过的页面,以减少 I/O 开销,因为未被修改的页面不需要写回磁盘。所以选择 A。

61.【2019】某系统采用 LRU 页置换算法和局部置换策略,若系统为进程 P 预分配了 4 个页框,进程 P 访问页号的序列为 0,1,2,7,0,5,3,0,2,7,6,则进程访问上述页号的过程中,产生页置换的总次数是 ( )。
A. 3
B. 4
C. 5
D. 6

61.【参考答案】C

        【解析】LRU 算法将最近最久未被使用的页面调出。当进程的 4 个页框占满时,有新的页面要调入,则会发生置换,置换过程如下表所示。由下表可知总共发生 5 次页面置换。所以选择 C。

62.【2021】某请求分页存储系统的页大小为 4KB,按字节编址。系统给进程 P 分配 2 个固定的页框,并采用改进型 Clock 置换算法,进程 P 页表的部分内容如下表所示。若 P 访问虚拟地址为 02A01H 的存储单元,则经地址变换后得到的物理地址是 ( )。

A. 00A01H
B. 200A01H
C. 60A01H
D. 80A01H

62.【参考答案】C

        【解析】由页面大小为 4KB 可知物理地址和虚拟地址的低 12 位是页内偏移量。由所给虚拟地址知虚拟地址共 20 位,所以前 8 位为虚拟地址页号,即 02H。根据此页号查询页表相应页表项发现该页未调入内存,且该进程的两个固定页框已满,于是进行页面置换。

根据改进型 CLOCK 置换算法,3、4 页面都有访问,应当换出没有修改过的 3 页面,所以 2 页面被换入到 60H 页框。与页内偏移量 A01H 组合得到物理地址 60A01H。

63.【2011】当系统发生抖动(thrashing)时,可用采取的有效措施是 ( )。
I. 撤销部分进程
II. 增加磁盘交换区的容量
III. 提高用户进程的优先级
A. 仅 I
B. 仅 II
C. 仅 III
D. 仅 I、II

63.【参考答案】A

        【解析】发生抖动是由于系统中的进程被分配到的物理块太少,在上述三个方法中只有撤销部分进程可以腾出内存空间,为留下来进程多分配一些物理块以解决抖动。

64.【2016】某进程访问页面的序列如下图所示。

若工作集的窗口大小为 6,则在 t 时刻的工作集为 ( )。
A. 6, 0, 3, 2
B. 2, 3, 0, 4
C. 0, 4, 3, 2, 9
D. 4, 5, 6, 0, 3, 2

64.【参考答案】A

        【解析】t 时刻前访问的最后 6 个页面为 {6, 0, 3, 2, 3, 2},去掉重复的页面得到工作集 {6, 0, 3, 2}。

65.【2020】下列因素中,影响请求分页系统有效(平均)访存时间的是 ( )。
I. 缺页率
II. 磁盘读写时间
III. 内存访问时间
IV. 执行缺页处理程序的 CPU 时间
A. 仅 II、III
B. 仅 I、IV
C. 仅 I、III、IV
D. I、II、III 和 IV

65.【参考答案】D

        【解析】缺页率高会导致系统访问时间大量花费在处理缺页中断上。系统访问时可能产生缺页中断,所以执行缺页处理程序的 CPU 时间长,自然会导致整体的访问时间上升。而磁盘处理时间是缺页中断的一部分,所以也相关。内存访问时间包括查页表和查目标物理地址的时间,所以会影响系统的平均访问时间。

66.【2009】请求分页管理系统中,假设某进程的页表内容如下表所示。页面大小为 4KB,一次内存的访问时间是 100ns,一次快表(TLB)的访问时间是 10ns,处理一次缺页的平均时间10^8ns (已含更新 TLB 和页表的时间),进程的驻留集大小固定为 2,采用最近最久未使用置换算法(LRU)和局部淘汰策略。假设:①TLB 初始为空;②地址转换时先访问 TLB,若 TLB 未命中,再访问页表 (忽略访问页表之后的 TLB 更新时间);③有效位为 0 表示页面不在内存,产生缺页中断,缺页中断处理后,返回到产生缺页中断的指令处重新执行。设有虚地址访问序列 2362H、1565H、25A5H,请问:

(1) 依次访问上述三个虚地址,各需多少时间?给出计算过程。
(2) 基于上述访问序列,虚地址 1565H 的物理地址是多少?请说明理由。

66.【参考答案】

(1) 首先确定地址结构,由页面大小 4KB 知虚地址和物理地址的低 12 位是页内偏移量。其余高位为页号(页框号)。

2362H:拆成页号 2H 和页内偏移量 362H。访问快表(初始为空)用时 10ns,未命中。访问页表用时 100ns,得到页框号 254H。将页框号和页内偏移量拼接成物理地址,访问物理地址用时 100ns。总用时 210ns。

1565H:拆成页号 1H 和页内偏移量 565H。访问快表用时 10ns,未命中。访问页表用时 100ns,未命中,引发缺页中断用时 10⁸ns。缺页中断过程中,该进程的驻留集已满,需要进行页面置换。根据 LRU 算法,最近最久未被访问的是 2 号页面,所以应当调出 0 号页面。调入页面后访问快表用时 10ns,访问物理地址用时 100ns。总用时 10⁸ns + 220ns。

【提示】此处与教材中有所不同。教材中缺页中断只负责修改页表,快表则是在主流程中修改的,并且调入页面后 CPU 就已获得页框号,而不需要再次访问快表来获取页框号。而该题则是将修改 TLB 归入到缺页中断中去了,并且调入页面后还需要访问一次快表来取页框号,所以此题计算的 10ns 是访问 TLB 进行地址变换的时间。因此,考生在做题时应注意题目的说法,在教材与题目有一定矛盾时应按题目走。

25A5H:拆成页号 2H 和页内偏移量 5A5H。访问快表用时 10ns,由于访问 2362H 时将 2 号页面信息调入了快表,所以命中获得页框号 254H。将页框号和页内偏移量拼接成物理地址,访问物理地址用时 100ns。总用时 110ns。

(2) 根据上题分析,缺页中断过程中将 1565H 调入内存时,该进程的驻留集已满,页面置换时调出 0 号页面,并将 1 号页面调入到 101H 页框。所以其物理地址应当是 101565H。

67.【2010】(8 分) 设某计算机的逻辑地址空间和物理地址空间均为 64KB,按字节编址。若某进程最多需要 6 页(Page)数据存储空间,页大小为 1KB,操作系统采用固定分配局部置换策略为此进程分配 4 个页框(Page Frame)。在时刻 260 前该进程访问情况下表所示 (访问位即使用位)。当该进程执行到时刻 260 时,要访问逻辑地址为 17CAH 的数据。请回答下列问题:

(1) 该逻辑地址对应的页号是多少?
(2) 若采用先进先出(FIFO)置换算法,该逻辑地址对应的物理地址是多少?请给出计算过程。
(3) 若采用时钟(CLOCK)置换算法,该逻辑地址对应的物理地址是多少?请给出计算过程 (设搜索下一页的指针沿顺时针方向移动,且当前指向 2 号页框,示意图如上图所示)。

67.【参考答案】

        (1) 先确定地址结构。由逻辑地址空间和物理地址空间大小都为 64KB = 2¹⁶B 可知逻辑地址和物理地址的总位数都是 16。由页大小为 1K = 2¹⁰可知逻辑(物理)地址的低 10 位是页内偏移量。所以逻辑(物理)地址的高 16 - 10 = 6 位是页(页框)号。

根据以上分析,17CAH = 0001 0111 1100 1010B 的前 6 位是页号:0001 01B = 05H = 5

        (2) 该逻辑地址对应页号为 5,未调入内存,且该进程的页框已满。采取先进先出置换算法置换出最早装入的第 0 页。所以 5 号页面被装入页框 7,将页框号和页内偏移量 (11 1100 1010B) 接起来获得物理地址:0001 1111 1100 1010B = 1FCAH。

        (3) 由 CLOCK 算法寻找换出页面,从二号页框开始顺时针扫描,第一轮按照 2、1、0、3 的顺序扫描下来,所有页面访问位都为 1,都不选择调出,并都在扫描过后访问位置 0。第二轮扫描到 2 号页面时就发现该页面访问位为零,于是换出 2 号页面。所以 5 号页面被装入到 2 号页面对应的 2 号页框中,将页框号和页内偏移量 (11 11001010B) 拼接起来获得物理地址:0000 1011 1100 1010B = 0BCAH。

68.【2011】某计算机存储器按字节编址,虚拟(逻辑)地址空间大小为 16MB,主存(物理)地址空间大小为 1MB,页面大小为 4KB;Cache 采用直接映射方式,共 8 行;主存与 Cache 之间交换的块大小为 32B。系统运行到某一时刻时,页表的部分内容和 Cache 的部分内容分别如下表所示,图中页框号及标记字段的内容为十六进制形式。

请回答下列问题。
(1) 虚拟地址共几位,哪几位表示虚页号?物理地址共几位,哪几位表示页框号(物理页号)?
(2) 使用物理地址访问 Cache 时,物理地址应划分成哪几个字段?要求说明每个字段的位数及在物理地址中的位置。
(3) 虚拟地址 001C60H 所在的页面是否在主存中?若在主存中,则该虚拟地址对应的物理地址是什么?访问该地址时是否 Cache 命中?要求说明理由。
(4) 假定为该机配置一个 4 路组相联的 TLB 共可存放 8 个页表项,若其当前内容(十六进制)如上表所示,则此时虚拟地址 024BACH 所在的页面是否存在主存中?要求说明理由。

68.【参考答案】

        (1) 16MB = 2²⁴B,所以虚拟地址位数为 24 位,页面大小为 4KB = 2¹²B,所以低 12 位为页内地址,高 24 - 12 = 12 位为虚页号;物理地址低 12 位为页内地址,高 20 - 12 = 8 位为实页号。

        (2) 块大小为 32 = 2⁵,所以块内地址占物理地址 5 位,Cache 共 8 行,所以行号占 log₂8 = 3 位,剩下高 20 - 5 - 3 = 12 位为 Tag 位。

        (3) 虚拟地址 012 位即虚页号,为 001H。查页表得一个页表项的虚页号为 001H 且有效位为 1,故页表命中并得到实页号为 04H,组合得到物理地址 04C60H。物理地址的低 8 位中的高 3 位为 Cache 行号,计算得为第 3 行。查 Cache 发现 Tag 位不吻合,所以 Cache 未命中。

        (4) TLB 采取 4 路组相联,一共 8 行,所以有 2 组。所以虚页号的低 1 位为 TLB 组号,高 12 - 1 = 11 位为 TLB 标记号。现根据虚拟地址的高 12 位的最低一位,知 TLB 组号为 0,同时根据虚拟地址的高 11 位知 TLB 标记号为 012H,进一步查询发现 0 组里存在一个块,其有效位为 1 且标记号为 012H,故 TLB 命中。

69.【2012】某请求分页系统的局部页面置换策略如下:系统从 0 时刻开始扫描,每隔 5 个时间单位扫描一轮驻留集(扫描时间忽略不计),本轮没有被访问过的页框将被系统回收,并放入到空闲页框链表中,其中内容在下次分配之前不被清空。当发生缺页时,如果该页曾被使用过且还在空闲页框链表中,则重新放回进程的驻留集中;否则,从空闲页框链表头部取出一个页框。假设不考虑其他进程的影响和系统开销。初始时进程驻留集为空。目前系统空闲页框链表中页框号依次为 32、15、21、41。进程 P 依次访问的 <虚拟页号,访问时刻> 是:<1,1>、<3,2>、<0,4>、<0,6>、<1,11>、<0,13>、<2,14>。请回答下列问题。
(1) 访问 < 0,4 > 时,对应的页框号是什么?
(2) 访问 < 1,11 > 时,对应的页框号是什么?说明理由。
(3) 访问 < 2,14 > 时,对应的页框号是什么?说明理由。
(4) 该策略是否适合于时间局部性好的程序?说明理由。

69.【参考答案】

本题需要根据题目描述的页面管理方式进行模拟。

在 5 时刻前,内存状态:1->32、3->15、0->21。空闲队列:41。5 时刻扫描没有页面被调出。

在 5 - 10 时刻,内存中的 0 页面被访问。10 时刻扫描,1 号和 3 号页面被调出。内存状态:0->21。空闲队列:41—32—15 或 41—15—32(此处题目没有说明同时回收两个分区时的先后顺序,所以有两种可能,但不影响解题)。

在 10 - 15 时刻,1 号页面被访问,此时 1 号页面内容还在 32 号页框中,将 32 号恢复。内存状态:0->21、1->32。空闲链表:41—15。

随后 0 号页面被访问,内存和空闲队列无调整。随后 2 号页面被访问,2 号页面不在内存中,所以将空闲链表头部的 41 页框分配给 2 号页面。

(1) 根据以上分析,页框号为 21。

(2) 根据以上分析,页框号为 32。

(3) 根据以上分析,页框号为 41。

(4) 合适,时间局部性好的程序被用过的页面会在不久后又会被用到。该方法维护了一个空闲链表,调出的页面内容不会立刻被清空,只是被插入到该空闲队列。当某一页面被调出后,很快又被访问。此时系统只需要将其从空闲队列中拿掉,页面的内容依旧在内存中,无需 I/O。

70.【2015】某计算机系统按字节编址,采用二级页表的分页存储管理方式,虚拟地址格式如下:

请回答下列问题。
(1) 页和页框的大小各为多少字节?进程的虚拟地址空间大小为多少页?
(2) 假定页目录项和页表项均占 4 个字节,则进程的页目录和页表共占多少页?要求写出计算过程。
(3) 若某指令周期内访问的虚拟地址为 0100 0000H 和 0111 2048H,则进行地址转换时共访问多少个二级页表?要求说明理由。

70.【参考答案】

        (1) 页内偏移量占 12 位所以页和页框大小都是 2¹²B = 4KB。页目录号加上页表共占 20 位,所以虚拟空间大小为 2²⁰页。也可通过虚拟空间大小除于页大小的形式计算:2³²B/2¹²B = 2²⁰页。

        (2) 页表有(2²⁰×4B)/2¹²B = 1024 页,页目录有(2¹⁰×4B)/2¹²B = 1 页。故有 1025 页。

        (3) 0100 0000H 转为 2 进制后的最高 10 位是:00 0000 0100B = 4。0111 2048H 转为 2 进制后的最高 10 位是:00 0000 0100B = 4。所以二者访问的是同一个二级页表,因此只访问了一个二级页表。

71.【2016】某计算机采用页式虚拟存储管理方式,按字节编址,虚拟地址为 32 位,物理地址为 24 位,页大小为 8KB;TLB 采用全相联映射;Cache 数据区大小为 64KB,按 2 路组相联方式组织,主存块大小为 64B。存储访问过程如下图所示。请回答下列问题:
(1) 图中字段 A~G 的位数各是多少?TLB 标记字段 B 中存放的是什么信息?
(2) 将块号为 4099 的主存块装入到 Cache 中时,所映射的 Cache 组号是多少?对应的 H 字段内容是什么?
(3) Cache 缺失处理的时间开销大还是缺页处理的时间开销大?为什么?
(4) 为什么 Cache 可以采用直写(Write Through)策略,而修改页面内容时总是采用回写(Write Back)策略?

71.【参考答案】

        (1) ①由题干可知,虚拟地址(32 位)= 页号 + 页内偏移量。而页大小为 8KB = 2¹³B,占 13 位,所以 A(页号)的位数 = 32 - 13 = 19 位。B 存放的是虚页号位数(等于 A 的位数)等于 19。②物理地址(24 位)= 物理块号 + 块内偏移量。块内偏移量 = 页内偏移量,故 D 为 13 位,物理块号 C 位数 = 24 - 13 = 11。③由 Cache 采用二路组相联进一步划分为标记 + 组号 + 块内偏移量。主存块大小为 64B,所以字段 G 的位数 = log₂64 = 6。Cache 数据区一共大小为 64KB,一个 Cache 块为 64B,所以总共有 64KB/64B = 1024 块,因为采取 2 路组相联,所以有 1024/2 = 512 组,所以组号 F = log₂512 = 9。E = 24 - 9 - 6 = 9。B 存放的是虚页号。

        (2) Cache 块号由低 9 位的组号和高位的 Tag 位组成,将 4099 写成二进制 000001 0000 00000011B,所以组号等于 000000011B = 3。剩下的 H 字段内容为 000001000B。

        (3) 因为缺页需要访问辅存,Cache 缺失只需访问主存,前者带来的时间开销更大。所以缺页引发的代价大,Cache 缺失的代价小。

        (4) Cache 采用直写法是同时写到 Cache 和主存,而修改页面内容的话采用直写法是同时写到主存和磁盘,写磁盘的速度和写主存的速度相比,会慢很多,所以修改页面内容写回磁盘的话,采用写回策略比较合适。而 Cache 的写策略,因为写主存较快,所以可以采用直写策略。

72.【2017】按字节编址的计算机 M 采用二级分页虚拟存储管理方式,虚拟地址格式如下图所示:

请针对函数 f1 和函数 f1 的部分机器指令代码,回答下列问题。

(1) 函数 f1 的机器指令代码占多少页?
(2) 取第 1 条指令(push ebp)时,若在进行地址变换的过程中需要访问内存中的页目录和页表,则会分别访问它们各自的第几个表项(编号从 0 开始)?
(3) M 的 I/O 采用中断控制方式。若进程 P 在调用 f1 之前通过 scanf () 获取 n 的值,则在执行 scanf () 的过程中,进程 P 的状态会如何变化?CPU 是否会进入内核态?

72.【参考答案】

        (1) 页目录号和页号共占 20 位,从函数 f1 的机器指令代码中可以得知,该函数的所有指令高 20 位都为 00401H,所以都在同一页中。因此函数 f1 的机器代码占 1 页。

        (2) (push ebp) 的虚拟地址是 0040 1020H,高 20 位为 00401H,转换为二进制形式:0000 0000 0100 0000 0001B。高 10 位为页目录号:0000 0000 01,低 10 位为页号:0000 0000 01。所以在调用第一条指令时访问了页目录表的 1 号表项,在对应的页表中访问了 1 号表项。

        (3) 在调用 scanf () 函数获取 n 的值时,进程 P 会被阻塞,即进入阻塞状态,等待用户输入 n 后才能继续执行。等待用户输入完成并通知进程 P。当 scanf () 函数完成并返回 n 的值后,需要通过中断处理程序将进程 P 从阻塞状态唤醒为就绪状态,等待 CPU 分配时间片来执行后续的计算任务。因为 scanf 需要使用系统调用来从外设获取 n,而 P 被阻塞后也需要中断唤醒,系统调用和中断处理程序都需要在内核态下执行,CPU 会从用户态陷入内核态。

73.【2020】某 32 位系统采用基于二级页表的请求分页存储管理方式,按字节编址,页目录项和页表项长度均为 4 字节,虚拟地址结构如下图所示。

某 C 程序中数组 a [1024][1024] 的起始虚拟地址为 1080 0000H, 数组元素占 4 字节,该程序运行时,其进程的页目录起始物理地址为 0020 1000H,请回答下列问题。
(1) 数组元素 a [1][2] 的虚拟地址是什么?对应的页目录号和页号分别是什么?对应的页目录项的物理地址是什么?若该目录项中存放的页框号为 00301H,则 a [1][2] 所在页对应的页表项的物理地址是什么?
(2) 数组 a 在虚拟地址空间中所占的区域是否必须连续?在物理地址空间中所占区域是否必须连续?
(3) 已知数组 a 按行优先方式存放,若对数组 a 分别按行遍历和按列遍历,则哪种遍历方式的局部性更好?

73.【参考答案】

        (1) 页面大小为 2¹²B = 4KB。所以一页可以存放 4KB/4B = 1024 个数组元素。数组每一行有 1024 个元素,按行优先方式存放,所以一行元素恰好填满一个页面。

        所以 a [1][2] 是虚拟地址空间中第 2 页的第 3 个元素。数组的起始地址是 10800000H,10800H 为页号,所以第二页前 20 位是 10801H,第 3 个元素的偏移量是 2×4 = 8H。组合在一起得到 a [1][2] 的虚拟地址 1080 1008H。

        将前 20 位转成 2 进制:0001 0000 1000 0000 0001B,可得页目录号:00 0100 0010B = 042H,页号为:00 0000 0001B = 1H。

        a [1][2] 对应页目录号 042H,为目录中第 042H 项。页目录表起始地址是 0020 1000H,页目录项大小为 4B,可计算得 042H 页目录项对应的物理地址是 0020 1000H + 042H×4 = 0020 1108H。

        042H 页目录项存的页框号为 00301H,可知页表起始地址为 0030 1000H。页表项大小为 4B,a [1][2] 所在页号为 001H,可计算出相应页表项的物理地址是 0030 1000H + 001H×4 = 0030 1004H。

        (2) 数组是一种可以随机存取的数据结构,其逻辑地址空间必须连续。但实际的实现上,数组 a 占用了多个页面,这些页面在逻辑空间上连续,但在物理空间上不一定连续。此处是由二级页表将这些不连续的页面索引起来,达到逻辑上的连续。

        (3) 按行遍历局部性更好。数组在内存中按行优先存放,意味着数组的行内元素是相邻的,其大多处于同一页面,而不同行的元素彼此不相邻,大多不在同页面。因此行优先遍历局部性更好。

74.【2018】请根据下图给出的虚拟存储管理方式,回答下列问题。(计算机采用页式虚拟存储管理方式。按字节编址)
(1) 某虚拟地址对应的页目录号为 6,在相应的页表中对应的页号为 6,页内偏移量为 8,该虚拟地址的十六进制表示是什么?
(2) 寄存器 PDBR 用于保存当前进程的页目录起始地址,该地址是物理地址还是虚拟地址?进程切换时,PDBR 的内容是否会变化?说明理由。同一进程的线程切换时,PDBR 的内容是否会变化?说明理由。
(3) 为了支持改进型 CLOCK 置换方法,需要在页表项中设置哪些字段?

74.【参考答案】

        (1) 由图知虚拟页目录号占 10 位,虚拟页号占 10 位,页内偏移量占 12 位。虚拟地址页目录号:00 0000 0110B,虚拟地址页号:00 0000 0110B,虚拟地址页内偏移量:0000 0000 1000B。三者拼接起来转成 16 进制:0180 6008H。

        (2) PDBR 保存多级页表中最外层页表的物理地址。每个进程的最外层页表起始物理地址被保存在各自的 PCB 中,当进程上处理机时,该地址被调入 PDBR。所以进程切换时 PBDR 内容会改变。一个进程对应一个多级页表,线程共享进程的资源,并不单独具有页表。所以线程切换不会引起 PBDR 内容改变。

        (3) 为支持改进时钟算法,需要记录页面的访问和修改情况,所以需要在页表中添加访问字段(访问位 / 引用位 / 使用位)和修改字段(修改位 / 脏位)。

75.【2021】假设计算机 M 的主存地址为 24 位,按字节编址;采用分页存储管理方式,虚拟地址为 30 位,页大小为 4KB;TLB 采用 2 路组相联方式和 LRU 替换策略,共 8 组。请回答下列问题。
(1) 虚拟地址中哪几位表示虚页号?哪几位表示页内地址?
(2) 已知访问 TLB 时虚页号高位部分用作 TLB 标记,低位部分用作 TLB 组号,M 的虚拟地址中哪几位是 TLB 标记?哪几位是 TLB 组号?
(3) 假设 TLB 初始时为空,访问的虚页号依次为 10,12,16,7,26,4,12 和 20,在此过程中,哪一个虚页号对应的 TLB 表项被替换?说明理由。
(4) 若将 M 中的虚拟地址位数增加到 32 位,则 TLB 表项的位数增加几位?

75.【参考答案】

(1) 页面大小为 4KB,log₂4K = 12,故虚拟地址低 12 位为页内地址,高 30 - 12 = 18 为虚页号。

(2) 共 8 组,故虚页号的低 log₂8 = 3 位为 TLB 组号,高 18 - 3 = 15 位为 TLB 标记号。

(3) TLB 组号 = 虚页号 % TLB 组数,也就是 TLB 组号为虚页号的低 3 位,如此可知映射到的 TLB 组号为 2,4,0,7,2,4,4,4,因为 TLB 为 2 路组相联,第 4 组大于 2 次,所以只有第 4 组可能存在替换现象。第四组顺序为 12,4,12,20,加之 TLB 采取 LRU 替换算法,第 2 次访问 12 时命中,组内为 12,4,在访问 20 时,由于 12 刚被访问过,所以替换 4。

(4) 虚拟地址由虚拟块号和块内地址组成,虚拟地址的位数增加而其他参数不增加的情况下,只会引发虚拟块号增加,TLB 表项对应标记 Tag 和物理块号。当虚拟地址增加到 32 位时,每个 TLB 块的 TLB 标记位增加 32 - 30 = 2 位,表项位数增加 2 位。

3.3 章末总结

3.3.1 本章知识点提炼

1.基本存储

(1) 内存管理的功能主要包括:内存的分配与回收、地址转换、内存空间的逻辑扩充、内存共享、内存保护。地址转换是指从逻辑地址到物理地址的转换过程。

(2) 源程序到执行进程主要需经过三个步骤:编译、链接和装入。链接分为静态、装入时动态和运行时动态。装入分为绝对装入、可重定位装入和动态运行时装入。

(3) 内存保护通常可设置一对上下限寄存器或一个重定位寄存器加上界地址寄存器。

(4) 内存共享是指当多个用户进程共用同一个程序文件副本。

2.连续分配

(1) 连续分配管理方式主要包括单一连续分配、固定分区分配、动态分区分配。

(2) 单一连续分配方式是指系统将用户区整体分配给一个进程单独使用。

(3) 固定分区分配方式是指在初始化时将内存空间分割成固定大小的区域,当有程序需要运行时,系统从内存中寻找一片合适的空闲分区分配给该程序。固定分区有等分区分不等分区两种分区方式。

(4) 动态分区方法是指系统在有待运行程序时,再从内存空间中划分出一块与程序大小相当的连续区域分配出去。动态分区的分配算法有首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法。此外需要关注内部碎片和外部碎片以及内存回收的四种情况。

3.非连续分配

(1) 非连续分配管理方式主要包括分页、分段和段页式。

(2) 分页存储管理方式是指将程序地址空间分割成一定大小的页面,并按照一定的策略将这些页面调入到内存的页框中。

(3) 页面:将程序空间(即逻辑地址空间)分割成大小固定的块,这些块称为页面。页框:将内存空间(即物理地址空间)分割成大小固定的块,这些块称为页框(页框的大小与页面相同)。

(4) 页表通常存放于内存中,页表起始地址记录在进程 PCB 中,进程运行时页表起始地址被写入 PTR。

(5) 快表(也称 TLB 或 “相联存储器”)是一个具有并行查找能力的高速缓存,功能是存储页表中的部分内容,减少查询时间以提高效率。

(6) 多级页表中需要将最外层页表的大小限制在一页以内。

(7) 分段系统是指将程序(逻辑地址)划分为大小不等的块,这些块称为段。分段管理方式方便用户编程,利于编程人员组织程序的逻辑结构,对用户不透明。

(8) 段共享通常借助于共享段表。

(9) 段页式存储管理方式先将进程空间分段,再对进程空间的每一段进行分页。这种方式只有一张段表,但可能有多张页表。

4.虚拟存储

(1) 虚拟存储器是一种从逻辑上扩充内存的方法,具有请求调入功能和置换功能。该方式利用局部性原理实现了一种容量接近外存,存取速度接近内存的存储器。

(2) 虚拟存储器理论上的最大容量由 CPU 的寻址范围决定,而虚拟存储器的实际容量 = MIN (CPU 寻址范围,内存和外存的容量和)。

(3) 请求分页存储管理方式是指在分页管理的基础上增加了请求调入和内存置换两个功能的管理方式。着重关注该方式的页表项字段和地址变换过程。

(4) 页框分配策略包括固定分配局部置换、可变分配局部置换和可变分配全局置换。页面调入策略分何时调入和从何处调入两类。

(5) 页面置换算法包括 OPT、FIFO、LRU、LFU、CLOCK 和改进型 CLOCK。

(6) 内存映射文件是指进程通过发起一个系统调用,实现从进程对应磁盘文件到其虚拟内存空间中某部分的映射。这一机制可以提升系统的 I/O 效率,从而减少虚拟存储器带来的 I/O 开销。

(7) 抖动现象:单个进程分配到的内存块少于某个数目时,该进程的页面会频繁地进行换入换出,导致缺页率急剧升高。工作集是指在一段时间间隔内,某一进程实际所要访问页面的集合,通常以未来一段时间将会访问的页面代替。访问内存有效时间(EAT)计算要熟练掌握。

3.3.2 思考题解析

(1) 为什么要进行内存管理?内存管理有哪些功能?

答:内存是计算机中一种有限的重要资源,内存增大的速度远不及程序量的增长速度,所以内存无法装入所有程序。因此操作系统需要合理分配与管理内存,从而高效地使用内存。内存管理的功能主要包括:内存的分配与回收、地址转换、内存空间的逻辑扩充、内存共享、内存保护。

(2) 各非连续存储管理方式中,逻辑地址变换为物理地址的流程是怎样的?

① 分页存储管理方式(不含 TLB),如图 3.36。

② 分页存储管理方式(含 TLB),如图 3.37。

③ 分段存储管理方式,如图 3.38。

④ 段页式存储管理方式,如图 3.39。

⑤ 请求分页存储管理方式,如图 3.40。

(3) 为什么要引入虚拟存储器?虚拟存储器为什么有效?

        答:内存大小的增长速度远不及程序大小的增长速度,导致操作系统的并发进程数减少,甚至出现程序比内存大从而无法装入的情况。所以需要引入可以部分装入程序的虚拟存储器概念,来从逻辑上扩充内存容量,从而缓解内存大小不足的问题。虚拟存储器之所以有效主要归功于程序所普遍具有的局部访问特性,这一特性保证了虚拟存储器能够具有较低的缺页率,从而拥有接近内存的存取速度。

(4) 影响虚拟存储器性能的因素主要有哪些?

        答:影响虚拟存储器性能的主要因素是缺页率,而影响缺页率的主要因素有:页面大小的选择、分配给进程的内存块数、页面置换算法、程序是否具有良好的局部访问特性。其中分配给进程的内存块数受物理块分配策略、内存大小、并发进程数影响,且当分配给进程的物理块数过少时,系统会发生抖动现象,这将严重影响虚拟存储器的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值