[OS复习]存储管理2

来源:互联网 发布:中秋节祝福网页源码 编辑:程序博客网 时间:2024/05/17 03:20
内存划分与分配技术

1.内存划分

静态划分:划分预先进行,创建新进程时,在内存中找到一个合适的分区分配给它。
动态划分:系统初始化时,可以将整个内存的用户区看作一个分区。创建新进程时,根据进程申请的空间大小,在这个分区中动态地为之划分一部分空间。

2.静态划分

必须事先进行,一旦划分完毕,分区的大小和数目将不再改变。可以划分:大小相同/不同的分区,如固定分区和分页

2.1固定分区:

根据系统管理员的经验和一些统计规律,事先将内存空间划分为若干个固定大小的分区,称为分区(Partitioning)。当进程申请存储空间时,系统为之分配一个大小合适的空闲分区。
分页:特殊的静态分区,需要事先将内存空间划分为若干个大小相同的分区,称为页框,或帧(frame)(固定分区大小一般要大于分页)。当进程申请存储空间时,系统可以为之分配多个空闲页框
固定分区:等长原则
所有分区的长度相同。优点:分配简单,只要进程大小不超过分区大小,就可以装到任何一个分区中运行。缺点:浪费存储空间。若进程申请的存储空间很小,却需要占用整个分区,分区内存在不可用的浪费空间,称为内零头(internal fragmentation);无法运行超过分区大小的程序;无法精确确定分区的大小(依赖经验)。
固定分区:异长原则

将内存空间划分为若干个长度不同的分区,以适合于不同大小的进程需要。优点:既提高存储空间的利用率、减少浪费,又使长进程能装入运行。缺点:确定每个分区的大小也是一件十分困难的事情。 
固定分区管理简单,只需要建立一张分区使用表,登记分区的使用情况(等长分区只需要标明分区状态是已分配,还是空闲)

首先,检索分区使用表,从中找出一个尚未分配的、能满足大小且内零头最小的分区。若分区使用表中的分区按从小到大的顺序排列,则分配时,从表中的第一个表项开始查找,找到的第一个尚未分配并满足大小的分区即是最佳的分区。将分区使用表中该分区的状态修改为已分配。若找不到大小足够的分区,则系统将拒绝运行该进程,或采用其它技术进行处理,如覆盖技术等。
固定分配缺点:固定分区存在内零头,浪费存储空间:异长分区较等长分区可以一定程度上提高系统的性能,但并不能彻底解决问题。

2.2 分页式划分(Paging)

为了提高内存资源的利用率,可以考虑将分区长度缩小,减少内零头浪费的空间。
但是,这样做必须有一个前提,即进程可以分配若干不连续的存储空间。否则,小分区可能使更多的进程无法装入内存。分页划分:系统预先将内存空间划分为若干较小的、固定大小的页框

页框较小,有效地减少了内零头的浪费;每个进程平均浪费0.5页框大小。页框大小固定,简化了存储分配。需要记录内存页框的分配和使用情况:位示图、空闲页框表或空闲页框链表等。
分页式划分:数据结构
位示图是一个由0、1构成的向量,其中每一位(bit)表示一个页框的使用状态。一般规定,0表示页框空闲,1表示页框已被分配。假定存储空间被划分为n个页框,所有页框依次编号为0,1,2,…,n-1,则记录所有页框的使用状态的位示图形如:000001110111111111110001111…0011111
空闲页框表:以表格形式记载内存页框的使用情况。显然,为每一个空闲页框设置一个表项是不合理的,这将导致页框表太大。可以为一组连续的空闲页框设置一个表项,其中主要包括:首页框号和页框个数,如表所示:


位示图和空闲页框表都需要占用专门的存储空间。。。
空闲页框链表是将内存中所有的空闲页框通过其内的链接指针连成一个链表,系统只需要记录链表头的位置。为进程分配存储空间时,从链表头开始取所需的页框,同时更新链表头。回收进程释放的存储空间时,将新产生的空闲页框链接到空闲页框链表中。 

3.动态划分与分配技术

静态划分未考虑进程的实际需要。无论是固定分区,还是分页,都存在不同程度的内零头。
动态划分:根据进程的实际需要,动态地划分内存空间,并分配给进程,彻底解决了内零头问题(并不意味完全没有内零头)
系统初始化时,内存用户区就是一个大分区。随着进程的创建和撤消,内存被动态划分成若干较小的分区。
:有一个128MB的内存,其中操作系统自身占用8MB,剩下的120MB空间供用户进程使用。依次装入进程P1、P2、P3、P4、P5、P6,剩下一个10MB的空闲分区。一段时间之后,进程P1、P3、P5执行结束,释放出3个空闲分区。内存中共有4个空闲分区:

利用相应的数据结构记载空闲分区表,例如:

采用动态划分技术,为进程分配存储空间的过程较复杂。当系统中有多个满足进程大小的空闲分区时,如何为进程选择一个分区合适的分区呢?目前几种较典型的分区分配方案:

3.1首次适应算法 (FFA:First Fit Algorithm)

