操作系统为了有效地管理计算机的内存资源,应该具备以下四大功能:内存分配、内存保护、地址映射、内存扩充。
主要任务:为每一道程序分配内存空间,当程序撤消时,则收回它占用的内存空间。
目标程序所访问的地址是逻辑地址集合的地址空间,而内存空间是内存中物理地址的集合,在多道程序环境下,这两者是不一致的。
因此,存储管理必须提供地址映射功能,用于把程序地址空间中的逻辑地址转换为内存空间中对应的物理地址。
内存保护的任务就是确保每道程序都在自己的内存空间运行,互不干扰。
内存扩充的任务是从逻辑上来扩充内存容量,使用户认为系统所拥有的内存空间远比其实际的内存空间(硬件RAM)大的多。
名字空间:在源程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合称为“名字空间”
把目标模块中的地址称为相对地址(或称为“逻辑地址”),而把相对地址的集合称为**“相对地址空间/逻辑地址空间”**或简称为“地址空间”
三者关系如图:
地址重定位完成把相对地址转换成内存中的绝对地址,这个过程称为地址映射(map)。按照重定位的时机,可分为静态重定位和动态重定位。
静态重定位是在程序执行之前进行重定位。
根据装配模块将要装入的内存起始地址,直接修改装配模块中的有关使用地址的指令。
原理如图:
eg:LOAD 1,2500 这条指令是把相对地址为2500的存储单元的内容365装入1号累加器。而这时内容为365的存储单元的实际物理地址为12500(起始地址10000+相对地址2500),所以LOAD 1,2500 这条指令中的直接地址码要作相应的修改,即改为LOAD 1,12500
在图3-4中LOAD 1,2500这条指令中仍保持相对地址2500。当该指令被操作系统取到中央处理器指令寄存器上执行时,操作系统首先把该模块装入的实际起始地址减去目标模块的相对基地址(图3-4中该模块的基地址为0),然后将其差值10000装入重定位寄存器。
该存储管理方式只能用于单用户、单任务的操作系统。它将内存分为两个区:
分区存储管理是能够满足多道程序运行的存储器管理方案,其基本思想是将内存划分成若干个连续的区域,称为分区。
固定分区是在作业装入之前,内存就被划分成若干个分区。
划分工作可以由系统管理员完成,也可以由操作系统实现。
一旦划分完成,在系统运行期间不再重新划分,即分区的个数不可变,分区的大小不可变,所以,固定式分区又称为静态分区。
系统有一张分区说明表,每个表目说明一个分区的大小、起始地址和是否已分配的使用标志。分区说明表和内存分配图如下所示。
固定式分区实现技术简单,但是内存的利用率不高。
采用这种技术,虽然可以使多个作业共驻内存,但每个被分配的分区总有一部分被浪费,这部分被浪费的存储区称为内零头或内碎片。
可变分区是指在作业装入内存时,从可用的内存中划出一块连续的区域分配给它,且分区大小正好等于该作业的大小,且分区大小和分区个数都是可变的。
优点:可以获得较大的灵活性,又能提高内存的利用率。
系统初始化后,内存被划分成两块,一块用于常驻的操作系统,另一块则是完整的空闲区(用户区)。如图:512KB内存中除20KB操作系统外,装入作业2、3、4、6四个,有空闲区1、2、3三个。
空闲区表形式
空闲分区表为每个尚未分配的分区设置一个表项,包括分区的序号、大小、始址和状态。
空闲区链形式
在每个分区的起始部分,设置一些用于控制分区分配的信息,以及用于链接其它分区的前向指针;在分区尾部,则设置了一个后向指针,为了检索方便也设置了控制分区分配的信息。将所有的分区链接成一个双向链表。
当一个作业运行完毕释放内存时,系统根据释放区的首地址,从空闲区说明表中找到相应的插入点,此时可能出现下列四种情况,如图,其中F1,F2表示回收区的前、后空闲区。
为了减少碎片提高存储器的利用率而引入了离散分配方式,它将一个用户的程序划分成若干个大小相等的页再离散地分配到内存的多个不相邻的区域中。
如图:
地址变换机构的基本任务:利用硬件实现查页表,把用户程序中的逻辑地址变换成内存中的物理地址。
为了实现该功能,在系统中设置页表寄存器:用来存放页表的始址和页表的长度。
在进程未执行时,每个进程对应的页表的始址和长度存放在进程的PCB中,当该进程被调度时,就将它们装入页表寄存器。
在进行地址变换的步骤:
计算案例:假设页长为1KB(1024字节),逻辑地址为2500(十进制)。利用页表把逻辑地址变换成物理地址计算步骤如下:
(1)将虚地址分离成页号P和页内地址d:
页号P=(逻辑地址/页大小)取整=(2500/1024)取整=2
页内地址d=逻辑地址 mod 页大小=2500 mod 1024=452
(2)根据页号查页表,由页表项读出块号:
由页号 P=2查页表得块号为5
(3)块号和页内地址构成物理地址:
物理地址=块号×页大小+页内地址= 5*1024+452 =5572
为了提高地址变换的速度,在地址变换机构中增设了一个具有按内容查找、并行查询功能的特殊的高速缓冲存储器,称为“联想存储器” 或“快表”,或称为“关联存储器” ,用以存放当前访问的那些页表项,每个页表项包括页号和相应的块号(页号不能省略)。
原理:在快表的输入寄存器输入页号后,输入页号与快表中的各页表项中的页号同时比较,如有相同,快表的输出寄存器输出相应的块号,如都不相同,快表的输出寄存器不输出。
案例:把四个源程序段编译后的目标程序段:主程序段main(15KB)、子程序段X(5KB)、数据段D(6KB)、堆栈段S(7KB)按线性空间的一维地址顺序排列起来,再分成8页,每页为4KB。如图:
这时一个页面中可能装有两个不同子程序段的指令代码
在分段存储管理方式中,作业的地址空间按逻辑信息完整性被划分为若干个段,每个段都有自己的名字,编译后都是从零开始编成的一段连续的地址空间,段的长度由相应逻辑信息组的长度决定,因而各段长度是不等的。
逻辑地址由段号和段内地址两部分组成。
段是信息的逻辑单位,因此分段系统的一个突出的优点是易于实现段的共享。(即允许若干个进程共享一个或多个段)
在实现段共享时,需要用到可重入代码又称为**“纯代码”。它是一种允许多个进程同时访问的代码,是一种不允许任何进程对其进行修改**的代码。
将内存空间划分成相同大小的若干个块,将用户程序先按逻辑完整性分为若干个段,并为每个段赋予一个段名。
再把每个段划分成若干个与块大小相同的页,将进程中的若干页离散装入不相邻接的块中
如图:
为了实现从逻辑地址到物理地址的变换,系统中必需同时配置段表和页表,由于将段中的页进行离散地分配,段表中的内容不再是段的内存始址和段长,而是页表始址和页表长度。
如图:
前面的管理方式都需要将一个作业全部装入内存才能运行,对内存消耗很大。
对此,虚拟存储技术通过在逻辑上扩充内存容量来解决这一问题。
仅将那些当前要运行的那部分页面或段,先装入内存便可启动运行,其余部分暂时留在磁盘上
如果程序所要访问的页(段)尚未调入内存(称为缺页或缺段),此时程序应利用操作系统所提供的请求调页(段)功能,将它们调入内存,以使进程能继续执行下去。
如果此时内存已满,无法再装入新的页(段),则还须再利用页(段)的置换功能,将内存中暂时不用的页(段)调出至磁盘上
虚拟存储器是采用请求调入和置换功能,将内存和外存统一管理,达到把作业的一部分装入内存便可运行,给用户提供的一个比内存容量大的一维的逻辑地址空间。容量由内存和外存容量之和、计算机的地址结构二者所决定,其运行速度接近于内存速度。
虚拟存储技术是一种性能非常优越的存储器管理技术,故被广泛地应用于大、中、小型机器和微型机中。
请求分页系统:
在分页系统的基础上,增加了请求调页和页面置换功能所形成的页式虚拟存储系统
请求分段系统:
在分段系统的基础上,增加了请求调段和分段置换功能所形成的段式虚拟存储系统。
请求段页式系统:
在段页式系统的基础上,增加了请求调页和页面置换功能所形成的段页式虚拟存储系统。
离散性:内存分配时采用离散的分配方式,它是虚拟存储器的最基本的特征。
多次性:一个作业被分成多次调入内存运行,即在作业运行时没有必要将其全部装入,多次性是虚拟存储器最重要的特征。
对换性:允许在作业的运行过程中在内存和外存的对换区之间换进、换出。
虚拟性:能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。
请求分页存储管理方式是在纯分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页式虚拟存储系统。
为了能实现请求调页和置换功能,系统必须提供必要的硬件支持:扩充的页表机制和缺页中断机制。
需在页表中再增加若干项,供程序(数据)在换进、换出时参考。在请求分页系统中的每个页表项如图所示:
其中各字段说明如下:
在请求分页系统中,每当所要访问的页面不在内存时,便要产生一缺页中断,请求OS将所缺页调入内存。
与一般中断的主要区别在于:
物理块数目的下限:一条指令及其操作数可能涉及的页面数目的上限,以保证每条指令都能被执行。
在请求分页系统中,可采取两种分配策略:固定和可变分配策略。
在进行置换时,也可采取两种策略:全局置换和局部置换。于是可组合成以下三种策略:
在采用固定分配策略时,可采用以下几种物理块分配方法
为了将进程运行时所缺的页面调入内存,可采取预调页策略或请求调页策略两种方法。
对于每当进程发出缺页请求时,系统应从何处将缺页调入内存:
页面置换算法的性能指标:
缺页率( page fault rate )=“缺页次数 / 内存访问次数” (比率) 或“缺页的平均时间间隔的倒数”。
例:假定系统为某进程分配了3个物理块,并考虑有以下的页面号引用串:
7,0,l,2,0,3,0,4,2,3,0,3,2,l,2,0,l,7,0,1。
其中在刚刚开始的前三个页面进入物理块,因为此时物理块为空所以没有发生页面置换。
定义:FIFO算法认为 最先进入内存的页面,其不再使用的可能性比最近调入的页面要大。所以该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
它是一种最直观的算法,但它性能最差,有Belady异常现象
硬件机构:
该算法选择使用次数最少的页面淘汰。
在请求分页系统中,假设:
存储器的访问时间Tr:100ns
缺页率p:0.1%
缺页中断时间Tt:20ms;
当页号在内存页表查到时存取内存一个数据时间:T1=Tr+Tr =2*Tr,
而页面失效时存取内存一个数据时间:T2=Tr+Tt+Tr+Tr ≈ Tt 。
则有效访问时间就可以表示为:有效访问时间(μs) =(1一p)×T1十p×T2
由此可见:有效访问时间与缺页率成正比
所谓工作集是指,在某段时间间隔(Δ)里,进程实际要访问的页面的集合。
缺页率随着所分得的物理块数目的减少而递增,并在所分到的物理块数目较少处,出现一个拐点。
所以,为进程分配的物理块数,应取在该曲线的拐点左右。
请求分段系统在分段系统的基础上实现的虚拟存储器,是以分段为单位进行换入、换出的,同样需要一定的硬件支持和相应的软件,有段表机制、缺段中断机构以及地址变换机构。
在请求分段式管理中在段表中增加若干项,以供程序在调进、调出时参考。
在请求分段系统中,采用的是请求调段策略。
缺段中断的处理过程如下图:
类同缺页中断机构,当进程所要访问的段未调入内存时,便由缺段中断机构在硬件指令中间产生一缺段中断信号,由缺段中断处理程序将所需的段调入内存。与缺页中断机构不同的是由于各段长不同,置换时对内存的管理采用可变分区管理。
在请求分段存储管理中为了实现分段共享,减少共享段的调进调出次数,应增加配置共享段表,用来对共享段进行管理
在系统中,用共享段表来记录每一个共享段的段号和段长、内存始址、存在位等信息,并记录共享此分段的每个进程的情况。
存储保护是存储管理的重要任务,常用保护措施有越界检查、存取控制检查和环保护机构。在分段系统中,由于每个分段在逻辑上是独立的,因而实现信息共享保护有意义。
在段表寄存器中放有段表长度信息,在段表中也为每个段设置有段长字段。
分段地址映射及存储保护机制:
在段表的每个表项中,都设置了一个“存取控制”字段,用于规定对该段的访问方式:
end…