第 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) 内存保护:采用界地址保护和存取访问控制等方式,控制进程只能访问自己有权访问的内存部分,从而防止用户进程对操作系统的干扰或用户进程之间的相互干扰。内存管理由操作系统执行,上层程序用户并不需要关心其实现细节,这有效提高了计算机系统的易用性,提高了上层编程人员的开发效率。接下来从现代存储系统的多层结构开始,逐一对内存管理的各项功能做详细介绍。
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个内存单元。每个内存单元对应一个地址,依次为
,则至少需要[log235G]=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.重定位
重定位是指将程序文件装入到与其文件内部地址空间不一致的外部地址空间时,需要完成的地址修改过程。这个过程可能发生在程序文件装入、内存置换和紧凑等过程中。重定位可分为静态重定位和动态重定位。静态重定位是指程序文件在被装入内存时,一次性完成地址的修改,重定位在程序运行前就已经完成。下一节介绍的可重定位装入方式就是采用了静态重定位。
动态重定位是指在 CPU 访问文件时使用动态地址变换机构这类硬件来自动完成地址变换,重定位发生在程序执行时。下一节介绍的动态运行时装入方式就是采用了动态重定位。
7.程序的装入和链接
从源程序到执行进程主要需经过三个步骤:编译、链接和装入,源程序经过编译成为一组目标模块(此时形成逻辑地址),然后经过不同的链接和装入过程成为执行进程。
(1) 编译:使用相关编译程序编译源程序,形成一系列的目标模块 。
(2) 链接:使用链接程序将编译所形成的目标模块连同所需要的相关库函数链接在一起,形成一个完整的装入模块。这期间需要对目标模块内的地址数据做修改 ,形成逻辑地址。
(3) 装入:使用装入程序把链接形成的装入模块装入到内存 ,形成物理地址。(1) 程序的装入
① 绝对装入方式:绝对装入方式是指在预先知道装入位置时,在编译过程中就将逻辑地址转换为物理地址。这一装入方式只适合于单道程序系统,因为在大多数系统中,程序的装入位置都是无法预先知道的。
② 可重定位装入方式:可重定位装入方式是指在装入的过程中,根据装入位置将装入模块中的逻辑地址修改为物理地址,即装入前是逻辑地址,装入后是物理地址。可重定位装入方式克服了绝对装入方式的缺点,不再需要预先知道装入位置,但该方式不允许程序在运行时移动位置。
③ 动态运行时装入方式:动态运行时装入是指模块被装入内存后不更改其中的逻辑地址,逻辑地址转换为物理地址的过程被推迟到模块执行时。系统需要提供一个基址寄存器(记录程序起始地址 )来支持这一地址变换过程,即物理地址 = 基址寄存器中的程序起始地址 + 逻辑地址。目标模块在装入后有可能还会调动位置,动态运行装入方式可以很好地应对这一情况。【提示】采用动态运行时装入方式,程序在装入内存后,所有地址依然是逻辑地址;只有在程序执行时,才会进行逻辑地址到物理地址的转换。
(2) 程序的链接
(1) 如图 3.9 所示,静态链接方式是指将编译获得的目标模块在装入前链接成一个完整的装配模块后,再将其装入内存。
(2) 装入时动态链接是指将目标模块一边装入内存一边进行链接,优点如下:
(a) 由于目标模块并未被提前链接为一个整体,方便单独修改其中的一个或几个目标模块,而不需要重新打开整个装入模块。
(b) 方便对其中的一个或几个目标模块进行重用,多个不同的装入模块可以使用同一个目标模块。
(3) 运行时动态链接是指在运行前不将目标模块链接成整体,而是在程序运行过程中需要用到某一模块时,再将该模块调入内存进行链接。此方式可以加快程序装入过程,同时节省内存空间。
8.内存保护
在多道程序处理系统中,为了保证进程运行的确定性和稳定性,需要为进程设置内存保护机制,以防止用户进程对操作系统的干扰及用户进程之间的互相干扰。内存保护是指设置一定的机构来保证进程在未被允许的情况下,不能访问分配给其他进程的内存空间,从而保护进程数据不受外界干扰,实现存储安全。内存保护中检查进程所要访问的内存单元是否属于自己,通常需要在运行时来检查所有的内存访问。在分页分段等存储方式中,统一在地址变换机构中实现了内存保护。
通常的内存保护机构有以下两种:
(1) 一对上下限寄存器,分别记录当前作业的起始地址和尾址。CPU 访存时验证访问地址是否处于二者之间。
(2) 一个重定位寄存器(或基址寄存器)和界地址寄存器(限长寄存器)。重定位寄存器记录作业的起始地址,界地址寄存器记录作业的长度,CPU 访存时比较访问地址是否处于起始地址和尾址(尾址 = 起始地址 + 长度 )之间。9.内存共享
在多道程序处理系统中,几个不同的用户可能同时运行相同的程序,此时若在内存中为每一个用户进程都保留该程序的一个副本,则较为浪费内存空间。采取内存共享则可以有效地避免同一程序的不同副本带来的内存浪费。内存共享是指当多个用户进程需要用到同一个程序文件时,只在内存中保留该程序文件的一个副本,令共享该程序文件的进程都指向其所在的内存空间。由于进程运行时可能会对程序文件进行修改,这会造成不同进程之间的互相影响。所以被共享的内容应当是那些不会被修改的部分,这部分代码被称之为可重入代码又称为 纯代码。
通常可将程序分为指令部分 I 和数据部分 D,其中的指令部分通常不会被修改。若程序能做到 I 和 D 的分离,将有利于进行内存共享。
但是对 I 部分的共享依旧存在一定的问题,虽然 I 部分不会被修改,但当某个共享进程不再使用共享内容时,该部分文件将会被调出内存,这会造成其他共享进程的大量缺页。所以,对于被共享的文件内容,应当在所有共享进程都不再需要其时,再将其调出内存。要确定该文件内容是否已被所有共享进程所释放,系统需要遍历所有进程的页表,这一操作的代价较大。所以,系统中通常需要为此设立一个新的数据结构,用以记录内存中的共享内容、当前有多少进程共享该内容等信息,段式内存管理方式中介绍的共享段表便是这类数据结构的一种。
3.1.2 连续分配管理方式
连续分配管理方式指系统为需要运行的程序分配一片连续的内存空间,并将其装入到这片空间中。该类方式需要将程序文件完整地放入到内存的一片连续空间里,即意味着对于单个程序,其文件的物理地址是相邻的。
连续分配管理这一类方法的想法比较直接,是最早出现的内存管理方式,主要包括单一连续分配、固定分区分配、动态分区分配。其中的动态分区分配如果使用了动态重定位实现紧凑来解决外部碎片问题,则被称为动态可重定位分区分配。
1. 单一连续分配
单一连续分配方式是指系统将用户区整体分配给一个进程单独使用,该方式只适用于单道程序环境。
在单用户单任务的操作系统中,机器由一个用户独占,不存在其他用户的干扰,所以可以不设置存储器保护措施,该方式安全性较高且容易实现。
单一连续分配方式下操作系统不能并发,CPU 有大量时间处于空闲状态(如等待 I/O),机器运作效率低下。
(1) 优点:无外部碎片,无需内存保护,安全性较高且容易实现。
(2) 缺点:有内部碎片,存储器利用率低,无法运行多道程序,操作系统效率低。【提示】内部碎片和外部碎片将在本章的后续部分阐明,此处只需对此有一定印象即可。
2. 固定分区分配
20 世纪 60 年代及之后出现的多道程序系统,能同时将多个程序装入到内存之中。为了使程序之间互不影响,需要为这些程序各分配一片独立的内存空间,固定分区分配方式就是可以满足多道程序系统要求的内存管理方式之一。
固定分区分配方式是指在初始化时将内存空间分割成固定大小的区域,当有程序需要运行时,系统从内存中寻找一片合适的空闲分区分配给该程序。等程序运行结束后,系统再将这片区域回收,并从待运行程序队列中选择一个合适大小的程序装入。
(1) 分区方法
·分区大小相等:所有用户空间的内存分区大小是一样的,这种方式灵活性较差,程序较小则会产生内部碎片,程序较大则无法装入。
·分区大小不等:根据用户运行程序大小的统计分布规律来决定用户空间的分区大小比例。内存通常被分为较多的小区域,适量多的中等区域,较少的大区域。装入程序时,根据程序的大小选择合适的分区,从而减少内部碎片造成的浪费,也在一定程度上缓解了大型程序无法装入运行的棘手问题。
![]()
(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)
首次适应算法是指将空闲分区按照地址升序排序,每一次都从头向后查找,在第一个足以容纳该程序的连续空间中划分出程序所需的空间。
该方法倾向于使用低址空间,优点:保留了高址空间的大连续空间,利于后续到来的大程序装入。缺点:① 频繁在低址部分划分空间,容易在这部分区域留下较多的外部碎片。② 每次查找都从低址开始,查找开销偏大(低址空间被优先分配出去了,但被查找的频率却最为频繁)。
② 循环首次适应算法 (Next Fit, NF)
循环首次适应算法是指将空闲分区按照地址升序排序,设置一个查找指针从头向后查找,随后的每一次查找都从上次查找后指针的停留位置开始。
优点:该方法可以在一定程度上缓解首次适应算法的两个弊端,使得空闲分区分布的更为均匀。缺点:该方法会将本可保存在内存末尾的大空闲区域分裂为小空闲区域,会造成缺少大空闲分区的状况。
③ 最佳适应算法 (Best Fit, BF)
最佳适应算法是指将空闲分区按大小升序排列,依次查找,选择第一个可以容纳程序的空间分配出去。该方法选取最小的可以容纳程序的空闲分区进行分配。
优点:能留下更多大分区以满足大进程需求,缺点:该方式从整体空间的利用效率来看不一定是真正的最佳,因为这样划分容易留下许多小空间分区,其外部碎片是这四种方法中最多的。该算法需要对空闲分区按大小排序,开销大。
④ 最坏适应算法 (Worst Fit, WF)
最坏适应算法指选择所有空闲分区中最大的分区来分配给程序,若最大的空闲分区不够大,则分配失败。优点:可以减少外部碎片的产生,缺点:使得内存中缺少大空闲分区。无论何种方法,都有各自的优点和缺点。为了减少外部碎片往往会造成大空闲分区的缺失,而反过来也是相同。所以在选择方法时,需要在这二者之间寻得一个合适的平衡点。实际上,看起来最简单的首次适应法在实际使用中的效果最好,它实现起来简单,需要的额外开销小,并且处于最佳适应和最坏适应之间,较为均衡。
(4) 回收内存
程序运行完成后要释放相应的内存空间,系统需要将该空间回收,并加入到空闲分区表(链)中。下面以空闲分区表作为被使用的数据结构来详细介绍一下内存回收的过程。
回收的内存空间可能出现以下四种情况:
(a) 回收空间的头与尾都不与任何空闲区域相邻,则在空闲分区表中增加一个表项来记录该回收空间。
(b) 回收空间的头部与一个空闲区域相邻,则在该空闲区域表目中的空间大小数据项里加上所回收空闲区域的大小。
(c) 回收空间的尾部与一个空闲区域相邻,则除了在该空闲区域表目中的空间大小数据项上加上所回收空间区域的大小,还要将起始地址数据项改为回收空间的起始地址。
(d) 回收空间的头部及尾部都与现有空闲区域相邻,则要合并这两个空闲区域的表项,新表项的起始地址为低地址的空闲区域的起始地址,空间大小为三者的和。【例 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 小题完成,以巩固相关知识。
3.1.3 非连续分配管理方式
1. 非连续存储概述
非连续分配管理方式是指将一个完整的程序分割开,放入不相邻的空闲分区中。
非连续分配管理方式有效地解决了连续存储方式中存在的内存浪费(外部碎片)问题。不过由于需要存储额外的索引信息,该种方式下内存的存储密度比连续存储管理方式更低。【提示】存储密度是指有效信息在所有存储信息中的占比。
按照程序逻辑空间分割大小是否固定,可分为分页存储管理方式、分段存储管理方式以及将二者相互结合的段页式存储管理方式。分页(段)存储管理方式按照是否有请求调入和页面置换功能,可以分为基本分页(段)存储管理方式和请求分页(段)存储管理方式。
分页存储管理和分段存储管理方式将在本章接下来的内容中讲解,而请求分页管理方式则会在下一章节再做叙述。
内存管理方式分类如图 3.13 所示。
2. 分页存储管理方式
页面(Page):将程序空间(即逻辑地址空间)分割成大小固定的块,这些块称为页面。
页框(Frame):将内存空间(即物理地址空间)分割成大小固定的块,这些块称为页框(页框的大小与页面相同)。【提示】应选择适中的页面大小,并且该大小应是 2 的指数倍,主要选择设定在 1KB - 8KB 这个范围内。因为页面设置过大会导致内部碎片的增加,而页面设置过小则会使得一个程序占据过多的页面,使页表变得过于庞大,降低存储密度。
分页存储管理方式是指将程序地址空间分割成一定大小的页面,按照一定的策略将这些页面调入到内存的页框中。同一个程序的页面被调入到的页框不一定相邻,系统为了管理这些分散的页面,需要为分页管理方式建立一个称之为页表的索引。
(1) 地址结构
如图所示,系统按字节编址,用 32 位二进制数来表示程序的逻辑地址。32 位的二进制数可以表示的范围是~,每个数字对应一个内存单元,共可编址 4G 个内存单元。每个内存单元的大小是 1B,所以这一长度的地址可表示的程序最大应为 4GB。
现在将页面大小选定为 4KB,即进程最多有4GB/4KB=1M页。其中第 0 页所占的地址号为:0x00000000−0x00000fff,可以看到,地址的高 20 位(可以表示 1M 页)所表示的数字便是页号,低 12 位(可以表示 4KB 空间)表示的数字则是该内容在页内的偏移量。
(2) 页表
在连续分配方式中,只需要在进程的 PCB 里记录其在内存中的首地址及程序大小,就可以轻松地找到该程序。但在分页存储管理方式中,程序文件的页面被分配在了内存中不相邻的分区中。于是系统需要提供一种被称为页表的数据结构来记录页面与页框的对应关系,每一个进程都有自己的页表。如图 3.15 所示,页表内包含一系列大小固定的页表项,页表项中记录了进程某一页所对应的页框号,页号则隐含在页表项相对页表起始地址的偏移量中。
(3) 地址变换
由于地址变换的发生频率较高,理论上使用硬件来完成地址的变换能有效提高系统的运行效率。但是,为每一个页面都分配一个寄存器用以实现页表结构的代价十分昂贵,所以,系统通常只好将页表置于内存空间中,在系统中只设置一个页表寄存器来存放页表的起始地址。【提示】多核 CPU 中,每个核心都有一套寄存器,其中就包括页表寄存器。所以在多核 CPU 中页表寄存器不只有一个,CPU 中的每个核心都有一个页表寄存器。
页表的起始地址在程序装入时被记录在该页表进程的 PCB 中,当该程序上处理器时,才将页表起始地址存入页表寄存器(PTR),这样的实现方式下,所有进程可以共用一个页表寄存器。
接下来详细地介绍将程序的逻辑地址转换为物理地址的过程。
① 基本的地址变换机构
如图 3.16 所示,当进程需要访问某个逻辑地址时,从逻辑地址到物理地址的变换过程如下:将逻辑地址的页号与页表长度做比较,若页号大于页表长度,则越界。
若未越界,则通过页号在页表中定位到相应的页表项,再从该页表项中获得对应的页框号(块号)。
最后将页框号和逻辑地址中的页内偏移量组合在一起,形成对应的物理地址。
② 具有快表(TLB)的变换机构
从前面的变换流程中可以看到,系统想要访问一个逻辑地址时,需要访问两次内存;第一次从内存里的页表中取出页框号,第二次根据物理地址取出相应的数据。
系统的访存开销相较于连续分配管理方式增加了很多,这是因为多出了一次对内存中页表的访问。如果可以把页表存放在一个访问速度更快的存储器件中,就可以大大减小这一开销。
为了提高访问效率,系统可以在 CPU 的 Cache 中设置一个具有并行查找能力的高速缓存来存储页表,这个存储器被称之为快表(也称 TLB),使用相联存储器实现。由于高速缓存造价昂贵无法做到很大,所以快表只是存储了页表的一小部分。
加入快表后的变换过程如图 3.17 所示。该变换过程与未加入快表时的不同之处,在于系统会先从快表中查找该逻辑地址所对应的页框号。若快表中未找到就去内存中的页表里查询(也可实现为同时查找),并将查询到的页表项存入到快表中。当快表存满时就涉及如何选择合适的页表项换出的问题,这与虚拟内存中的页面置换方法相似,将在下一章中再做详细介绍。
接下来分析设置快表对系统带来的影响,先引入内存的有效访问时间(Effective Access Time,EAT)这一概念,它代表从进程发出地址访问请求到从内存中获得该地址对应物理地址中所存数据的这一段时间。
在只有一级页表的分页管理方式中,EAT 主要包括第一次访问内存从页表中获得页框号,以及第二次访问内存获得所需要的文件内容这两部分。在引入快表后,第一次访存时间以一定概率被替换成访问快表的时间,这个概率称之为快表命中率,即每次地址变换能直接从快表中获得页框号的几率。采用合适的调度算法,可以将快表的命中率控制在 90% 以上,而快表的访问时间远远低于访存时间,从而使得内存的有效访问时间大大减小。【举例】假设系统访问快表用时 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 方法是十分相似的,考生可以将二者放在一起阅读学习,并且也可与后续的虚拟内存结合在一起分析对比。
(4) 两级和多级页表
如前所述,操作系统在进程的 PCB 中记录页表起始地址和大小,这意味着系统默认页表只有一页,但当进程较大时页表也会很大,页表本身也需要被划分为许多页,这些用来存储页表的页在内存中同样会是分散不连续的,此种情况下只在 PCB 中记录页表的起始地址将行不通。此外,现如今大多数家用计算机都是 64 位机器,大多使用 48 位二进制数表示程序的逻辑地址。如果页的大小为 4KB,每个页表项长 8B,那么每个进程的页表都会占据惊人的248B/4KB×8B=512GB。这显然是无法接受的。因此设计者需要通过二级页表的组织形式来映射这些较大的程序,以及减少对内存的占用。内层页表是程序文件的索引,外层页表是内层页表的索引,PCB 中记录的内容也就相应更改为外层页表的起始地址。当然这依旧要求外层页表只能有一页,否则需要继续向上叠加索引,最终保证最外层页表只有一页。
如图 3.18 所示,外层页表与内层页表都是逻辑地址到物理地址的映射。二者的主要区别在于外层页表所指向页框中的内容是内层页表,而内层页表所指向页框中的内容是程序文件。
使用二级页表组织形式时,逻辑地址可被分割为图 3.19 所示的三部分。使用页目录号从外层页表中获得包含所需内层页表项的页框,再根据页号获得包含所需内容的页框,后续步骤则与单级页表无异。当然,使用二级页表组织形式时,外层页表依旧可能很大,但设计者可以像套娃一样不断向上叠加页表层次,直到最高层页表不大于一个页面,这就是多级页表。
【提示】在叙述多级页表时,不方便直接使用外层与内层来描述页表层次。所以在接下来的内容中,将页表按层次由内到外依次命名为 1 级至 n 级页表。
需要注意的是,在题目中判断页表相对层次时,需要根据题目中出现的明确表述或者是地址结构形式。因为上述命名只是出于方便考虑,并无统一规定。但就 21 年 408 真题的第 29 题来说,未作说明应当以最内层作为 1 级页表。
而本文是以最内层作为 1 级页表来做叙述的,这是因为这一命名方式下,改变页表总层次时,内层页表名称不会产生变更,有利于笔者描述计算过程和考生理解多级页表的机制。
接下来以 16GB(逻辑地址共 34 位)的程序文件为例做一次具体的计算。假设系统按字节编址,页面大小为 4KB,页表项大小为 4B,那么该程序文件共分为16GB/4KB=4M页。同样可以计算出一个页面所能存入的页表项为4KB/4B=1K个,因此页表应占据4M/1K=4K页。将页表使用二级页表索引起来,则共有4K/1K=4页二级页表。因此系统应当进一步使用三级页表来索引二级页表,三级页表只有一页,其中包含有四个页表项目,分别指向四个存储有二级页表的页框。
多级页表的内存访问有效时间与一级页表情况下的计算过程是相似的。前面分析中一级页表需要一次访问内存查找页表的时间,那么从二级页表的机制可知,二级页表是一级页表的页表,即二级页表需要有两次访问内存查页表的时间,更高级别的时间只需类推即可。如上一段例子所述,该例中存在三级页表,则需要三次访问内存查页表时间,得到物理地址后再访问一次内存获得数据,全程共四次访问内存。
【提示】假设页表有 n 级,访问 n - 2 级页表都是在获得其低一级页表中对应页面的页框号。而访问 1 级页表获得的则是所需内容存储位置的页框号,这时将该页框号与逻辑地址的页内偏移量组合在一起得到的就是所需内容的物理地址。最后需要根据该物理地址再进行一次内存访问,从而获得所需要的程序内容。
3. 分段存储管理方式
先前所介绍的这些内存管理方式都由操作系统来完成,其对工作于操作系统之上的用户来说是透明的。分段存储管理方式虽然在方法设计上与分页存储管理方式大同小异,但因其分段大小划分的灵活性,可以较好地满足用户在编程和使用上的自组织需求,也因如此,这个方式对于用户来说是不透明的。
【提示】计算机系统中的透明一词的意思是指该过程对上层用户不可见。上层用户无需关注其实现细节,只需要知道该过程实现了什么功能,怎么使用这一功能即可。
我们容易将透明理解为某一过程的上层遮挡物是透明的,从而将某一过程透明理解为对上层用户可见。实际上这里的透明与不透明指的是该过程本身而不是其上层遮挡物,所以透明是指某一过程对上层用户不可见,就好像该过程穿上了隐身衣一般。
(1) 分段存储管理方式的特点
分段系统是指将程序(逻辑地址)划分为大小不等的块,这些块称为段。分段管理方式方便用户编程,利于编程人员组织程序的逻辑结构。该方式最根本的优点便是其管理方式的动态性和段的逻辑单位性,以下具体介绍其特点及优势之处。
(a) 方便编程
汇编程序编写通常按照自身逻辑关系被划分为几个段,这与分段管理方式的逻辑地址空间形式十分契合,所以分段管理极大地便利了程序员的程序编写工作。
(b) 信息共享
分段中的段不同于分页的页面,这里的段是一个有内容共性的逻辑单位体,这个特性有效提高了程序段的可复用性,多个进程可以方便地共享某段内存文件的内容。【提示】将段称为有内容共性的逻辑单位体是指每一个段都有其明确的完整作用,而不会像分页一样,完成某个内容的程序文件可能被分割在不同页中。
(c) 信息保护
同样是因为程序段是一个逻辑单位的这一特性,系统可以方便地对特定的函数、数据等逻辑单位设定其读写方式和权限列表,有效保证进程的信息安全。
(d) 动态增长
进程在运行的过程中,有部分内容会随着运行而增长,较为明显的就是数据段。这种情况下,分页存储管理方式比较适合预先分配,不利于应对这一状况,而分段系统中段长度可变,不需要确定各个段共同的固定大小,从而容易实现动态分配,可以较好地解决这一问题。
(e) 动态链接
动态链接中,为了提高内存的利用率,系统只将进程当前需要用到的程序内容装入内存。对于实现这种动态链接的程序而言,该程序是一边运行一边进行链接的,其链接单元应当是一个个实现某一功能的独立逻辑单位,这恰符合分段管理方式中段的划分原则。所以分段管理方式十分利于实现动态链接。(2) 分段系统的基本原理
(a) 地址结构
如图 3.20 所示,分段管理方式中,程序文件被划分为一个个逻辑单元,每个逻辑单元单独成段。所以,与分页系统相似,其地址结构由段号和段内地址两部分组成。
(b) 段表
由于段与段之间的大小并不相等,所以想要记录一个段的信息必须要有两个变量,通常以段长和起始地址作为记录变量。如图 3.21 所示,段表中记录了从段号到(段长,起始地址)数据对的映射,所以一个段表项应要同时包含以上三个信息,其中的段号隐含在段表项与段表起始地址的相对位置中(段表项的大小是相等的)。
段表项中包含该段在内存中的起始地址和段长两个数据项,而其段号为该表项在段表中所处的位置次序。(段表项从 0 开始依次编号 )
(c) 地址变换机构
分段存储管理方式的地址变换机构如图 3.22 所示。地址转换过程如下:
① 将逻辑地址的高位段号取出,与段表长作比较,段号大于表长则越界。
② 若未越界,则找到相应段表项,将段长与逻辑地址低位的段内偏移量比较,若偏移量大于段长则越界。
③ 若未越界,则将段表项中的段起始地址与逻辑地址的段内偏移量组合起来,获得对应的物理地址。
(d) 段的共享与保护
段的保护:由于分页与分段的保护方式大致相同,在此做统一说明。分页和分段的主要保护方式都为界地址保护和存取控制保护。
界地址保护通过逻辑地址与段(页)表信息的比较来防止进程的越界访问。在分页方式中,将页号与页表的长度做比较,若页号 > 页表长度则产生越界中断。需要说明的是分页方式的页内偏移量与页表大小严格对应,不会造成越界。在分段方式中,段号和段内偏移量需要同时显性给出,判断访问是否越界也需要进行两次:1)若段号 ≥ 段表长度,则产生越界中断。2)查询段表时,若段内偏移量 > 段长,则产生越界中断。
存取访问控制通过对进程段(页)进行访问权限设置以保护其信息。系统内存中的段页设置只读、读 / 写、不可访问等限制,访问相关页面时进行权限检查。段的共享:实现段共享时,除了每个进程自身的段表外,系统还设置了一个供相关进程共同使用的共享段表。如图 3.23 所示,共享段表的表项中除记录该共享段的物理地址等相关信息外,还设置了一个 count 字段用于记录共享该段的进程数。
当P1进程与P2进程共享段S时,段S在内存中只有一份,P1与P2的段表中对该共享段的记录与正常段相同,二者分别有一个段表项记录该段的物理地址。同时共享段表中也会有一个表项记录段S的物理地址等信息,并记录共享段S的进程数及相关信息。需要注意的是,段S的物理地址是唯一的,但其在P1和P2中的逻辑地址是不同的。自然,段S在P1段表、P2段表与共享段表中的段号是不一定相同的,三者没有必然关联。
由于共享段被多个进程共享,在其中某一个进程释放该段时,系统并不会直接调出该段,而是将共享段表中的 count 减去 1。只有当共享段的 count 减至 0 时,系统才会将该段调出内存。【提示】在相关教材中,称分页的地址空间是一维的,而分段的地址空间是二维的。容易令考生产生困惑的是:分页与分段的地址结构都被分为页(段)号和页(段)内偏移量两个部分,而二者的空间维度却不同。
从这两种方式的地址结构来看,它们都由两个变量组合而成,所以看上去都是二维空间。而之所以分页的地址空间为一维,是由于页号和页内偏移量并不是两个独立变量。我们可以只给出某一数据在逻辑地址空间中的相对位置这一个变量,根据页面大小来直接计算出数据处于的页号和页内偏移量。而分段系统中的段大小不等,所以段号和段内偏移量这两个变量是独立的,必须显性给出。
例如,8086 CPU 就使用了分段式内存管理,其程序计数器 PC 就保存在 CS 和 IP 两个寄存器中,写作 CS:IP。CS(Code Segment,代码段寄存器)存储代码段的地址,IP(Instruction Pointer,指令指针寄存器)存储下一条指令在代码段中的段内偏移。这就是 “二维” 的体现。4. 段页式存储管理方式
如图 3.24 所示,段页式存储管理方式是分页式存储管理方式和段式存储管理方式的结合。段页式存储管理方式先将进程空间分段,再对进程空间的每一段进行分页,所以进程空间被划分的最小单位仍旧是页,这些页分属于进程的某一段。按此逻辑,物理内存空间也应当是要被划分为与页具有相同大小的内存块,实际上也确实如此。
(1) 地址结构
如图 3.25 所示,段页式存储方式的地址结构由高位部分的段号、中间部分的页号和低位部分的页内偏移量三个部分共同组成。![]()
(2) 地址变换机构
段页式存储方式需要为整个进程提供一个段表,并为每一个段提供一个页表。如图 3.26 所示,地址变换过程如下:
(a) 用虚拟地址中的段号部分到段表中进行查询,获得该段号对应页表的首地址。
(b) 通过该首地址找到相应的页表。
(c) 用虚拟地址中的页号部分到页表中进行查询,获得该页号所对应的内存块号。
(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. 410K7.【参考答案】 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. 89KB9.【参考答案】 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. 10MB10.【参考答案】 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. 280KB16.【参考答案】 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. 523.【参考答案】 C
【解析】一个页面中能装入的页表项数N=4KB/8B=512=29。逻辑地址空间页面数M=256TB/4KB=236个。最外层页表只能占一页,所以需要⌈36/9⌉=4级页表。C 正确。24.以下对分页存储管理方式中页面大小的说法中正确的是( )。
I. 选择较大的页面可以降低页表的大小,提高有效数据存储密度
II. 选择较小的页面可以减少内部碎片,从而更充分地利用内存空间
III. 选择较大的页面可以减小页表,并减少内部碎片,所以页面越大越好
A. I、II
B. I、II、III
C. I
D. II、III24.【参考答案】 A
【解析】进程最后一页中会产生平均半页的内部碎片,选择较小的页面时,可以减小这一内部碎片浪费。选择较大的页面可以降低页表的大小,提高有效数据存储密度。但页面太大会增加内部碎片,造成内存空间的浪费。所以应当选择大小均衡的页面大小,而不是越大越好。所以 I、II 正确,III 错误。25.在下列内存管理方式中,会产生内部碎片的有( )。
I. 分段存储管理
II. 动态分区存储管理
III. 请求分页存储管理
IV. 段页式存储管理
A. I、II
B. I、II、III
C. 仅 I
D. III、IV25.【参考答案】 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、III27.【参考答案】 C
【解析】增大快表可以提高快表命中率,从而减少访存次数,所以 I 正确。页表常驻内存可以提高查询页表的速度,从而加速转换,所以 II 正确。增大交换区是内存不够用时的手段,与加速地址转换无关。所以 III 错误。28.系统按字节编址,采用分页式存储管理方式管理内存,逻辑地址结构如下图所示。假设逻辑地址空间大小为2^26B,页面大小为2^10B,页表项大小为 2B。问该系统的页目录表中至少需要包含多少个页表项( )。
A. 32
B. 128
C. 64
D. 25628.【参考答案】 B
【解析】本题采用两级页表,一个页面可放置页表项数N=210/2=29,逻辑地址空间页数M=226/210=216。所以页表大小为216/29=27页。因此页目录表中应有27=128个表项。29.系统按字节编址,采用请求分页存储方式管理内存,系统的逻辑地址空间大小为2^48B,页面大小为2^13B,页表项大小为 8B,则该系统页表的级数应当是( )。
A. 5
B. 3
C. 4
D. 229.【参考答案】 C
【解析】一个页面中能装入的页表项数N=213B/8B=210。逻辑地址空间页面数M=248B/213B=235个。最外层页表只能占一页,所以需要⌈35/10⌉=4级页表。C 正确。30.采用分段存储管理的系统,若地址用 24 位表示,其中 8 位表示段号,则允许每段的最大长度是( )。
A. 2^16
B. 2^24
C. 2^28
D. 2^3230.【参考答案】 A
【解析】段内偏移量所占位数 = 地址位数 - 段号位数=24−8=16。所以最大段长为216。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. 3125833.【参考答案】 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. 437.【参考答案】 B
【解析】分段需要一次访问内存查询段表,获得物理地址后再访问一次内存获取数据。共两次。选择选项 B。38.在采用段页式存储管理方式的计算机系统中,从 CPU 给出逻辑地址到取得内存中相应的数据,这一过程中总共需要进行( )次内存访问。
A. 1
B. 2
C. 3
D. 438.【参考答案】 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,1840.【参考答案】 D
【解析】页内偏移量位数=log24K=12,页号位数=log2512=9,页框号位数=log264=6。所以逻辑地址位数=9+12=21,物理地址位数=6+12=18。41.某系统采用分页式存储管理方式,以下关于该系统的说法中正确的有( )。
I. 分页存储系统不会产生外部碎片,但是会产生内部碎片
II. 若该计算机系统不使用快表(TLB),且页表只有一级,则进程访问内存数据时,需要进行至少两次内存访问
III. 分页存储管理系统可以采用静态重定位方式
IV. 分页存储管理系统中的页面概念对用户是透明的
A. I、II
B. II、III
C. 全部
D. I、II、IV41.【参考答案】 D
【解析】分页存储管理方式下,进程装入内存后可能会改变位置,不能采用静态重定位,所以 III 错误。I、IV 正确。分页存储不用 TLB 时至少需要一次访存查页表,和一次访存取数据,所以 II 正确。42.计算机系统按字节编址,采取分页存储管理方式管理内存。虚拟地址 64 位,页面大小为 4KB,页表的页表项大小为 4B。据此可以计算出该系统需要将页表组织成( )级。
A. 4
B. 5
C. 6
D. 742.【参考答案】 C
【解析】页面数=264B/4KB=252,一页可存放的页表项数=4KB/4B=210。所以应组织成⌈52/10⌉=6级。43.在分页存储管理系统中,页表内容如下表所示 (均从 0 开始编号)。若页面大小为 4KB,则地址转换机构将逻辑地址 0 转换成物理地址( )。
A. 8192
B. 4096
C. 2048
D. 102443.【参考答案】 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、646.【参考答案】 C
【解析】由题意可知,共有 7 位来表示页号,因此共有27个页面,页面大小为211B(2KB),主存最大容量为27×2KB=256KB,在分页存储管理系统中,内存块数 = 页面数=27。由于该指令所在页的页号为 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。
| 分区起始地址 | 分区大小 |
| ---- | ---- |
|28M|4MB|
|42M|18MB|表 3.6 首次适应算法
(2) 由题知,采用最佳适应算法时,会将空闲分区按大小进行排序,在进行分配时,查找已排好序的空闲分区链,找到第一个能满足大小的空闲分区,见表 3.7。
分区起始地址
分区大小
59M
1MB
26M
6MB
36M
15MB
表 3.7 最佳适应算法
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,共有214个页面,位示图通过 1bit 表示 1 个页面,共需要214个 bit,也就是214/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. 15MB52.【参考答案】 B
【解析】最佳适配算法是指,每次都从可装入该程序的最小空闲区域中,划分出和该程序大小相等的内存空间给该程序。经过题述的分配释放过程后,此时有开头15−6=9MB和末尾 2MB 两个空闲区域。所以答案选 B。过程如下图所示。
| 开始 | 55MB|
| ---- | ---- |
| 分配 15MB|15MB、40MB|
| 分配 30MB|15MB、30MB、10MB|
| 释放 15MB|15MB、30MB、10MB*|
| 分配 8MB|15MB*、30MB、8MB、2MB|
| 分配 6MB|6MB、9MB、30MB、8MB、2MB|53.【2017】某计算机按字节编址,其动态分区内存管理采用最佳适应算法,每次分配和回收内存后都对空闲分区链重新排序。当前空闲分区信息如下表所示。
回收起始地址为 60K、大小为 140KB 的分区后,系统中空闲分区的数量、空闲分区链第一个分区的起始地址和大小分别是( )。
A. 3、20K、380KB
B. 3、500K、80KB
C. 4、20K、180KB
D. 4、500K、80KB53.【参考答案】 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】某计算机采用二级页表的分页存储管理方式,按字节编址,页大小为210字节,页表项大小为 2 字节,逻辑地址结构如下图所示。逻辑地址空间大小为216页,则表示逻辑地址空间的页目录表中表项的个数至少是( )。
A. 64
B. 128
C. 256
D. 51256.【参考答案】 B
【解析】一页可以放210/2=29个页表项,而逻辑地址空间大小为216页。页表最多可占216/29=27页。因此页目录表至少要能存27=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、401H60.【参考答案】 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.【参考答案】
页内偏移量占 12 位,按字节编址,所以页大小为212B=4KB。页号占 20 位,所以最多有220页,意味着需要220个页表项,每个页表项 4B,所以页表最多占220×4B=4MB。
页目录号:((unsigned int) LA)/4M,页表索引号:((unsigned int) LA>>12)%1K。
由题目给的图可知,页框号 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。