(1) 存储管理的任务和功能是什么?
解:
存储管理的主要任务是:
- 支持多道程序的并发执行,使多道程序能共享存储资源,在互不干扰的环境中并发执行。
- 方便用户,使用户减少甚至摆脱对存储器的管理,使用户从存储器的分配、保护和共享等繁琐事物中解脱出来。
- 提高存储器的利用率和系统吞吐量。
- 从逻辑上扩充内存空间,支持大程序能在小的内存空间运行或允许更多的进程并发执行。
为了完成上述任务,现代操作系统的存储管理应具有以下功能:
1. 存储空间的分配和回收。
2. 地址转换,实现逻辑地址到物理地址的映射。
3. 主存空间的共享。
4. 主存空间的保护。
5. 主存储空间的扩充。
6. 对换,对换的主要任务是实现在内存和外存之间的全部或部分进程的对换,即将内存中处于阻塞状态的进程调换到外存上,而将外存上处于就绪状态的进程换入内存。对换的目的主要是为了提高内存利用率,提高系统的吞吐量。
(2) 为什么要配置层次式存储器?
解:
为了解决CPU和存储器之间速度上的不匹配,在现代计算机系统中,存储系统通常采用层次结构,存储层次可粗略分为三级:最高层为CPU寄存器,中间为主存,最底层是辅存。根据具体功能还可以细分为寄存器、高速缓存、主存储器、磁盘缓存、辅存储设备(固定磁盘、可移动存储介质)5层。一个文件的数据可能出现在存储系统的不同层次中,例如,一个文件数据通常被存储在辅存中(如硬盘),当其需要运行或被访问时,就必须调入主存,也可以暂时存放在主存的磁盘高速缓存中。大容量的辅存常常使用磁盘,磁盘数据经常备份在可移动磁盘或者光盘上,以防止硬盘故障时丢失数据。
(3) 什么是逻辑地址?什么是物理地址?为什么要进行二者的转换工作?
解:
逻辑地址是应用程序中使用的访存地址,有时也称为相对地址,由逻辑地址构成的地址空间称为逻辑空间。每个应用程序的逻辑地址空间都是从零号地址码开始的。
物理地址是内存储器的实际存储单元地址,有时也称为绝对地址,由物理地址构成的地址空间称为物理空间。物理地址空间也是从零号地址码开始的。
在多道程序环境下,程序逻辑地址空间和内存物理地址空间是不一致的。用户程序的逻辑地址可以是一维线性或多维线性,而内存中的每一个存储单元都有相应的内存地址相对应,属于一维线性地址。在将用户程序部分或全部地装入内存空间时,要实现逻辑地址到物理地址的映射。
(4) 地址重定位,静态地址重定位和动态地址重定位有什么区别?
解:
地址重定位指从逻辑地址到物理地址的映射过程,也称为地址映射。
静态地址重定位是指在用户程序执行之前完成地址映射工作,即把程序的逻辑地址都转换为实际的内存物理地址。静态地址重定位的地址变换只是在装入时一次完成,而在程序运行期间不再变化。
动态地址重定位是指在程序执行过程中,CPU在访问内存之前,将要访问的程序或数据地址转换为内存地址。
(5) 什么是内部碎片和外部碎片?。
解:
在一个分区内部出现的碎片(即被浪费的空间)称作内部碎片,如固定分区法就会产生内部碎片;
在所有分区之外新增的碎片称作外部碎片,如在动态分区法实施过程中出现的越来越多的小空闲块就是外部碎片,由于它们太小,无法装入一个进程,因而被浪费掉。
(6) 什么是分页和分段存储技术,两者有何区别?
解:
在分页系统中,系统会把用户程序的地址空间划分成若干个大小相等的区域,每个区域称作一个页面或页。每个页都有一个编号,叫做页号。页号一般从0开始,如0,1,2,…,等。类似地,也把内存空间划分成若干和页大小相同的物理块,这些物理块叫“帧”(frame)或内存块。同样,每个物理块也有一个编号,块号也是从0开始依次顺序排列。系统为进程分配内存时,以块为单位将进程中的若干页分别装入多个可以不相邻接的块中。
在分段存储管理方式中,程序按内容或过程(函数)关系划分为若干个段,每个段定义一组逻辑信息,都有自己的名字。一个用户作业所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位进行内存分配,然后通过地址映射机构把段式虚拟地址转换为实际的内存物理地址。
分段和分页有许多相似之处,比如,二者在内存中都采用离散分配方式,而不是整体连续分配方式,而且都要通过地址映射机构来实现地址转换。但二者在概念上却完全不同,具体表现在下述三个方面:
- 页是信息的物理单位,而段是信息的逻辑单位。分页是为了实现离散分配,减少内存碎片,提高内存利用率。或者说,分页是由于系统管理的需要,而不是用户的需要。段则是信息的逻辑单位,它含有一组意义相对完整的信息。段的长度不是固定的,取决于用户所编写的程序。分段的目的是为了能更好地满足用户的需要,更方便用户编程,更好地实现信息共享和保护。
- 页的大小由系统确定,由系统把逻辑地址划分为页号和页内地址两部分,整个系统只能有一种大小的页面;而段的长度却不固定,它取决于用户的程序。通常由编译程序在对源码进行编译时,根据程序的性质来划分。
- 分页的进程地址空间是一维的,即单一的线性空间;而分段的进程地址空间是二维的,由段号和段内地址两部分组成。
(7) 什么是虚拟存储器?列举采用虚拟存储器的必要性和可能性。
解:
虚拟存储器是指在具有层次结构存储器的计算机系统中,具有请求调入和交换功能,为用户提供一个比实际物理内存容量大得多的可寻址的一种存储器系统,它能从逻辑上对内存容量进行扩充。
采用虚拟存储器的必要性:传统存储管理方式要求将作业全部装入内存之后才能运行,这一特征导致大作业和多个作业要求运行时系统无法满足;另外,传统存储管理方式具有驻留性,即作业装入内存直到运行结束,便一直驻留在内存中。尽管进程在运行中会因I/O等原因而长期处于阻塞状态,或有的程序模块在运行过一次后就不再需要,但它们都仍将继续占用宝贵的内存资源。
采用虚拟存储器的可能性:根据程序的局部性定理,应用程序在执行之前,没有必要全部装入内存,而只需要将那些当前要运行的部分页或段先装入内存即可运行,其余部分可以仍然留在外存。程序在执行时,如果它所访问的页(段)已经调入内存,便可继续执行下去。但如果程序所要访问的页(段)不在内存中(称为缺页或缺段),此时程序可以利用操作系统提供的请求调页(段)功能,将它们调入内存,以便程序能够继续执行下去。如果内存已满,无法装入新调入的页(段),则必须利用一定的页(段)置换功能,将内存中暂时不用的页(段)换到外存中,以腾出足够的空间来存放新调入的页(段),从而保证程序的顺利执行。这样,一个大的程序就可以在较小的内存空间中执行。从用户的角度来看,该系统所具有的内存容量比实际内存容量大了很多。但实际上,用户所看到的大容量存储器是不存在的,只是虚拟的,故把这样的存储器称为虚拟存储器。
(8) 一个计算机系统的虚拟存储器,其最大容量和实际容量分别由什么决定?
解:
虚拟存储器的最大容量由主存和辅存的容量之和确定。
虚拟存储器的实际容量由指令中表示地址的字长决定,也就是计算机的地址结构决定的。
(9) 描述下列算法:
①首次适应;②最佳适应;③最差适应
解:
最先适应算法又称首次适应算法,该算法要求空闲分区表或空闲分区链按起始地址递增的次序排列。在进行内存分配时,从空闲分区表(链)首开始顺序查找,一旦找到大于或等于所要求内存长度的分区,则结束查找。然后,该算法从该分区中划出所要求的内存长度分配给请求者,余下的空闲分区仍留在空闲分区表(链)中,同时修改其相应的表(链)项。
最佳适应算法要求空闲分区按容量大小递增的次序排列。当用户作业申请一个空闲区时,存储管理程序从空闲分区表(链)首开始顺序查找,当找到第一个满足要求的空闲区时,停止查找。按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。如果空闲分区大于作业的大小,则与最先适应算法相同,将减去作业请求长度后的剩余空闲区仍然留在空闲分区表(链)中。
最坏适应算法要求空闲分区按其大小递减的顺序组成空闲分区表(链)。当用户作业申请一个空闲区时,先检查空闲分区表(链)的第一个空闲分区的大小是否大于或等于所要求的内存长度,若空闲分区表(链)的第一项长度小于所要求的大小,则分配失败,否则从该空闲分区中划出与作业大小相等的一块内存空间分配给作业,余下的空闲分区仍然留在空闲分区表(链)中。
(10) 如果内存划分为100KB、500KB、200 KB、300 KB和600 KB(按顺序),那么,首次适应、最佳适应和最差适应算法各自将如何放置大小分别为215 KB、414 KB、110 KB和430 KB(按顺序)的进程,哪一种算法的内存利用率高?
解:
见下图,在首次适应和最差适应算法中,最后430KB没有空间分配。由图可知,最佳适应算法的内存利用率高。
(11) 某操作系统采用分区存储管理技术。操作系统占用了低地址端的100KB的空间,用户区从100KB处开始共占用512KB,初始时,用户区全部空闲,分配时截取空闲区的低地址部分作为一个分配区。在执行了如下的申请、释放操作序列后:
作业1申请300KB、作业2申请100KB、作业1释放300KB、作业3申请150KB、作业4申请50KB、作业5申请90KB。
① 分别画出采用首次适应算法、最佳适应算法进行内存分配后的内存分配图和空闲区队列;
② 若随后又申请80KB,针对上述两种情况会产生什么后果?
解:
采用首次适应算法、最佳适应算法进行内存分配后的内存分配图和空闲区队列图如下所示。
若随后又申请80KB,只有采用首次适应算法的内存分配还有空间可以分配,分配图如下:
(12) 假设一个有8个1024字节页面的逻辑地址空间,映射到一个有32帧的物理内存:
① 逻辑地址有多少位? ② 物理地址有多少位?
解:
逻辑地址有13位;物理地址有15位。
(13) 某虚拟内存的用户编程空间共32页,每页的大小为1 KB,内存为16 KB,假设某时刻系统为用户的第0、1、2、3页分配的物理块为5、10、4、7,而该用户作业的长度为6页,试将16进制的虚拟地址0A5C、093C、1A5C转换成物理地址。
解:
- 虚拟地址为0A5C,对应的二进制数为:0000 1010 0101 1100。其中,页内偏移量占10位地址码,为25C。页号占6位地址码,为2号页。因第2页存储在4号块中,其基地址为:0001 0000 0000 0000,即十六进制的1000H。这样,其物理地址为十六进制的125C。
- 虚拟地址为093C,对应的二进制数为:0000 1001 0011 1100。其中,页内偏移量占10位地址码,为13C。页号占6位地址码,为2号页。因第2页存储在4号块中,其基地址为:0001 0000 0000 0000,即十六进制的1000H。这样,其物理地址为十六进制的113C。
- 虚拟地址为1A5C,对应的二进制数为:0001 1010 0101 1100。页内偏移量占10位地址码,为25C。页号占6位地址码,为6号页。因为该用户作业的长度为6页,最大的页号为5号。因为虚拟地址为1A5C对应的6号页超出了地址范围,所以属于越界。
(14) 覆盖技术和虚拟存储技术有何区别,交换技术和虚拟存储器中使用的调入和调出技术有何区别和联系?
解:
覆盖技术与虚拟存储技术最本质的不同在于覆盖程序段的最大长度要受内存容量大小的限制,而虚拟存储器中程序的最大长度不受内存容量的限制,只受计算机地址结构的限制。另外,覆盖技术中的覆盖段由程序员设计,且要求覆盖段中的各个覆盖具有相对的独立性,不存在直接联系或相互交叉访问;而虚拟存储技术对用户的程序段之间没有这种要求。
交换技术就是把暂时不用的某个程序及数据从内存移到外存中去,以便腾出必要的内存空间,或把指定的程序或数据从外存读到内存中以允许其运行的一种内存扩充技术。交换技术与虚存中使用的调入/调出技术的主要相同点是:都要在内存与外存之间交换信息。主要区别是:交换技术调入/调出整个进程,因此一个进程的大小要受内存容量大小的限制;而虚存中使用的调入/调出技术在内存和外存之间来回传递的是页面或分段,而不是整个进程,从而使得进程的地址映射具有了更大的灵活性,且允许进程的大小比可用的内存空间大。
(15) 在虚拟页式存储系统中引入了缺页中断,说明引入缺页中断的原因,并给出其实现的方法。
解:
虚拟页式存储系统中,系统允许作业的一部分页面在内存。当系统产生了缺页中断后,操作系统才能将不在内存的页面从外存调入内存。当缺页被调入,使中断恢复,进程就可以继续执行它的程序了。
缺页中断的实现由硬件和软件两部分组成。其实现方法如下:
当CPU执行一条指令时,形成操作数的有效地址。其中的页号部分用来检查页表,看该页是否在内存。如果在内存,则进行地址变换,按变换后的地址取出操作数;如果不在内存,则引起缺页中断,进入缺页中断处理程序。在缺页中断处理程序中,主要的处理为:
1 利用存储器分块表检查实存是否有空闲页面。
2 如果有空闲存储块,则根据页表提供的磁盘地址调入所需的页面,修改页表和分块表后返回。
3 如果没有空闲存储块,则选择一页淘汰掉。若该页被修改过还需写回外存,调入所需的页面。然后修改页表和分块表,返回。
(16) 试述缺页中断与一般中断的主要区别。
解:
程序在执行时,当访问的页面不在内存时,便产生缺页中断,请求操作系统将所缺页调入内存。中断处理程序将把控制转向缺页中断子程序。然后系统执行此子程序,把所缺页面装入主存中。接着处理器将重新执行缺页时打断的指令。缺页中断是一种特殊的中断,也就是说,缺页中断同样需要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理、恢复CPU环境等几个步骤,但与一般的中断相比,它又具有以下不同点:
- 一般中断是一条指令完成后中断,而缺页中断是在一条指令执行时中断。通常,CPU都是在一条指令执行完之后,才检查是否有中断请求到达。如果有,便去响应中断,否则,继续执行下一条指令。然而,缺页中断则是在指令执行期间,发现所访问的指令或数据不在内存时所产生和处理的。
- 一条指令执行时可能产生多个缺页中断。如指令可能访问多个内存地址,这些地址在不同的页中。
(17) 假设有下面的段表:
下面逻辑地址的物理地址分别是多少?
① [0,430]; ② [1,12]; ③ [2,500]; ④ [3,400]; ⑤ [4,122]
段 | 基址 | 长度 |
0 | 219 | 600 |
1 | 2300 | 14 |
2 | 90 | 100 |
3 | 1327 | 580 |
4 | 1952 | 96 |
解:
①: 649;②:2312;③:越界;④:1727;⑤:越界
(18) 考虑下面存储访问序列,该程序的大小为460字(以下数字均为十进制数字):
10、11、104、170、73、309、185、245、246、434、458、364
该页面的大小为100字,该程序的基本可用内存为200字,计算采用FIFO、LRU和OPT置换算法的缺页次数。
解:
因为页面的大小为100字,该程序的基本可用内存为200字,即可用内存为2块。程序的存储访问序列可转换为如下页面访问序列:
1、1、2、2、1、4、2、3、3、5、5、4
采用FIFO、LRU和OPT置换算法的访问序列如下:
由图可知FIFO算法的缺页次数为6次,LRU的缺页次数为7次,OPT的缺页次数为5次。
(19) 有一个矩阵int a[100][100] 以行为先进行存储。有一虚拟存储系统,物理内存共有3块,其中1块用于存放程序,其余2块用于存放数据。假设程序已经在内存中占用1块,其余2块空闲。
程序A: 程序B:
for (i=0;i<100;i++) for (j=0;i<100;j++)
for (j=0;j<100;j++) for (i=0;i<100;i++)
a[i][j]=0; a[i][j]=0;
若每页可存放200个整数,则程序A和程序B在执行过程中各会发生多少次缺页?若每页只能存放100个整数呢?以上说明了什么问题?
解:
由题目所给条件可知,数组a有100´100=10000个整数,系统中共有2个内存块用于存放数组信息,数组中的元素按行编址。
若每页可以存放200个整数,则一个内存页中可以存放2行数组元素,对于程序A,数组元素的访问顺序为:
a[0][0], a[0][1], …, a[0][99]
a[1][0], a[1][1], …, a[1][99]
…
a[99][0], a[99][1], …, a[99][99]
显然,程序A对数组a的访问顺序与存储顺序一致,也是按行进行的。因此程序A每访问2行数组元素都会产生一次缺页中断,则访问整个数组会产生100/2=50次缺页中断。
对于程序B,数组元素的访问顺序是:
a[0][0], a[1][0], …, a[99][0]
a[0][1], a[1][1], …, a[99][1]
…
a[0][99], a[1][99], …, a[99][99]
显然,程序B对数组a的访问顺序与存储顺序不一致。因此程序B每访问2个元素将产生一次缺页中断,则访问整个数组将产生10000/2=5000次缺页中断。
若每块只能存放100个整数,则一个内存块中只能存放1行数组元素,对于程序A,每访问1行数组元素都会产生一次缺页中断,则访问整个数组会产生100次缺页中断;对于程序B,每访问1个元素将产生一次缺页中断,则访问整个数组将产生10000次缺页中断。
以上结果说明,缺页中断的次数和数据存放方法及程序访问数据的方法有很大关系;当缺页次数较少时,减小页面大小影响不大,当缺页次数很大时,页面的减小对系统效率及程序的执行会带来很大影响。
(20) 什么是进程在某时刻t的工作集?工作集与页面的调入和淘汰策略有什么关系?
解:
工作集是指在某段时间间隔Δ里,进程实际访问的页面集合,具体地说便是把某进程在时间t-Δ ~ t之间所访问的页面集合计为w(t, Δ),把变量Δ称为工作集窗口尺寸。
正确选择工作集窗口尺寸,对存储器的有效利用和系统吞吐率的提高,都将产生重要影响。一方面,如果把Δ选得很大,进程虽不易产生缺页,但存储器也将不会得到充分利用。另一方面,如果把Δ选得过小,则会使进程在运行过程中频繁地产生缺页中断,反而降低了系统的吞吐率。
(21) 什么是抖动?产生抖动的原因是什么?
解:
抖动是由于内存空间竞争引起的。当需要将一个新页面调入内存时,因内存空间紧张,不得不将一个老页面置换出去,而刚刚置换出去的老页面可能又要被使用,因此需要重新将它调入。若一个进程频繁地进行页面调入调出,势必加大系统的开销,使系统运行效率降低。通常称这种现象为该进程发生了抖动。
产生抖动的原因主要有:系统内的进程数量太多,致使一个进程分得的存储块过少;系统采用的置换算法不够合理。
(22) 伙伴系统有什么不足之处?
解:
首先,从伙伴的定义上知道,必须满足大小相等、地址连续以及从同一大块中分出等三个条件才称为伙伴块,仅满足前两个条件的块不能合并成更大的块,因此可能使得本来连续的空间得不到利用。
其次,就是碎片问题,也是每个内存管理算法要面对的最棘手的难题,尽管伙伴算法在这方面已经做的相当出色。在需要一个大内存块时,即使总的空闲页面还有很多,却可能因为内存碎片而不能组成空闲的大内存块供分配。
(23) 什么是写时复制?
解:
写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork( )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程。这种行为是非常耗时的,因为它需要:
- 为子进程的页表分配页面;
- 为子进程的页分配页面;
- 初始化子进程的页表;
- 把父进程的页复制到子进程相应的页中。
(24) 描述按需分页的处理过程。
解:
按需分页的处理过程:
(1)确认产生页面不在物理内存的原因。第一种情况,页面从未被进程访问,页表项的值为0,转到(2)。第二种情况,该页面被进程访问过,但是目前已被写到交换分区,页表项的存在标志位为0,但其它位被用来记录该页面在交换分区中的信息,转到(3)。
(2)此时,要区分该页面是否映射到一个文件。如果所属区间的vm_opw->nopage不为空,则表示该区间映射到一个文件且vm_ops->nopage指向装入的页面的函数,调用该函数装入该页面。如果vm_ops或vm_ops->nopage为空,则调用do_anonymous_page()申请一个页面。
(3)调用do_swap_page()函数从交换分区调入该页面。