【教学目的】
了解存储器管理的基本功能。
【教学重点】
1、内存分配的方法、对换技术。
2、分页、分段及段页式分配方式。
3、虚拟存储器的实现
4、页面置换算法
【分配课时】
进度计划8学时
第一节 程序的装入和链接
在多道程序环境下,程序要运行必须为之创建进程,而创建进程繁荣第一件事,就是要将程序和数据装入内存。如何将一个用户源程序便为一个可在内存中执行的程序,通常要经过以下几步:
(1)编译:由编译程序(Compiler)将用户源代码编译成若干个目标模块(Object Module)。
(2)链接:由链接程序(Linker)将编译后形成的目标模块以及它们所需要的库函数,链接在一起,形成一个装入模块(Laod Module);
(3)装入。由装入程序(Loader)将装入模块装入内存。
一、程序的装入
为了述上的方面起见一个无须的进行链接的单个目标模块的装入过程。该目标模块也就是装入模块。将一个装入模块装入内存时,可采用三种方式:
1、绝对装入方式(Absolute Loading Mode)
由装入程序根据装入模块中的地址,将程序和数据装入内存;在编译时,如果知道程序将驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码,在这种条件下可以采用绝对装入方式。
2、可重定位方式(Relocatable Loading Moad
由装入程序根据内存当时的实际使用情况,将装入模块装入到内存的适当地方。由于编译程序不能预知所编译的目标模块在内存的什么位置,因此,目标模块的起始地址通常都是从0开始,程序中的所有其他地址,也都是相对于起始地址计算机的。此时,不可能再用绝对装入方式,而应该用可重定位装入方式,把装入模块装入内存。
在装入时对目标程序中的指令和数据地址的修改过程称为重定位。又因为地址交换只是在装入时一次完成,以后不在改变,故称为静态重定位。
3、动态运行时装入方式(Dynamic Run-Time Loading)
动态运行时的装入程序,在把装入模块装入内存后,并不立即把装入模块中的相对地地址转换为绝对地址,而是把这种地址转换推迟到程序要真正执行时才进行。因此,装入内存后的所有地址都是相对地址。为使地址转换不影响指令。
二、程序的链接
实现链接的方法有三种:静态链接、装入时动态连接、运行时动态链接。
1、静态连接
在将这几个目标模块链接装配成一个装入模块时,需要解决以下两个问题:
(1)对相对地址进行修改
(2)变换外部调用符号
2、装入时动态链接(Load-Time Dynamic Linking)
将引起装入程序去找出相应地外部目标模块,并将它装入内存,还要按照图5-4所示的方式来修改目标模块中的相对地址。装入时动态链接方式有以下优点:
(1)便于软件版本的修改和更新
在采用装入时动态链接方式时,要修改或更新各个目标模块,是件非常容易的事,但对于经静态链接已装配在一起的装入模块,如果要修改或更新其中的某个目标模块时,则要求重新打开装入模块,这不仅是低效的,而且有时是不可能的。
(2)便于实现目标模块共享
采用装入时动态链接的方式,OS能将一个目标模块链接到几个应用模块,即实现多个应用程序对该模块的共享;然而,采用静态链接方式时,每个应用模块都必须含有该目标模块的拷贝,而无法实现共享。
3、运行时动态链接(Run-Time Dynamic Linking)
动态装入方式,可将一个装入模块装入到任何地方,但装入模块的结构是静态的,它主要表现在两个方面:一是在进程(程序)的整个执行期间,装入模块是不改变的;再者是每次运行时的装入模块都是相同的。
第二节 连续分配存储管理方式
一、单一连续分配方式(最简单的分配方式)
在内存中仅驻留一道程序,整个用户区为一用户独占。这种分配方式仅能用于单用户、单任务OS中,不能用于多用户系统和单用户多任务系统中。
在多种存储分配方式中,仍有它的一席之地,采用这种存储管理方式时,内存分为以下两个分区:
1、系统区
仅提供给操作系统使用,它可以驻留在内存的低址部分,也可驻留在内存的高址部分,由于中断向量通常驻留在低址部分,故OS通常也驻留在内存的低址部分;
2、用户区
指除系统区以外的全部内存空间,提供给用户使用;为了防止OS受到用户程序有意或无意的破坏,可以设置一保护机构。在早期的单用户、单任务操作系统中,大多配置了存储器保护机构,用于防止用户程序对操作系统的破坏。
二、分区式分配方式
这是一种可用于多道程序的一种较简单的存储方式。它有可进一步分为:
1、固定分区式
这是将内存用户区划分成若干个固定大小的区域,每个区域中驻留一道程序。
(1)划分分区的方法:
①分区大小相等
使所有的内存分区都大小相等,其缺点是明显的。
②分区大小不等
为了克服分区大小相等分配方法的缺点,可在内存中划分出多个较小的分区、适量的中等分区及少量的大分区。对于小程序,可为之分配小分区,这样,当大、中程序到来时,就可以找到大的分区,将程序装入内存并运行。
(2)内存分配
为了便于内存分配,通常将这些分区根据它们的大小进行排队,并为只建立一张分区使用表。表中,各表项包含有每个分区的起始地址、大小及状态(是否一分配),见图4-4。
(3)缺点
空间浪费严重,通常用于控制多个相同对象的控制系统中,由于每个对象的控制程序大小相同,是事先编写好的,其所许的数据也是一定的,故仍然采用固定分区的存储管理方式。
2、动态分区
有称为可变分区,根据用户程序的大小,动态地对内存进行划分,因此,各分区的大小是不定的,内存被划分成多少个分区,其数目也是可变的。动态分区方式显著地提高了存储器的利用率。
分区式分配方式由于要求将一个用户程序分配到一个连续的内存空间中,因此可能产生多个不可利用的内存零头(内也称为“碎片”)。
动态分区分配是根据进程的实际需要,动态地之分配连续的内存空间。在实现可变分区分配存储管理方式时,必须解决下述三个问题:
(1)分区分配中的数据结构
为了实现分区分配,系统中必须配置相应的数据结构,用来记录内存的使用情况为分配提供依据,常用的数据结构形式有以下两种:
①空闲分区表
空闲分区表,用于为内存中每个尚未分配出去的分区设备一个表项,每个分区的表项包含分区序号、分区始址及分区大小等表目。
②空闲分区链
为了实现对空闲分区的分配和链接,在每个分区的起始部分,设置一些用于控制分区分配的信息,以及用于链接各分区的前项指针,在分区尾部则设置一后向指针;然后,通过前、后向指针将所有的分区链接成一个双向链,如图4-5所示。
(2)分区分配算法
为把一个新作业装入内存,须按照一定的分配算法,从空闲分区表或空闲分区链中,选出一分区分配给该作业。目前常用以下三种分配算法:
①首次适应算法FF
FF算法要求空闲分区链以地址递增的次序链接。在进行内存分配时,从链首开始顺序查找,该算法向于优先利用内存中低址部分的空闲分区,在高址部分的空闲分区很少被利用,从而保留了高址部分的大空闲区。
②循环首次适应算法
首次适应算法演变而形成的。从上次找到的空闲分区的下一个空闲分区开始查找,直至到第一个能满足要求的空闲分区,应设置一起始查寻指针,并采用循环查找方式。
③最佳适应算法
“最佳”的含义是指每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业,避免了“大材小用”。
(3)分区分配操作
在动态分区存储管理方式中,主要的操作是分配和回收内存。
①分配内存
首先,系统要利用某种分配算法,从空闲分区链(表)中找到所需的分区。最后,将分配区的首址返回给调周者,图4-6示出了分配流程。
②回收内存
当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链中找到相应的插入点,此时可能出现以下四种情况之一:
Ø 回收区与插入点的前一个分区相邻接见图4-7(a))。此时应将回收区与插入点的前一分区合并,不再为回收分区分配新表项,而只需修改F1区的大小;
Ø 回收分区与插入点的后一分区F2相邻接(见图4-7(b))。此时也将两区合并形成新的空闲区,但用回收区的首址作为新空闲区的首址,大小为两者之和;
Ø 回收区同时与插入点的前、后两个分区邻接9见图4-7(c)。此时将三个分区合并,使用F1的首址,取消F2的表项;
Ø 回收区既不与F1邻接,也不与F2邻接,这时应为回收区单独建立一新表项。填写回收区的首址和大小,并根据其首址,插入到空闲链中的适当位置。
3、动态重定位分区分配
(1)紧凑
在连续分配方式中,必须把一个系统顺序或用户程序,装入到一连续的内存空间中。如果在系统中有若干个小的分区,其总容量要装入的程序,但由于他们不相邻接,使该程序不能被装入内存。
(2)动态重定位
在该方式中,将程序中的厦门港队地址转换为物理地址的工作,被推迟到程序指令真正要执行时进行。因此,允许作业在运行过程中在内存中移动的技术,必须获得硬件地址变换机构的支持。即在系统中一个重定位寄存器,用它来装入(存放)程序在内存中的起始地址。
(3)动态重定位分区分配算法
动态重定位分区分配算法,与动态分区分配算法基本上相同;差别仅在于:在这种分配算法中,增加了“紧凑”功能,通常是在找不到足够大的空闲分区来满足用户需求时,进行紧凑。图5-14示出了动态重定位分区分配算法框图。
三、IBM-PC 微机中的存储管理方式
1、段寄存器和作业的分段
在IBM-PC微机中,采用了多定位的存储器管理方式。在PC机中共设置了四个段寄存器:即代码段寄存器CS,数据段寄存器DS,栈段寄存器SS以及附加点寄存器ES,相应地,在PC机中运行的作业也可分成四个段:即代码段,数据段,供程序使用的栈段,以及作为用户工作区的附加段。这几个段的地址空间可以邻接或分开;也可部分或全部重叠。根据IBM-PC机的最大寻址范围为1MB。
2、形成访问内存物理地址
3、多重定位的实现
四、对换
对换(Swapping,也称交换)技术,最早用在单用户系统,在内存中仅驻留一道用户作业。所有其它作业都驻留在外存的后备队列上,只调入一个作业进入内存运行;此作业的时间片用完时,该作业调至外存,再将后备队列上的另一个作业调入内存;,也让它运行一个时间片的时间,然后又将它调出,再调下一个作业进入内存。因为其效率太低,其CPU大约有一半的时间,都处于空闲状态。
1、多道程序环境下的对换
(1)引入对换原因
在多道程序环境下,一方面是内存中的某些进程由于谋事件尚未发生而被阻塞运行,但它却仍然占据着大量的内存空间,甚至有时会使在内存中的所有进程都被阻塞,而迫使CPU停下来等待的情况;系统资源是一种严重的浪费,且使系统吞吐量下降。所谓“对换”,是指把内存中暂不能运行的进程,或暂时不用的程序和数据,换出到外存上,以腾出足够的内存空间,运行条件的进程,或进程所需要的程序和数据,换入内存。
在早期的UNIX版本中,引入了对换功能。在系统中设置一对换进程,由它将内存中暂时不能运行的进程,调出至磁盘上;也有它将磁盘上已具备运行条件的进程,调入内存。Microsoft公司的Windows OS也具有兑换功能,因为对换本身是用户的行为,即由用户决定是否进行对换及换出哪一个进程,这不是系统的行为。
对换是以整个进程为单位,便称之为“整体对换”或“进程对换”解决内存紧张问题,对换是以“页”或“段”为单位,则分别称之为“页面对换”或“分段对换””。为了实现进程对换,系统必须能实现以下三方面的功能:⑴对对换空间的管理;(2)进程的换出;又统称为“部分对换(3)进程的换入。
2、对换空间的管理
对换功能的OS中,通常把外存分为文件区和对换区。前者用于存放文件,文件区管理的主要目标,是提高文件存储空间的利用率,后者则用于存放从内存换出的进程,由于对换区中驻留的时间是短暂的,而对换操作又较繁。则是提高进程的换入换出速度,所应采取的管理策略是用连续分配方式。
对交换区空闲盘块进行管理,在系统中应配置相应的数据结构,用空闲分区表或空闲分区链。在空闲分区表中的每个表目应包含两项,即对换分区首址和对换区长度,它们的基本单位都是盘块。
由于对对换区的分配,是采用连续分配方式,对换取的回收操作也可分为下述四种情况,即:
(1)回收区与插入点的前一分区F1相邻接;
(2)回收区与插入点的后一分区F2相邻接;
(3)回收区还同时与F1和F2二个分区相邻接;
(4)回收区的前、后没有与之相邻接的空闲分区。
对这几种情况的处理风发也与动态分区分配是的风发相同。
3、进程的换出与换入
当内核因执行某些操作而发现内存不足时,便调用对换程序或唤醒对换程序。它们的主要任务是实现进程的换入与换出。
(1)进程的换出
在进程换出时,是将内存中的某些进程调至对换区,以腾出内存空间,换出过程分以下两步:
①选出被换出的进程
对换程序或进程检查所有驻留在内存中的进程,首先选择处于阻塞或睡眠状态的进程,其优先级最低的进程换出。
②换出过程
换出程序(进程)要换出某个进程时,只能换出那些非共享的程序和数据段。对于共享的程序段和数据段,对每个段的引用计数执行减1操作,若其结果值不为0时,有进程需要用它,因而不能被换出;否则则表示该程序段或数据段,已不被其它进程需要,于是可以将它们换出。申请对换空间,若申请成功,便可将程序和数据写如对换区。
(2)进程的换入
当对换程序或对换进程去执行换入操作时,便去检查PCB集合中所有进程的状态。从中找出“就绪且换出”状态的进程,换出时间最久的进程作为换入进程,再根据进程的大小为其申请内存,此时可能:
①申请成功,直接将进程的换入;
②申请失败,须先将内存中的某些进程换出,腾出足够的内存后,再将该进程换入。
第三节 基本分页存储管理方式
连续分配方式会形成许多“碎片”,通过“紧凑”方法将碎片拼接成可用的大块空间,但须为此付出很大开销。根据离散分配时所用基本单位的不同,又可把离散分配方式分以下三种:
1、分页存储管理
2、分段存储管理
3、段页式存储管理
一、基本分页存储管理方式
在分页存储管理的方式中,如果不具备页面对换功能,则称为基本的(纯)分页管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。
1、页面与页表
(1)页面和物理块
页面:将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页。
物理块:把内存空间分成与页面相同大小的若干个存储块,称为物理块或页框。
(2)页面大小
页面若太小,一方面虽然可使内存碎片减小,从而减少内存碎片的总空间,有利于提高内存的利用率。但也会使每个进程占用较多的页面。从而导致进程的页表过长。
页面若太大,可以减少页表的长度,提高页面换出换进的速度,却会使页面内碎片增大。因此,页面大小应是2n,通常为512B—8KB。
2、页表:实现从页号到物理块号的地址映射。
二、地址变换机构
1、基本的地址变换机构
当进程要访问某个进程逻辑地址中的数据时,分为页号和也内地址两部分,如果页号大于或等于页表长度,则表示本次所访问的地址已经超越进程的地址空间。
2、具有快表的地址变换机构
由于页表是存放在内存中的,这使CPU每次要存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到该页的物理块号,将此块号与页内偏移量W拼接以形成物理地址。第二次访问内存时,才是从第一步所得地址中获得所需数据(或向此地址中写入数据)并将此页号与高速缓存中的所有页码进行比较。
三、两级和多级页表
现代的大多数计算机系统,都支持非常大的逻辑地址空间(232——264)在这样的环境下,页表就变的非常大,要占用相当大的内存空间。而且还要求是连续的,显然这是不现实的。我们可以从下述两个方面来解决这一问题:
1、对页表所需的内存空间,采用离散分配方式,来解决难以找到一块连续的大内存空间的问题。
2、只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再将它们调入内存。
四、反置页表
页表可以有效的减少页表占用的内存,在该表中却只包含已经调入内存的页面,并未包含那些尚未调入内存的各个进程的页面。因而必须每个进程建立一个外部页表(External Page Table)。分页存储管理方式的主要动力,是提高内存利用率;分段存储管理方式的引入,则主要是为了满足用户(程序员)在编程和使用上多方面的要求。
第四节 分段存储管理方式的引入
一、引入分段管理的目的
引入分段管理方式,主要是为了满足用户的下述一系列要求:
1、方便编程
通常,一个作业是由若干个自然段组成。因而,用户希望能把自己的作业按照逻辑关系划分为若干个段;每个段都有自己的名字和长度;要访问的逻辑地址是由段名(段号)和段内偏移量决定;每个段都从0开始编址。这样,用户程序在执行中可用段名和段内地址进行访问。
2、分段共享
通常,再实现程序和数据的共享时,都是以信息的逻辑单位为基础的。为了实现的共享,,也希望存储管理能与用户程序分段的组织方式相适应。
3、分段保护
在多道程序环境下,为了防止其它程序对某中程序在内存中的数据有意无意的破坏,必须采用保护措施,对内存中信息的保护,同样是对信息的逻辑单位进行保护。因此,采用分段的组织和管理方式,对于实现保护功能,将是更有效和方便的。
4、动态链接
通常,用户源程序经过编译所形成的若干个目标程序,还须再经过链接以形成可执行程序后,方能执行,进行的链接称为静态链接。动态链接是指在作业运行之前,并不把几个目标程序段链接起来。
5、动态增长
在实际使用中,往往有些段特别是数据段,会不断地增长,而事先又无法确切地知道数据段会增长到多大。这种动态增长的情况是其它几种存储管理方式都难于应付的;而分段存储管理方式却能较好地解决这一问题。
二、分段系统的基本原理
1、分段
2、段表
每个段分配一个连续的分区,而进程中的各个段可以离散放入内存中不同的分区中。段表可以存放在一组寄存器中,是将段表放在内存中。
三、地址变换机构
四、分页和分段的主要区别
由上所述不难看出,分页和分段系统有许多相似之处,但在概念上两者完全不同,主要表现在:
1、页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
2、页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。
段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。
3、分页的作业地址空间是维一的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。
分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
五、共享与保护
在5 5 1节中已述及段是信息的逻辑单位。分段系统的一个突出的优点,便是易于实现段的共享,即允许若干个进程共享一个或多个段,而且对段的保护也十分简单易行。如果代码是可重入的(Reentrant),则无论是在分页系统还是在分段系统中,该代码都能被共享。
在分页系统中,为实现代码的共享,应在每个进程的页表中,还需为自己的数据区建立页表项,只需为文本编辑程序设置一个段表项,可重入代码是一种不允许任何进程对其进行修改的代码。
六、段页式存储管理
1、基本原理
段页式系统的基本原理是分段和分页原理的组合。即先将用户程序分为若干个段,再把每个段分为若干页,并为每个段赋予一个段名。如图(5-26(a)是出了一个作业地址空间的结构。
在段页式系统中,为了实现从逻辑地址到物理地址的变换,系统中需同时配置段表和页表由于允许将一个段中的页进行离散分配,因而使段表的内容略有变化:它不在是段的内存始址和段长,而是页表始址和页表长度,图5-27示出了利用段表和页表进行从地址空间物理(内存)空间的映射功能。
2、地址变换过程
在段页式系统中,需三次访问内存。第一次访问,是访问内存中的段表。第二次访问,是访问内存中的页表。第三次访问,才是真正从第二次访问所得的地址中,取出指令或数据。由于它的基本原理与分页及分段时的情况相似,故在此不在述。
第五节 虚拟存储器的基本概念(P125)
驻留在内存直至作业运行结束。尽管运行中的进程会因I/O而长期等待,或有的程序运行的一次后,就不在需要运行了,然而它们都将继续占据宝贵的内存资源,此即所谓的驻留性。
一、虚拟存储器的引入
对于是否需要一次性将作业全部装入,作业是否需要长期地驻留在内存问题。不少学者已进行了广泛的研究,这些研究结果为虚拟存储器的实现定了基础。
1、局部性原理
程序在执行时将呈现出局部性规律,即在一较短时间内,程序的执行仅限于某个部分;相应地,它所访问的存储空间也局限于某个区域。它提出了下述几个论点:
(1)程序在执行时,除了少部分的转移和过程调用指令外,在大多数情况下仍是顺序执行的。该论点也在后来许多学者们对高级程序设计语言规律的研究中被证实。
(2)过程调用将会使程序的执行有一部分内存区域转至另一部分区域,。但经研究表明,在大多数情况下,过程调用的深度都不超过5。这就是说,程序将会在一段时间内,都局限在这些过程的范围内运行。
(4)程序中还包括许多对数据结构的处理,如对数组进行操作,它们都往往都局限于小的范围内。
2、局限性表现
(1)时间局限性。如果程序中的指令一旦执行自然不久以后该指令可能再次执行;如果某个数据结构被访问,则不久以后该数据结构可能再次被访问,产生时间局限性的典型原因实在程序中存在着大量循环操作。
(2)空间局限性。一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围内,其典型情况便是程序顺序执行。
二、虚拟存储器的定义
基于局部性原理,一个作业在运行之前,没有必要全部装入内存,而仅将那些当前要运行的那部分页面或段,先装入内存便可启动运行,其余部分暂时留在磁盘上。
三、虚拟存储器的实现方式
虚拟存储器的实现,毫无例外地都是建立在离散分配存储管理方式的基础上的。目前,所有的许怒存储管理都是采用下述方式之一实现的。
1、分页请求系统
为了能实现请求调页和置换功能,系统必须提供必要的硬件支持,其中,最重要的是:
(1)请求分页的页表机制。它是在分页的页表机制上增加若干个项而形成的,作为请求分页的数据结构;
(2)缺页中断机构。每当用户程序要访问的页面尚未调入内存时,便产生一缺页中断,以请求OS将所缺的页面调入内存;
(3)地址变换机构。它同样是在分页的地址变换机构的基础上发展形成的。
为了实现请求调页还须得到OS的支持,在实现请求调页功能时,石油OS将所需的页从外存调入内存;在实现置换功能时,也是由OS将内存的某些页调至外存。
2、请求分段系统
为了实现请求分段,系统同样需要必要的硬件支持:
(1)请求分段的段表机制。。这是在钝分段的段表机制基础上,增加若干项而形成的;
(2)缺段中断机构。每大拇哥用户程序所要访问的所要访问的所尚未调入内存时,产生一缺段中断,请求OS将所缺的段调入内存;
(3)地址变换机构。
与请求调页类似,实现请求调段和置换功能也需要得到OS的支持。
四、虚拟存储器的特征
虚拟存储器最基本的特征是离散性,在此基础上又形成了多次性及对换性的特征。其所表出来的最重要的特征是虚拟性。
1、离散性
离散性是指在内存分配是采用离散分配方式,这是其他几个特征的基础。没有离散性,也就不可能实现虚拟存储器。
2、多次性
多次性是指一个作业被分成多次地调入内存运行,即在运行时没有必要将其全部装入,只须将当前要运行的那部分程序和数据装入内存即可;以后运行到那一部分时在将它调入。
3、对换性
对换性是指允许在作业的运行过程中换进、换出。在进程运行期间,允许将那些暂不使用的程序和数据,从内存调至外存的对换区(换出),以后需要时再将它们从外存调至内存换入;甚至还允许将暂时不运行的进程调至外存,具备运行条件时再调入内存。换进、换出能有效地提高内存利用率。可见,虚拟存储器具有对换性特征。
4、虚拟性
虚拟性是指能够从逻辑上扩允内存容量,使用户所看到的内存容量远大于实现内存容量。这是虚拟存储器所表现出来的最重要的特征,也是实现虚拟存储器的最重要的目标。
第六节 请求分页存储管理方式
一、请求分页中的硬件支持
为了实现请求分页,系统必须提供一定的硬件支持,他除了需要一台具有一定容量的内存及外存的计算机系统外,还需要有页表机制、缺页中断机构以及地址变换机构。
1、页表机制
在请求分页系统所需要的主要数据结构,仍然是页表。其基本作用是将用户地址空间的逻辑地址变换为内存空间的物理地址。由于只将应用程序的一部分调入内存,还有一部分仍在磁盘上。供程序(数据)在换进、换出时参考,在请求分页系统中的每个页表项如下所示:
页号 |
物理块号 |
状态位P |
访问字段A |
修改位M |
外存地址 |
现对其中名各字段说明如下:
(1)状态位(存在位)P。用于指示该页是否调入内存,供程序访问时参考。
(2)访问字段A。用于记录本页在一点时间内被访问的次数,或最近已有多长时间未被访问,提供给置换算法选择换出页面时参考。
(3)修改位M。表示该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,若未被修改,在置换该页时就不须将该写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本。
(4)外存地址。用于指出该页在外存上的地址,通常是物理块号,供调入该页时使用。
2、缺页中断机构
在请求分页系统中,每当所要访问的页面不在内存时,便要产生一缺页中断,请求OS将所缺之页调入内存。但缺页中断又是一种特殊的中断,它与一般的中断相比,有着明显的区别,主要表现如下:
(1)在指令执行期间产生和处理中断信号。
(2)一条指令在执行期间,可能产生多次缺页中断,在图6-1中示出了一个例子。
3、地址变换机构
如果在快表中未找到该页的页表项,则应再到内存中去查找页表,再从找到的页表项中的状态位P,该页是否调入内存。其结果可能是:
(1)该页已经调入内存,这是应将此页的也表项写入快表,当快表已满足时,应先调出按某种算法所确定的页的页表项,然后再写入该页的页表项。
(2)该页尚未调入内存,这时便应产生缺页中断,请求OS从外存中爸爸该页调入内存。
二、内存分配策略和分配算法
1、最小物理块数
这里所说的最小物理块数是指能保证进程正常运行。单地址指令且采用直接寻址方式,如果该机器允许间接寻址时,则至少要求有三个物理块。
2、物理块的分配策略
在请求分页系统中,可采用两种分配策略,即固定和可变分配策略。在进行置换时,也可采取良种策略,即全局置换和局部置换。于是可组合出以下三种使用的策略:
(1)固定分配局部置换(Eixed Allocation, Local Replacement)
基于进程的类型,或根据程序员、系统管理员的建议,为每个进程分配一固定页数的内存空间,在整个运行期间都不在改变,只能从该进程在内存的n个页面中选出一页换出,然后再调入一页以保证分配给该进程的内存空间不变。这种策略困难在于:应为每个进程分配多少个页面的内存难以确定。若太少,会频繁地出现缺页中断,降低了气筒的吞吐量;若太多,又必然是内存中驻留的进程数目减少。
(2) 可变分配全局置换(Variable Allocation,Global Replacement)
在采用这种策略时,系统中的每个进程分配一定数目的物理块,而OS自身也保持一个空闲物理块队列。当某进程发现缺页时,由系统从空闲物理块队列中,取出一物理块分配给该进程,并将调入的缺页装入其中。
(3) 可变分配局部置换(Variable Allocation,Local Replacement)
进程分配一定数目的内存空间,但当某种进程发生缺页时,只允许从该进程在内存页面中选出一页换出,频繁地发生缺页中断,为该进程分配若干个附加的物理块,缺页率减低到适当程度为止。
三、分配算法
在采用固定分配策略时,如何将系统中可供分配的所有物理块分配分配给各个进程,可采取下述几种方法。
1、平均分配算法
将系统中所有可供分配的物理块,平均分配给各个进程。
2、按比例分配算法
这是根据进程的大小按比例分配的物理块。系统中各进程页面数的总和为:
S=
又假定系统中可用的物理块总数为m,则每个进程所能分配到的物理块数为bi将有:
bi=*m
3、考虑优先权的分配算法
通常采用的方法是把内存中可供有分配的所有物理块分成两部分:一部分按比例地分给各进程;另一部分则根据各进程的优先权,适当地增加其相应份额后,分配给各进程。
四、页面调入策略
1、何时调入页面
(1)预调页策略
采用一种以预测为基础的预调页策略;预计在不久之后便会被访问的程序或数据所在的页面,预先调入内存,目前预调页的成功率仅约50%。这种策略主要用于进程首次调入时,由程序员指出应该先调入哪些页。
(2)请求调页策略
当进程在运行中需要访问某部分程序的数据时,发现其所在的页面不在内存,需立即提出请求,由系统将其所需页面调入内存。由请求调页策略所确定调入的页,是一定会被访问的,再加之请求调页策略比较易于实现,故在目前的虚拟存储器中,大多采用此策略。
2、从何处调入页面
每当发生缺页请求时,系统应从何处将缺页调入内存。对于不同的系统,其所采用的方法也各不相同,可分成三种情况:
(1)系统拥有足够的对换区空间,可以全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,便须将与该进程有关的文件,从从文件区拷贝到对换区。
(2)系统缺少足够的对换区空间,不会被修改的文件,都直接从文件区调入;但对于那些可能被修改的部分,在将它们换出时,便须掉到对换区,需要是再从对换区调入。
(3)UNIX方式,由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过的而又被换出的页面,由于是被放在对换区的,因此在下次调入时,应从对换区调入。
3、页面调入过程
每当程序所要访问的页面未在内存时,便向CPU发出一缺页中断,有中断处理程序首先保留CPU环境,分析中断原因后,转入缺页中断处理程序,该程序通过查找页表,得到该页所在外存的物理块号。
第七节 页面置换算法
一、最佳(Optimal)置换算法
采用最佳置换算法可保证获得最低的缺页率。但由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不在被访问的,因而该算法也是无法实现的,但是可利用该算法去评价其它算法。图6-3示出了利用最佳置换算法时的置换图。由图可看出,采用最佳置换算法,只发生了6次页面置换。
二、先进先出页面置换算法
该算法总是淘汰最先进入内存的页面,即选择在内存中的驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,含有全局变量、常用函数、例程等的页面,FIFO置换算法并不能保证这些页面不被淘汰。
三、最近最久未使用LRU置换算法
1、LRU(Least Recently Used)算法的描述
FIFO置换算法之所以性能较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况。而最近最久未使用(LRU)的页面置换算法,,则是根据页面调入内存后的使用情况。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似。因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。
2、LRU算法的硬件支持
把LRU算法作为页面置换算法是比较好的,它对于各种类型的程序都能适用,但实现起来有相当大的难度,因为它要求系统具有较多的支持硬件。所要解决的问题有:
Ø 一个进程在内存中的各个页面各有多久时间未被进程访问;
Ø 如何快速地知道哪一页最近最久未使用的页面。为此,须利用以下两类支持硬件:
(1)寄存器
用于记录某进程在内存中各页的使用情况。
实页/R |
R7 |
R6 |
R5 |
R4 |
R3 |
R2 |
R1 |
R0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
2 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
3 |
0 |
0 |
O |
0 |
0 |
1 |
0 |
0 |
4 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
5 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
6 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
7 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
8 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
(2)栈
可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。
四、Clock 置换算法
1、简单的Clock置换算法
利用Clock算法时,只须为每页设置一位访问位,在将内存中的所有页面都通过链接指针链成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只须检查其访问位。
2、改进型Clock置换算法
在将一个页面换出时,如果该页已被修改过,便须将它重新写到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。同时满足两条件的页面作为手癣淘汰的页。由访问位A和修改位M可以组合成下面四种类型的页面:
1 类(A=0,M=0)。表示该页最近既未被访问、又未被修改,是最佳淘汰页。
2 类(A=0,M=1)。表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
3 类(A=1,M=0)。最近已被访问,但未被修改,该页有可能再被访问。
4 类(A=1,M=1)。最近已被访问且被修改,该页有可能再被访问。
在内存中的每个页必定是这四类页面之一,在进行页面置换时,可采用与简单Clock算法相类似的算法,其差别在于须同时检查访问位和修改位,以确定该页是四类页面中的那一种。此算法称为改进型Clock算法。其执行过程可分成以下三步:
(1)从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。
(2)如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有经过的页面的访问位置0。
(3)如果第二步也失败,即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后,重复第一步,如果仍失败,必要时在重复第二步,此时就一定能够找到被淘汰的页。
五、其它置换算法
1、最少使用(Least Frequently Used)置换算法
在采用该算法时,应为在内存中的每个页面设置一移位寄存器,用来记录该页面被访问的频率,该置换算法选择在最近时期使用最少的页面作为淘汰页。
2、页面缓冲算法(Page Buffering Algorithm)
虽然LRU和Clock置换算法都比FIFO算法好,但它们都需要一定的硬件支持,置换一个已修改的页的开销要大。而页面缓冲算法则既改善分页系统的性能,又可采用一种较简单的置换策略。
六、请求分页系统的性能分析
1、缺页率对有效访问的时间的影响
缺页时须先调入该页的情况时,有效访问时间表示为:有效访问时间=(1-p) ma+p 缺页中断时间。
2、缺页中断时间的组成
(1)缺页中断时间服务时间;
(2)将缺页中断读入的时间;
(3)进程重新执行时间。
由于CUP速度很快,所以其中地(1)和(3)两部分可以不超过1ms;而将一磁盘块读入内存的时间,则包括寻道时间、旋转时间和数据传送时间三部分,大体上是24ms。由此可得知缺页中断时间约为25ms。此处尚未考虑到进程可能因排队等待所花费的时间。将上述数据代入到工集有效访问时间
七、工作集
形成图6-9中所示的曲线状态的原因,是由于缺页率的大小与进程运行时的所谓的工作集有关,故此,需先介绍工作概念。
所谓工作集是指,在某段时间间隔Δ里,进程实际要访问的页面的集合。便是把某进程在时间t的工作集记为w(t,Δ),把变量Δ称为工作集“窗口尺寸”(Windows Size)。
工作集窗口Ä 的大小,对存储器的有效利用和系统吞吐量的提高,都将产生重要的影响。如果把Ä选择的很大,将一个进程的整个地址空间全部装入内存。虽然进程不会再产生缺页情况,将不会得以充分的利用,从而失去了细腻存储器的意义。如果把Ä选择的过小,则会使进程在运行中频繁地产生缺页中断,因而反倒降低了系统的吞吐量。因此,工作集的大小应选择的适中。
八、抖动产生的原因和预防方法
1、抖动产生的原因
在请求分页系统中,通常每一个进程都只能分配到它所需要全部内存空间中的一部分;如果进程A在运行过程中需要增加页面,它边会产生中断。在采用全局置换策略时,实际上它有可能是被分配到一个原属B进程的物理块,用来装入新调入的页。而B进程在运行中还需要该物理块,因而也会产生缺页中断,于是有可能又获得了C进程的一个物理块,等等。而这些产生缺页中断的进程,可能会因页面的调入/调出而处于等待状态。从而导致就绪队列空。
图6-11示出了CPU的利用率与多道程序度之间的关系。再开始阶段,岁着程序度的提高,CPU的利用率也随之提高,并在随后达到某一峰值。此后如果继续增加多道程序度,将产生抖动,从而导CPU的利用率急剧下降。
2、抖动的预防
为了保证系统有较大的吞吐量,必需防止发生抖动。
(1)采取局部置换策略
当某进程发生缺页后,仅在自己的内存空间范围内置换页面,不允许从其它进程获得新的物理块。即使有某个进程发生了“抖动”,也不致引起其它进程也产生抖动,从而把抖动限于较小的范围内。这种方法并不是很好,因为它不能从根本上防止抖动的发生。
(2)在CPU调度程序中引入工作集算法
在引入工作集法后,在调度程序从外存上调入作业之前,还必须检查每个进程在内存的驻留集是否足够大。
(3)L=S准则
Denning于1980年提出了“L=S准则”,用来调整多道程序度,以使产生缺页的平均时间(L)等于系统处理进程缺页的平均时间(S)。
(4)挂起若干进程
当多道程序度偏高时,为了防止发生“抖动”,可用的一个简单易行的办法是挂起以下进程,以便腾出内存空间来分配给抖动的进程。
第八节 请求分段存储管理方式
一、请求分段中的硬件支持
1、段表机制
在请求分段式管理中所需的主要数据结构是段表,由于应用程序的许多段中,只有一部分装入内存,其余一些段仍在外存上,在段表中增加若干项,以供程序在调进、调出是参考。请求分段的段表项。
段名 |
段长 |
段的基址 |
存取方式 |
访问字段A |
修改字段M |
存在位P |
增补位 |
外存起址 |
在段表项中,除了段名(号)、段长、段在内存的起始地址外,还增加了以下诸项:
(1)存取方式。用语标志本分段的存取属性是只执行、只读,还是允许读/写。
(2)访问字段A。其含义与请求分段的相应字段相同,用语记录该段被访问的频繁程度。
(3)修改位M。用于表示该页进入内存后,是否已被修改过。
(4)存在位p。指示本段是否已掉日内存。
(5)增补位。这是请求分段式管理中所特有的字段,用于表示本段在运行过程中,是否进行过动态增长。
(6)外存始址。指示本段在外存中的起始地址,即起始盘块号。
2、缺段中断机构
在请求分段系统中,采用的是请求调段策略。每当进程所要访问的段尚未调入内存时,便由缺段中断机构产生一缺段中断信号,进入OS后由缺段中断处理程序将所需的调入内存。缺段中断的处理过程如图6-12所示。从中可以看出,对缺段中断的处理要比对缺页中断的处理复杂,因为段是不定长的。
3、地址变换机构
请求分段系统中的地址变换机构,是在分段系统地址变换机构的基础上形成的。因为被访问的段并非全在内存,因而在地址变换时,若发现所要访问的段不在内存时,必须先将所缺的段调入内存,并修改了段表之后,才能再利用段表进行地址变换。为此,在地址变换机制中又增加了某些功能,如缺段中断的请求及其处理等。图6-13示出了请求分段系统的地址变换过程。
二、分段共享与保护
1、共享段表
为了实现分段共享,可在系统中配置一张段表,所有各共享段都在共享段表中占有一表项。表项中记录了共享段的段号和段长、内存始址、存在位等信息,并记录有共享此分段的每个进程的情况。共享段表6-14所示。其中:
(1)共享进程计数
非共享段仅为一个进程所需要。当进程不在需要该段时,可立即释放该段,并由系统回收该段所占用的空间。而共享段是为多个进程所需要的,当某进程因不在需要而释放它时,系统并不回收该段所占内存区。
(2)存取控制字段
对于一个共享段,应给不同的进程以不同的存取权限。
(3)段号
对于同一个共享段,不同的进程可以使用不同的段号去共享该段。
2、共享段的分配与回收
(1)共享段的分配
在分配共享段的内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,在把共享段调入该区,同时将该区的始址填入该进程的段表的相应项中,还需在共享段表中增加一表项,填写有关数据。
(2)共享段的回收
当共享此段的某进程不在需要它时,应将该段释放,包括取消进程段表中共享段所对应的表项,由系统回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,表明此时已没有进程使用该段;否则(减1结果不为0),则只是取消调用者进程在共享段表中的有关记录。
3、分段保护
在分段系统中,由于每个分段在逻辑上是独立的,因而比较容易实现信息保护。
(1)越界检查
在段表积存中放有段表长度信息同样,在段表中也为每个段设置有段长字段。在进行存储访问时,首先,将逻辑地址空间的段号与段表长度进行比较,如果段号等于或大雨段表长度,将发出地址越界中断信号;其次,还要检查段内地址是否等于或大于段长,若是大于段长,将产生地址越界中断信号,从而保证了每个进程只能在自己的地址空间内运行。
(2)存取控制检查
在段表的每个表项中,都设置了一个“存取控制”字段,用于规定对该段的访问方式。通常的访问方式有:
(1)只读。只允许程序对该段中的程序或数据进行读访问;
(2)只执行。只允许程序调用该段去执行,但不准读该段的内容,也不允许对该段执行写操作;
(3)读/写。允许程序对该段进行读写访问。
4、环保护机构
它是一种功能较完善的保护机构。在该机制中规定:低编号的环具有高优先权,OS核心处于0环内;某些重要的实用程序和操作系统服务,占居中间环;而一般的应用程序,则被安排在外环上。
在环系统中,程序的访问和调用应遵循以下规则:
(1)一个程序可以访问驻留在相同环或较低特权环中的数据;
(2)一个程序可以调用驻留在相同环或较高特权环中的服务。
第九节 OS/2存储器管理
一、Intel 80386 的寻址方式和存储器管理方式
1、Intel 80386 的寻址方式
(1)实方式寻址
(2)保护寻址方式
(3)虚拟8086寻址方式
2、Intel 80386 提供的存储管理方式
(1)不分段也不分页的存储管理方式
(2)分页不分段的存储管理方式
(3)分段不分页的存储管理方式
(4)分段分页存储管理方式
3、分段存储管理方式
(1)段描述符表
在分段管理中最重要的数据结构是段表。进程的每一个段,在段表中都有一表项。80386的存储存储管理也不例外。每个用户任务所配置的段表,称为局部描述符表LDT。
其中,各字段说明如下:
①段的地址。共32位,定义了段在4GB线性地址空间中的始址。
②段界限值。规定了段的最大长度。其单位可以是字节或页(4KB),着取决于粒度位G(granularity bit)。
③存在位p。用于指示段是否已调入内存。
④系统(非系统)段标志。
⑤描述符特权级DPL。用于描述本段的特权级,为0-3共四个等级。进程要访问该段时,至少也应具有改变特权级。
⑥段的类型Type。对于系统段(s=0),是用于表示段的类型,则表示该段的存取控制。
⑦操作数长D,进用于码段描述符。
⑧访问位A。用于请求分段不分页的系统中,每当该段被访问时,将A置1。
二、分段的地址变换机构
1、段寄存器
2、虚地址机构
3、地址变换
三、分页存储管理
1、两级页表机制
2、页表目录和页表
页表目录格式包含以下各项:
(1)页表物理块号。若该页表已调入内存,边将该页表所在的物理块号放入其中;若尚未调入内存,此位置空闲。
(2)存在位P。指示该页表是否调入内存。
(3)访问位A。每当CPU访问该页时,将该位置1。
(4)脏位D(Dirty bit)。对页表目录项无意义。
(5)US(用户/管理)位。提供页保护。当在用户及时,允许系统和应用访问;若为管理级,则只允许操作系统访问。
(6)RW(读/写)位。为用户级页面提供保护,指示该页面是只读还是可读/写。
(7)可用位Aail。留给系统程序员使用。
在图6-17(b)中示出了页表表目格式。它与页表表项十分相似,差别仅在于:(1)在12-31位中装入的是页面的物理块号;(2)每当CPU访问该页时,将其脏位D置1。
四、分页地址变换
为了加速地址变换过程,用于存放页表目录的基址。在进行地址变换时,分三步进行:
(1)利用分段部件送来的32位线性地址中的页表目录号(31-22位),从页表目录中找出响应的目录项,即可得知该页表在内存的物理块号;
(2)利用线性地址中的页号(21-12位)去查找页表,获得相应的页表表项,即可从中获得该页在内存的物理块号。
(3)在将该物理块号与线性地址中的偏移量拼接。
五、联想存储器
本章作业:P142第8、15、23、26题。