目录
学习建议:
掌握各种管理方式的特点;可变分区方式的主存分配算法以及移动技术;分页式虚拟存储管理的实现以及页面调度算法;分段式虚拟存储管理的实现。学习中最好是通过优缺点,以及算法的开销等比较,掌握各种算法的原理。要求能够理解存储管理的主要功能,理解在不同的管理方式下如何实现存储保护、地址转换、以及主存空间的分配和回收;比较各种管理方式的特点;掌握虚拟存储器的实现原理和方法。
基本内容:
一、概述
操作系统中所讨论的存储管理主要是对内存(或称主存储器)的管理。
存储管理的目的:一是方便用户;二是提高内存的利用率。
存储分为内存和外存(或称主存和辅存)两级。
计算机系统在执行一个作业程序时,可以把立即要用的信息装入内存,而把暂时还不会用到的信息存在外存,等到需要时再调入内存;同时,可把已在内存中暂时不用的或以后不再被访问的信息淘汰到外存,腾出内存空间让需要的信息进入内存。只要合理安排使用这两级存储器,就可以大大地提高内存的利用率。
存储管理的功能一般可概括为如下几方面:
1.对内存的分配和管理
为了实现对内存的分配工作,必须随时掌握存储单元的使用情况,登记好哪些单元已被分配,哪些单元还未分配;当有用户程序或系统提出申请存储空间,确定其分配区域,并实施具体的分配工作,修改有关记录;在用户或系统要释放已占用的存出区域时,能及时地收回该资源等。
2.实现地址变换
为使程序能正确运行,存储管理必须具有把用户根据程序关系编制的程序地址转换成内存中可执行的实际地址。
3.实现内存和信息的共享
为了提高内存的利用率,使更多的作业能投入运行,就要选择分配内存的策略,使多道程序不仅能动态地共享内存,而且能共享内存中的某些信息。
4.存储保护
在多道程序情况下,内存中总是同时存放着多道程序。为了确保各道程序都能在系统指定的存储范围内操作,互不干扰,特别要防止由于某道作业的错误操作而破坏其它作业的信息,甚至系统程序,所以存储管理应具备存储保护的功能,研究解决各种存储保护措施。
5.内存容量的“补充”
在多道程序情况下,内存容量往往不够用,因此要解决内存容量的习题,以便为用户提供比实际内存容量大得多的虚拟存储器。
二、重定位
1.绝对地址和逻辑地址
由绝对地址对应的主存空间称"物理地址空间"。
在多道程序设计的系统中,主存中同时存放了多个用户作业。操作系统根据主存的使用情况为用户分配主存空间。因此,每个用户不能预先知道他的作业将被存放到主存储器的什么位置。这样,用户程序中就不能使用主存的绝对地址。
为了方便用户,每个用户都可认为自己作业的程序和数据存放在一组从"0"地址开始的连续空间中。由逻辑地址对应的存储空间称"逻辑地址空间"。
2.重定位
当用户作业进入计算机系统请求执行时,存储管理要为它分配合适的主存空间,这个分配到的主存空间可能是从某单元开始的一组连续的地址空间。该地址空间的起始地址是不固定的,而且逻辑地址与分到的主存空间的绝对地址经常不一致。因此,每个逻辑地址在主存储器中也没有一个固定的绝对地址与之对应。程序执行时不能按照其逻辑地址到主存储器中存取信息,处理器必须按照实际地址去访问主存才能保证程序的正确执行。
为了保证作业的正确执行,必须根据分配给作业的主存区域对作业中指令和数据的存放地址进行重定位,即要把逻辑地址转换成绝对地址。重定位的方式可以有"静态重定位""和"动态重定位"两种。
(1)静态重定位
在装入一个作业时,把作业中的指令地址和数据地址全部转换成绝对地址。
(2)动态重定位
在装入作业时,不进行地址转换,而是直接把作业装入到分配的主存区域中。
动态重定位由软件和硬件相互配合来实现。硬件要有-个地址转换机构,该机构可由一个基址寄存器和一个地址转换线路组成。存储管理为作业分配主存区域后,装入程序把作业直接装到所分配的区域中并把该主存区域的起始地址存入相应作业进程的进程控制块中。当作业进程被调度去占用处理器时,随同现场信息的恢复,作业所占的主存区域的起始地址也被存放到"基址寄存器"中。作业执行时,处理器每执行一条指令都会把指令中的逻辑地址与基址寄存器中的值相加得到绝对地址,然后按绝对地址访问主存储器。
采用动态重定位时,由于装入主存的作业仍保持原来的逻辑地址,所以,必要时可改变作业在主存中的存放区域。作业在主存中被移动位置后,只要把新区域的起始地址代替原来在基址寄存器中的值,这样,作业执行时,硬件的地址转换机构将按新区域的起始地址与逻辑地址相加,转换成新区域中的绝对地址,使作业仍可正确执行。
若作业执行时,被改变了存放区域仍能正确执行,则称程序是可浮动的。采用动态重定位的系统支持"程序浮动"。而采用静态重定位时,由于被装入主存储器的作业信息都已经用绝对地址指示,作业执行过程中不再进行地址转换,故作业执行过程中是不能改变存放位置的。可见,采用静态重定位的系统不支持"程序浮动"。
三、一个分区的存储管理
一个分区的存储管理又称单连续存储管理,是一种最简单的存储管理方式。
在这种管理方式下,除操作系统占用的一部分存储空间外,其余的用户区域作为一个连续的分区分配给一个作业使用,即在任何时刻主存储器中最多只有一个作业。所以,一个分区的存储管理只适用于单用户的情况,个人计算机和专用计算机系统可采用这种存储管理方式。
四、多个分区的存储管理
多个分区的存储管理是把主存中的用户区划分成若干个连续区域,每个连续区中可装入一个作业。
因此,多个分区的存储管理适合多道程序系统。多分区的存储管理可采用:
(一)固定分区管理方式
固定分区管理方式是把主存储器中可分配的用户区域预先划分成若干个连续区,每个连续区的大小可以相同,也可以不同。但是,一旦划分好分区之后,主存储器中分区的个数就固定了,且每个分区的大小也固定不变。
在固定分区方式管理下,每个分区可用来装入一个作业。由于主存中有多个分区,就可同时在每个分区中装入一个作业,这种管理方式适用于多道程序设计系统。
等待进入主存的作业排成队列,当主存储器中有空闲的分区时,依次从作业队列中选择一个能装入该分区的作业。当所有的分区都已装有作业,则其他的作业暂时不能再装入,绝不允许在同一分区中同时装入两个以上的作业。
已经被装入主存的作业能得到处理器运行时,要限定它只能在所占的分区中执行。下图是划分成三个分区的固定分区管理方式的示意图。
1.主存空间的分配与去配
为了管理主存空间的使用,必须设置一张"主存分配表",以说明各分区的分配情况。主存分配表中应指出各分区的起始地址和长度,并为每个分区设一个标志位。当标志位为"0"时,表示对应的分区是空闲分区,当标志位为非"0"时,表示对应的分区已被占用。
空闲分区可以用来装作业,已被占用的分区需指出被哪个作业占用。下表表示主存储器被划分成三个分区,其中分区2已装入一个作业名为Job1的作业。
分区号 | 起始地址 | 长度 | 占用标志 |
1 | a | L1 | 0 |
2 | b | L2 | Job1 |
3 | c | L3 | 0 |
当作业队列中有作业要装入主存时,存储管理可采用"顺序分配算法"进行主存空间的分配。顺序查看主存分配表,找到一个标志为"0"的分区,再把欲装入作业的逻辑地址空间的长度与找到的分区长度进行比较。
当能容纳该作业时,则把此分区分配给该作业,把它的作业名填到占用标志位上。当找到的分区不能容纳该作业时,则重复上述过程继续顺序查看主存分配表中是否有能满足该作业长度要求的且标志为"0"的分区,若有,则分配,若无,则该作业暂时得不到主存空间而不能装入。下图给出了顺序分配算法的流程。
装入分区的作业执行结束后必须归还所占用的分区,存储管理根据作业名查看主存分配表,从占用标志位中的记录可知道该作业所占用的分区,把该分区的占用标志位重新置成"0",表示该分区现在又成了空闲区,可用来装入新作业。
2.地址转换和存储保护
由于固定分区管理方式是预先把主存划分成若干个区,每个区又只能用来装入一个作业,因此,作业在执行过程中是不会被改变存放区域的。
于是,可以采用静态重定位的方式把作业装入分配到的分区中去。由装入程序把作业中的逻辑地址与分区的下限地址相加,得到相应的绝对地址。
装入程序在进行地址转换时要检查其绝对地址是否在指定的分区范围中,若是,则可把作业装入,否则,不能装入该作业且要归还分配给该作业的分区。
一个装入主存的作业能占用处理器时,进程调度程序必须把该作业所在分区的下限地址和上限地址存入处理器中的"下限寄存器"与"上限寄存器"中(如图4-4中所示)。处理器执行该作业时,对每条指令中的地址都要进行核对:
下限地址≤绝对地址≤上限地址
如果绝对地址在上、下限地址范围内,则可按绝对地址访问主存;如果不等式不成立,则形成"地址越界"的程序性中断事件,达到存储保护的目的。
一个作业让出处理器时,另一个作业可能被选中占用处理器。这时,应更改上、下限寄存器的内容,改为当前被选中作业所在分区的上限地址和下限地址,以保证处理器能控制作业在规定的分区内执行。
3.主存空间的利用率
用固定分区方式管理主存时,总是为作业分配一个不小于作业长度的分区。因此,在很多作业实际上只占用了分区的一部分空间,使分区中有一部分空间闲置不用,这实际上影响了主存空间的利用率。
采用如下几种办法可使主存空间利用率得到改善:
(1)划分分区时按分区的大小顺序排列,低地址部分是较小的分区,高地址部分是较大的分区。各分区按从小到大的次序依次登录在主存分配表中。
(2)根据经常出现的作业的大小和频率划分分区,这样能使主存空间的利用率提高。
(3)按作业对主存空间的需求量排成多个作业队列,规定每个作业队列中的各作业只能依次装入对应的指定分区中;不同的分区中可同
作业队列1中的作业长度小于L1,规定它们只能被装入分区1中;作业队列2中的作业长度大于L1但小于L2,这些作业只能被装入分区2中;作业队列3中的作业长度大于L2但小于L3,队列中的作业只能被装入分区3中。
采用多个作业队列的固定分区法有效地防止了小作业进入大分区,从而减少了闲置的主存空间量。但是,如果分区划分不合适,则会造成某个作业队列经常是空队列。
那么,对应的分区经常没有作业被装入,反而使分区的利用率不高。所以,采用多个作业队列的固定分区法时,可结合作业的大小和出现的频率划分分区,以达到期望的利用率。
(二)可变分区管理方式
可变分区管理方式不是把作业装入到已经划分好的分区中,而是在作业要求装入主存储器时,根据作业需要的主存量和当时主存空间的使用情况决定是否可以装入该作业。
当主存中有足够的空间能满足作业需求时,则按作业需求量划出-个分区分配给该作业。由于分区的大小是按作业的实际需求量来定的,故分区的长度不是预先固定的,且分区的个数也随作业的随机性而不确定。下图是可变分区管理方式的存储空间分配示意图。
1.主存空间的分配与去配
系统初始化时,主存储器中除操作系统占用部分外,把整个用户区看作是一个大的空闲区。当有作业要装入主存时,从空闲区中划出一个与作业长度一致的分区来装作业,剩余部分仍为空闲区。当作业需求量超过空闲区长度时,则作业暂时不能装入。
装入主存储器的作业执行结束后,它所占的分区被收回,成为一个空闲区,收回后的空闲区可用来装入新的作业。随着作业不断地被装入和作业执行结束后的撤离,主存储区被分成许多分区,有的分区被占用,有的分区空闲。
采用可变分区方式管理主存时,主存储器中已占用分区和空闲分区的数目和大小都是在变化的。为了便于对主存空间的分配和去配,主存分配表可以用两张表格组成,一张已分配区表",另一张是"空闲区表"。
已分配区表记录已装入的作业在主存中占用分区的始址和长度,用标志位指出占用分区的作业名。
空闲区表记录主存中可供分配的空闲区的始址和长度,也用标志位指出该分区是未分配的空闲区。
由于已占分区和空闲区的个数不定,因此,两张表格中都应设置适当的空栏目(置标志位的状态为"空"),分别用以登记新装入主存的作业占用的分区和作业撤离后的新空闲区。下图是可变分区管理方式的主存分配表。
当要装入一个作业时,从空闲区表中查找标志为"未分配"的空闲区,从中找出一个能容纳该作业的空闲区。如果找到的空闲区正好等于该作业的长度,则把该区全部分配给作业。这时应把该空闲区登记栏中的标志改为"空"状态,同时在已分配区表中找一个标志为"空"的栏目登记新装入的作业占用分区的始址、长度和作业名。如果找到的空闲区大于作业长度,则把空闲区分成两部分,一部分用来装作业,另一部分仍为空闲区。这时应修改空闲区的始址和长度,且把新装入的作业登记到已分配表中。
当有作业执行结束撤离时,同样要修改两张表格。从已分配表中找出作业占用的分区,把表中相应栏的状态改成"空",而将归还的分区登记到空闲区表中。如果归还的分区与原有的空闲区相邻,则应将它们连成一片作为一个空闲区登记,这时只要修改原空闲区的始址和长度,否则应把归还区的始址和长度登记在空闲区表中标志为"空"的栏目中。
重点难点:
1.地址空间与存储空间
目标程序所在的空间称为地址空间,即程序员用来访问信息所用的一系列地址单元的集合;存储空间是指主存中一系列存储信息的物理单元的集合。
2.存储管理具备的能力
存储管理是紧跟内核的第二层,因为计算机中运行的各种系统程序和用户程序必须驻留在存储储器中。如何确保这些程序准确地依次执行,互相不干扰,不冲突,就必须对存储器进行严格的管理。存储管理应能解决以下方面的问题:
地址重定位--程序员或用户编制的程序,不会改变它的地址,均视作以自然顺序编排的地址,即从0或1开始的自然地址,称为逻辑地址或相对地址。当程序输入计算机后,必须在存储器中占有唯一的固定地址。不同程序的相同的逻辑地址必须对应到存储器中不同的固定地址,程序物理地址或绝对地址。从逻辑地址转成存储器物理地址的工作称地址重定位。
存储器的组织和分配--各类程序共享同一存储器,系统必须精心安排和合理分配,使得既不会互相冲突又能充分利用存储空间。
存储器的保护--各类程序必须在自己的地址范围内运行,不能随意侵占其它程序的地址空间,特别是用户程序不能干扰系统程序的运行。
存储器的扩充--计算机主存储器的容量有一定限制。存储器的扩充就是为了解决在小容量的主存中能运行大的作业。可以采用虚拟存储技术来实现存储器的扩充。
3.重定位和两种重定位的优缺点
作业的地址空间与存储空间不一致时,所进行的地址调整以便作业能够执行的 过程称为重定位。重定位实质是地址变换,即作业地址空间中的逻辑地址变换 为主存空间的物理地址。
静态重定位实现简单,无需硬件支持。其缺点是,(1)程序在主存中不能移动位置;(2)程序必须占用连续的空间。由于这些缺点,静态重定位技术只用于要求不高的场合,如单一连续区的场合。
动态重定位的优点是:(1)程序装入主存时不必修改其逻辑地址;(2)程序在主存中的位置根据需要可以随意搬动。其代价则是硬件设计上要给予支持,且存储管理软件的算法比较复杂。但由于其优点非常明显,故现代计算机都具有这样的硬件机构。
4.逻辑地址与物理地址
在具有地址变换机构的计算机中,允许程序中编排的地址和信息实际存放在内存中的地址有所不同。逻辑地址是指用户程序经编译后,每个目标模块以0为基地址进行的顺序编址。逻辑地址又称相对地址。物理地址是指内存中各物理存储单元的地址从统一的基地址进行的顺序编址。物理地址又称绝对地址,它是数据在内存中的实际存储地址。
5.可变分区的三种主存分配法比较
最先适应算法
最先适应算法的表是按空闲区首址升序的(即空闲区表是按空闲区首址从小到大)方法组织的。分配时从表首开始,以请求内存区的大小逐个与空闲区进行比较,找到第一个满足要求的空闲后,若空闲区大小与请求区的大小相等,则将该空闲区分配给请求者,并撤消该空闲区所在表目;若大于请求区,就将该空闲区的一部分分配给请求者,然后,修改空闲区的大小和首址。
切割空闲区有两种方法:
一、从空闲区头开始分配;
二、从空闲区尾开始分配。
这种算法的实质是尽可能地利用低地址部分的空闲区,而尽量地保证高地址部分的大空闲区,使其不被切削成小的区,其目的是保证在有大的作业的到来有足够大的空闲区来满足请求者。回收时,首先考察释放区是否与系统中的某个空闲区相邻,若相邻则合并成一个空闲区,否则,将释放区作为一个空闲区按首址升序的规则插入到空闲区表适当的位置。
最优适应算法
最优适应算法是将申请者放入与其大小最接近的空闲区中。切割后的空闲区最小,若系统中有与申请区大小相等的空闲区,这种算法肯定能将这种空闲区分配给申请者。(首次适应法则不一定)。最佳适应算法的空闲区表按空闲区大小升序方法组织。分配时,按申请的大小逐个与空闲区大小进行比较,找到一个满足要求的空闲区,就说明它是最适合的(即最佳的)。这种算法最大的缺点是分割后的空闲区将会很小,直至无法使用,而造成浪费。
最坏适应算法
为了克服最佳适应算法把空闲区切割得大小的缺点,人们提出了一种最坏适应算法,即每次分配时,总是将最大的空闲区切去一部分分配给请求者,其依据是当一个很大的空闲区被切割了一部分后可能仍是一个较大的空闲区。避免了空闲区越分越小的问题。最坏适应算法的空闲区表是按空闲区大小降序的方法组织的(从大到小的顺序)。分配时总是取表中的第一个表目,若不能满足申请者的要求,则表示系统中无满足要求的空闲区,分配失败;否则,将从该空闲区中分配给申请者,然后修改空闲区的大小,并将它插入到空闲区表的适当位置。
6.加快页表的查询速度的相应技术
在页式存储技术中,我们可看到每访问一次内存,就要做两次访问内存的工作,即,查页表时要作一次访问内存的工作,然后是访问程序要求访问的内存,这样,存取速度降低一倍,将会影响整个系统的使用效率。在早期的计算机系统中有的采用联想存储器的技术来加快查表的速度,有的采用寄存器做页表。
7.分段管理的优缺点
优点:
(1)便于程序模块化处理。
(2)便于处理可变长数据结构。在实际应用中,有些表格或数据段的长度随输入数据的多少而变化。在运行过程中,也可能需要扩展某些段长度。为处理这种可变长数据结构,只要在段表表目中增设一"扩充"项,当段长越界时,检查该"扩充"项,若属于允许扩充,则可通过拼接或移去一相邻段来实现数据段的扩充。
(3)便于动态连接与共享。
缺点:
(1)地址变换需要硬件支持且时间开销增大,操作系统也变得复杂。
(2)段的最大尺寸受到内存空间的限制。这种限制可以分为两种情况:一是某些超过内存容量的段(如数据段)无法装入,导致程序不能运行;二是段长虽未超出内存容量。但内存空闲区长度不能满足需要,也致使程序不能运行,此时便形成外碎片。这些说明段式管理仍有待于改进。
8.段式与页式存储管理的比较
段式 | 页式 |
---|---|
分段由用户设计划分,每段对应一个相应的程序模块,有完整的逻辑意义。 | 分页用户看不见,由操作系统为内存管理划分。 |
段面是信息的逻辑单位 | 页面是信息的物理单位 |
便于段的共享,执行时按需动态链接装入。 | 页一般不能共享 |
段长不等,可动态增长,有利于新数据增长。 | 页面大小相同,位置不能动态增长。 |
二维地址空间:段名、段中地址;段号、段内单元号 | 一维地址空间 |
管理形式上象页式,但概念不同 | 往往需要多次缺页中断才能把所需信息完整地调入内存 |
实现页(段)的共享是指某些作业的逻辑页号(段号)对应同一物理页号(内存中该段的起始地址)。页(段)的保护往往需要对共享的页面(段)加上某种访问权限的限制,如不能修改等;或设置地址越界检查,对于页内地址(段内地址)大于页长(段长)的存取,产生保护中断。
9.程序局部性原理
程序局部性又可细分为时间局部性和空间局部性。
时间局部性是说,一旦某个指令或数据被访问了,可能很快又要再次被访问。循环和子程序等结构就是时间局部性的典型例子。如在循环结构中,循环体中各条指令在循环期间内被连续多次执行,循环控制变量也被连续多次访问。
空间局部性是说,一旦某个位置被访问到,那么它附近的位置很有可能很快也要被访问。这可以通过顺序结构、线性数据结构等来理解,以数组为例,当访问到数组中某个元素时,紧接着可能会访问与其相邻的下一个元素。