从搜索速度上看,最先适应算法具有最佳性能。从回收过程来看,最先适应算法也是最佳的。最先适应法尽可能地利用了地地址空间,从而保证高地址有较大的空闲区来放置要求内存较多的作业或进程。 最佳适应法找到的空闲区是最佳的,最坏适应法是基于不留下碎片空闲区这一点出发的,它选择最大的空闲区来满足用户的需求,以期分配后的剩余部分仍能进行再分配。 分区存储管理的优缺点: 优点: (1) (2) 缺点: (1) (2) (3)
内存利用率仍然不高
作业或进程的大小受分区大小控制,除非配合采用覆盖技术和交换技术 无法实现各分区之间的信息共享
实现了多个作业或进程对内存的共享,有助于多道程序设计,从而提高了系统的资源利用率 该方法要求的硬件支持少,管理算法简单,因而容易实现
覆盖与交换技术
7.覆盖与交换技术是在多道环境下用来扩充内存的两种方法。
覆盖技术要求程序员提供一个清楚地覆盖结构。即程序员必须完成把一个程序划分成不同的程序段,并规定好它们的执行和覆盖顺序的工作。操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。 交换技术是指先将内存某部分的程序或数据写入外存交换区,再从外存交换区中调入指定的程序或数据到内存中来,并让其执行的一种内存扩充技术。
交换技术不要求程序员给出程序段之间的覆盖结构,交换主要是在进程或作业之间进行,覆盖则主要是在同一个作业或进程内执行,覆盖只能覆盖那些与覆盖程序段无关的程序段。 交换进程由换入和换出两个过程组成。 8.页式管理
页式管理的基本原理
首先,进程虚拟地址空间分成大小相等的页面,进程的虚拟地址变为页号P与页内地址W组成。内存空间也按页的大小划分称片或页面,这些页面为系统中的任一进程所共享(除去操作系统以外),分页管理时,用户进程在内存空间内除了在每个页面内地址连续之外,每个页面之间不再连续)。采用请求调页或预调页技术实现内外存存储器的统一管理。
页式虚拟地址变为内存页面物理地址:页式管理把页式虚拟地址与内存页面物理地址建立一一对应页表,
并用相应的硬件地址变换机构,来解决离散地址变换问题。 页式存储管理要解决如下问题: (1)页式存储管理系统的地址映射; (2)调入策略; (3)淘汰策略; (4)放置策略。 静态页面管理
静态页面管理方法是在作业或进程开始执行之前,把该作业或进程的程序段或数据全部装入内存的各个页面中,并通过页表和硬件变换地址机构实现虚拟地址到内存物理地址的地址映射。 ①内存页面分配和回收
静态页面管理的第一步是为要求内存的作业或进程分配足够的页面。系统依靠存储页面表、请求表以及页表来完成内存的分配工作。
页表是页式存储管理的数据结构,它包括用户程序空间的页面与内存块的对应关系、页面的存储保护和存取控制方面的信息。
最简单的页表是由页号和页面号组成,页表在内存中占有一块固定的存储区,大小由进程或作业的长度来决定。页式管理时每个进程至少拥有一个页表。
请求表用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置。系统应该知道每个作业或进程的页表起始地址和长度,以进行内存分配和地址变换。请求表中还应该包括每个进程或作业所请求的页面数。 存储页表指出内存各页面是否已被分配出去,以及未分配页面的总数。通常有两种记录空闲存储块的方法:位图法和链表法。
位图法:在内存中划分一块固定区域,每个单元的每个比特代表一个页面,如果该页面已被分配,则对应比特位置1,否则置0。
链表法:在空闲页面链中,对首页面的第一个单元和第二个单元分别放入空闲页面总数与指向下一个空闲页面的指针。其他页面的第一个单元中则分别放入指向下一个页面的指针。链表法由于使用了空闲页面本身的单元存放指针,因此不占据额外的内存空间。
分配算法:请求表给出进程或作业要求的页面数,然后,由存储页面数表检查是否有足够的空闲页面,如果没有,则本次无法分配,如果有则首先分配设置页表,并填写请求表中的相应表项后,按一定的查找算法,搜索出所要求的空闲页面,并将对应的页面号填入页表中。
静态页式管理的页面回收方法:当进程执行完毕时拆除对应的页表,并把页表中的各页面插入存储页面表即可。 动态页式管理
动态页式管理分为请求页式管理和预调入页式管理。
请求式分页存储管理与静态页式管理在内存块的分配与回收,存储保护某方面都十分相似,不同之处在于地址重定位问题。在请求式分页存储管理的地址重定位时,可能会出现所需页面不在主存的情况,此时,系统必须解决以下两个问题:
(1)当程序要访问的某页不在内存时,如何发现这种缺页情况?发现后应如何处理? (2)当需要把外存上的某个页面调入内存时,此时内存中没有空闲块应怎么办?
怎样发现不在内存中虚页的问题可以用扩充页表的方法解决。增设缺页中断位和该页在外存的首址。缺页中断位:该位为“1”,表示此页已在内存;为“0”,表示该页不在内存。当此位为0时,会发出“缺页”中断信号,以求得系统的处理。
抖动现象:置换算法选择不当,有可能产生刚被调出内存的页又马上被调回内存,调回内存不久又马上被调出内存,如此反复的局面。这使得整个系统的页面调度非常频繁,以致大部分时间花费在主存和辅存之间的来回调入调出上的现象。
改变位:该位为“0”时,表示此页面在内存时数据未被修改过;为“1”时,表示被修改过。当此页面被选中
为淘汰对象时,根据此位的取值来确定是否要将该页的内容进行磁盘回写操作。 页号 页面号 中断位 外存首址 改变位 请求页式管理中的置换算法
置换算法在内存中没有空闲页面时被调用。它的目的是选出一个被淘汰的页面。
把内存和外存统一管理的真正目的是把那些被访问概率非常高的页存放在内存中。因此,置换算法应该置换那些被访问概率最低的页,将它们移出内存。
比较常用的置换算法有:随机淘汰算法(在系统设计人员无法确定哪些页被访问的概率较低时,随机地选择某个用户的页面并将其换出)、轮转法RR(轮转法循回换出内存可用去内一个可以被换出的页,无论该页是刚被换进或已换进内存很长时间)和先进先出法FIFO(选择内存驻留时间最长的一页将其淘汰)。最近最久未用页面淘汰算法(最近最久未用(LRU)页面淘汰算法的着眼点是在要进行页面淘汰时,检查这些淘汰对象的被访问时间,总是把最长时间未被访问过的页面淘汰出去。这是一种基于程序局部性原理的淘汰算法。也就是说,该算法认为如果一个页面刚被访问过,那么不久的将来被访问的可能性就大;否则被访问的可能性就小。)最近最少用页面淘汰算法(最近最少用(LFU)页面淘汰算法的着眼点是考虑内存块中页面的使用频率,它认为在一段时间里使用得最多的页面,将来用到的可能性就大。因此,当要进行页面淘汰时,总是把当前使用得最少的页面淘汰出去。要实现LFU页面淘汰算法,应该为每个内存中的页面设置一个计数器。对某个页面访问一次,它的计数器就加1。经过一个时间间隔,把所有计数器都清0。产生缺页中断时,比较每个页面计数器的值,把计数器取值最小的那个页面淘汰出去。)最优页面淘汰算法(如果已知一个作业的页面走向,那么要进行页面淘汰时,应该把以后不再使用的或在最长时间内不会用到的页面淘汰出去,这样所引起的缺页中断次数肯定最小,这就是所谓的“最优(OPT)页面淘汰算法”。遗憾的是,OPT的前提是要已知作业运行时的页面走向,这是根本不可能做到的,所以OPT页面淘汰算法没有实用价值,它只能用来做为一个标杆(或尺度),与别的淘汰算法进行比较。如果在相同页面走向的前提下,某个淘汰算法产生的缺页中断次数是否接近它。)
Belady现象:一般来说,对于任一作业或进程,如果给它的页面数越接近于它所要求的页面数,则发生缺页的次数会越小。但是,使用FIFO算法时,有时会出现分配的页面数增多,缺页次数反而增加的奇怪现象。这种现象称为Belady现象。 存储保护
页式管理可以为内存提供两种方式的保护。一种是地址越界保护,另一种是通过页表控制对内存信息的存取操作方式以提供保护。
地址越界保护可由地址变换机构中的控制寄存器的值——页表长度和所要访问的虚地址相比较来完成。 存取控制保护的实现则是在页表中增加相应的保护位即可。 ★页式管理的优缺点 优点
(1)由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题; (2)动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加。这既提高了主存的利用率,又有利于组织多道程序执行。 缺点
(1)要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。
(2)增加了系统开销,例如缺页中断处理。
(3)请求调页的算法如选择不当,有可能产生抖动现象。
(4)虽然消除了碎片,但每个作业和进程的最后一页总有一部分空间得不到利用。如果页面较大,则这一部分的损失仍然较大。 9.段式管理
段式存储管理的基本思想:把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟存储地址转化为内存中的实际地址。和页式管理一样,段式管理也采用只把那些经常访问的段驻留内存,而把那些在将来一段时间内不被访问的段放在外存,待需要时自动调入内存的方法实现二维虚拟存储器。 段式与页式的比较 段 式 页 式 分段由用户设计自己划分,每段对应的程序模块,有完整的逻辑意义 分页用户看不见,由操作系统为内存管理划分 段面是信息的逻辑单位 便于段的共享,执行时按需动态链接装入 段长不等,可动态装入,有利于新数据的增长 二维地址空间:段名、段中地址;段号、段内单元号 管理形式上象页式,但概念不同 段式管理的实现原理
段式管理把一个进程的虚地址空间设计成二维结构,即段号S与段内相对地址W。段号与段号之间无顺序关系,段的长度是不固定的。每个段定义一组逻辑上完整的程序或数据。例如,一个进程中的程序和数据可被划分为主程序段、子程序段、数据段与工作区段。每个段是一个首地址为零、连续的一维线性空间。 段式管理的内存分配与释放
段式管理中以段为单位分配内存,每段分配一个连续的内存区。由于各段长度不等,所以这些存储区的大小不一。而且,同一进程所包含的各段之间不要求连续。段式管理的内存分配和释放是动态进行的,与分区式管理一样可以采用最先适应法、最佳适应法、最坏适应法等进行空闲区分配。内存回收法也同分区式管理。当内存中没有足够的空闲区时,需要淘汰算法。 ★段式管理的地址变换
由于段式管理只存放部分信息副本在内存,而大部分信息在外存中,这必然引起CPU访问时发生所要访问的段不在内存现象。那么CPU如何感知到所要访问的段不在内存而启动中断处理程序呢?还有,段式虚拟地址属于一个二维的虚拟空间,怎样变换到一个一维线性物理地址呢?这些都由段式地址变换机构解决。 段式管理程序在进行初始内存分配之前,首先根据用户要求的内存大小为一个作业或进程建立一个段表,以实现动态地址变换和缺段中断处理及存储保护等。
段式管理的地址变换:一般在内存中给出一块固定的区域放置段表。当某进程开始执行时,管理程序首先把该进程的段表始地址放入段表地址寄存器中。通过访问段表寄存器,管理程序得到该进程的段表始地址从而可开始访问段表。然后,由虚拟地址中的段号s为索引,查段表。若该段在内存,则判断其存取控制方式是否有错。如果存取控制方式正确,则从段表相应表目中查出该段在内存的起始地址,并将其和段内相对应地址w相加,从而得到实际内存地址。若该段不存在,则产生缺段中断将CPU控制权交给内存分配程序。内存分配程序首先检查空闲区链,以找到足够长度的空闲区来装入所需的段。如果内存中的可用空闲区总数小于所要求的段长时,则检查段表中访问位,以淘汰那些访问概率低的段并将需要段调入。 段的共享与保护
段式存储管理可以方便地实现内存信息共享和进行有效地内存保护。这是因为段是按逻辑意义来划分的,可以按名访问的缘故。
段的共享:在多道环境下,常常有许多子程序和应用程序是被多个用户所使用的。特别是在多窗口系统、
页面是信息的物理单位 页一般不能共享 页面大小相同,位置不能动态增加 一维地址空间 往往需要多次缺页中断才能把所需的信息完整地调入内存