基本思想:总是从内存的某一端(一般从低地址端)开始查找,选择一个超过进程申请大小的空闲分区。为此,可以将空闲分区表中登记的空闲分区按照其起始地址由小到大的次序依次排列。系统查找空闲分区时,从表头开始查找,取第一个满足要求的分区分配给进程。若找到的空闲分区恰好与进程申请的存储空间大小相等,或分配给该进程以后,仅剩下一个非常小的空间(小于系统设置的阈值),则将该分区全部分配给申请进程。否则,系统将该分区划分为两个分区,一个分区的长度等于进程申请的空间大小,并将其分配给申请进程。然后,将另一个子分区链接到空闲分区链表中
优点:尽量使用低地址空间,因而在高地址的空间可能会保留较大的空闲分区。所以,大进程申请的存储空间大都能在高地址端得到满足。
缺点:由于每次只简单地使用找到的第一个分区,结果可能导致将较大的空闲分区不断地分割为较小的空闲分区。
3.2 外零头
动态划分技术解决了静态划分技术的内零头。可能产生很多较小的分区:外零头(External Fragment)。紧凑(Compaction):把内存中的所有空闲分区拼接成一个较大的空闲分区。即把内存中的所有进程移到内存的某一端;所有空闲分区移到另一端
,将如图所示的内存空间进行紧凑以后的效果(Windows中的磁盘碎片管理功能):

3.3下次适应算法 (NFA: Next-Fit Algorithm) 

首次适应算法每次都从低地址端开始查找空闲分区,总是频繁使用内存的某一端,某些大进程申请的大分区需要很长时间才能在内存的另一端找到。能否均衡使用整个内存空间,加快大分区的查找速度呢?下次适应算法能记住上次分配分区的位置,下一次实施分配时,从上一次的分配位置之后开始查找,选择一个大小足够的空闲分区。
该算法常常会导致内存中缺乏大分区,因为它会均衡地利用空闲分区,包括分割较大的空闲分区。从而使得大进程无法装入内存运行。下次适应算法可能会导致大量的外零头,需要较频繁地实施紧凑操作。

3.4最佳适应算法 (BFA:Best Fit Algorithm) 

总是选择满足申请要求且长度最小的空闲分区。为了提高查找效率,可以将所有的空闲分区按照长度由小大到的次序依次排列在空闲分区表中。为进程分配存储空间时,从表头开始查找,第一个满足进程申请存储空间大小的分区就是最适合的分区。 
优点:尽量不分割大的空闲分区
缺点:可能会形成大量较小的、难以再分配的分区 —— 大量的外零头。
最佳适应算法并非是最好的算法。

3.5最差适应算法 (WFA:Worst Fit Algorithm)

选择满足申请要求且长度最大的空闲分区,使分割出来的剩余空闲分区较大。为了提高系统效率,可将系统中所有的空闲分区按照长度由大到小的次序依次排列在空闲分区表中。为进程分配存储空间时,从表头开始查找,选择第一个满足进程需要的分区。如果第一个空闲分区小于进程申请空间的大小,则不能立即为进程分配存储空间。
优点:可以避免形成大量较小外零头,
缺点:总是分割大的空闲分区。当遇到大进程申请大空间时,无法找到一个足够大的空闲分区。换句话说,在大进程面前,内存中所谓的较大空闲分区也是外零头了。

3.6例题

当系统进行到如图所示的情形时,若有一个进程P7申请大小为16MB的存储空间。分别采用上述4种算法进行分配,如图所示,分析结果。


4.伙伴系统Buddy System

静态划分方案限制了系统中活跃进的数目。并且,只能运行不超过分区大小的进程,如果进程远远小于分区大小,则内存空间的利用率非常低。动态划分方案使存储管理复杂化,并且需要系统付出紧凑外零头的额外开销。
伙伴系统综合了静态划分技术和动态划分技术的优点。
具体的使用方法过程:
伙伴系统内存的用户可用空间为2^n 。系统总是为进程分配大小为2^i的一个空闲分区。其中m≤i≤U,2^m是系统允许的最小分区尺寸。如果进程申请的存储空间大小为k,且2^i-1 <k ≤ 2^i,则将整个2i大小的分区分配给它。否则,该分区被分割成大小相等( 2^i-1 )的两个分区。再判断k是否满足条件:2^i-2<k≤2^i-1,若满足条件,则将两个伙伴中的任何一个分配给进程;否则,将其中一个伙伴又平均分成两个分区。此过程一直继续进行,直到产生的分区大于或等于k,将其分配进程。 

4.1伙伴系统的存储分配

进程申请大小为k的空间,系统为之分配一个2^i的空闲分区,其中,2^i-1 <k ≤ 2^i,若k > 2^n,即进程 > 内存空间,失败;若当前无尺寸为2^i的空闲分区,则:
(1) 将i变为i+1,查找一个尺寸为2^i+1的空闲分区。若存在,转(2)执行;否则,继续执行(1);
(2) 等分2^i+1空闲分区:产生两个2^i的伙伴分区;
(3) 把其中一个2i的伙伴分区作为空闲分区;
(4)  另一个2i 空闲分区分配给进程,结束。

4.2伙伴系统存储空间的回收 

当进程执行完毕,释放一个尺寸为2^i的分区时,系统用算法回收该分区:如果被回收分区的伙伴分区非空闲,那么保留该分区为一个独立的空闲分区,否则
[1]  合并回收分区及其伙伴分区,从而得到一个尺寸为2^i+1的空闲分区;
[2]  系统再次调用本算法回收上一步得到的尺寸为2^i+1 的空闲分区。 

4.3 例题

有进程P1、P2、P3、P4、P5相继申请、释放空间。系统分配、回收(合并)伙伴分区的过程如图所示:













0 0
原创粉丝点击