为了能将用户程序装入内存,必须为它分配一定大小的内存空间。连续分配存储管理方式是最早出现的一种存储器分配方式。
该分配方式为一个用户程序分配一个连续的内存空间,即程序中代码或数据的逻辑地址相邻,体现在内存分配时物理地址的相邻。
连续分配方式可分为四类:
- 单一连续分配固定分区分配动态分区分配动态可重定位分区分配
单道程序环境下,当时的存储器管理方式是把内存分为系统区和用户区两部分。
系统区仅提供给OS使用,通常是放在内存的低址部分。而在用户区内存中,仅装有一道用户程序,即整个内存的用户空间由该程序独占。这样的存储器分配方式被称为单一连续分配方式。
2. 固定分区分配将整个用户空间划分为若干个固定大小的区域,在每个分区中仅装入一道作业,这样就形成了最早的、也是最简单的一种可运行多道程序的分区存储管理方式。
2.1 划分分区的方式
分区大小相等(指所有存储分区大小相等)
特点:若程序太小,浪费内存空间;若程序太大,一个分区又装不下,导致程序无法运行。
分区大小不等(指将存储器分区划分为若干个大小不等的分区)
2.2 存储分配为了便于内存分配,通常将分区按其大小进行排队,并为之建立一张分区使用表,表中各项包括每个分区的起始地址、大小以及状态(是否已分配)
3. 动态分区分配又称可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法、分区的分配与回收操作。
3.1 数据结构为了实现动态分区分配,系统中必须配置相应的数据结构,用以描述空闲分区和已分配分区的情况,为分配提供依据。
常见的数据结构有两种形式:
空闲分区表
在系统中设置一张空闲分区表,用于记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区号、分区大小和分区始址等数据项
空闲分区链
为了实现对空闲分区的分配和链接,在每个分区的初始部分设置一些用于控制分区分配的信息,以及用于链接各分区所用的向前指针,在分区尾部则设置一后向指针
3.2 基于顺序搜索的动态分区分配算法为把一个新作业装入内存,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。
为了实现动态分区分配,通常是将系统中的空闲分区链路成一个链。
所谓顺序搜索,是指依次搜索空闲分区链上的空闲分区,去寻找一个其大小能满足要求的分区。
首次适应算法(first fit,FF)
原理:
该算法要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区中划出一块内存空间,分配给请求者。
特点:
倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区。为大作业分配大的内存空间提供了条件,但是低址部分不断被划分,会留下很多难以利用的、很小的空闲分区,称为“碎片”。
循环首次适应算法(next fit,NF)原理:
在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区。为实现该算法,应设置一起始查询指针,用于指示下一次起始查寻的空闲分区,并采用循环查找方式。
特点:
能使内存中国的空闲分区分布得更加均匀,从而减少查找空闲分区时的开销,但这样会缺乏大的空闲分区。
最佳适应算法(best fit,BF)原理:
每次为作业分配内存时,总是能把满足要求、又是最小的空闲分区分配给作业。该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链,这样,第一次找到的必然是最佳的。
特点:
每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的碎片。
最坏适应算法(worst fit,WF)原理:
在扫描整个空闲分区表和链表时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用,以至于存储器中缺乏大的空闲分区。该算法要求将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链
特点:
可使剩下的空闲区不至于太小,产生碎片的可能性最小,对中、小作业有利。同时,查找效率很高
3.3 分区分配操作在动态分区分配管理方式中,主要的操作是:
分配内存
回收内存
4. 动态可重定位分区分配紧凑
连续分配方式的一个重要特点是,一个系统或用户程序必须被装入一片连续的内存空间中。当一台计算机运行了一段时间后,它的内存空间将会被分割成许多小的的分区。这种不能利用的小分区即是“碎片”,或称为“零头”。
若想把大作业装入这些分散的小分区,可采用的一种方法是:将内存中的所有作业进行移动,使它们全部都相邻接。这样,即可把原来分散的多个空闲小分区拼接成一个大分区,可将一个作业装入该区。
这种通过移动内存中作业的位置,把原来多个分散的小分区拼接成一个大分区的方法,称为“拼接”或“紧凑”。
动态重定位
在动态运行时装入的方式中,作业装入内存后的所有地址仍然是相对(逻辑)地址。而将相对地址转换为绝对(物理)地址的工作被推迟到程序指令要真正执行时进行。
为了使地址的转换不会影响到指令的执行速度,须在系统中增设一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。
程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。
地址变换过程是在程序执行期间,随着对每条指令或数据的访问自动进行的,故称为“动态重定位”。
参考:《计算机操作系统》(第四版,汤小凤)
看教材枯燥,码字记录提神,根据计算机操作系统(第四版,汤小凤)个人整理,仅作学习记录 :)



