一、单一连续分配方式
这种分配方式下,内存被分成系统区和用户区。内存中只能有一道用户程序,用户程序独占
整个用户空间
优点:实现简单,没有外部碎片(因为每次就给一个程序分配空间,当他运行完成,把空间释放,又还是一个完整的没有被分配的空间)。不一定需要内存保护(因为只有一个程序,不存在有其他程序越界访问的情况)
外部碎片:指的是内存剩下一些没有被分配的空间太小,有非常多的小的内存块
缺点:只能用于单用户有内部碎片,存储空间的利用率很低(因为每次就一个程序在里面运行,会导致分配给他的空间有很多一部分他根本就用不上,因此会导致大量的内部碎片)
内部碎片:指的是分配给了某一个程序的空间,有一些空间块用不上,这样分区内部就存在空间浪费的现象
二、固定分区分配
为了能让多个程序运行,并且让他们在运行的时候不会相互干扰,所以把用户空间分成多个固定大小的分区,每一个分区只存入一个作业。
1、分区大小相等(缺乏灵活性,适用于计算机控制很多相同的对象)
2、分区大小不相等
为了记录这些分区的分配状况,操作系统会建立一个分区说明表。
优点:实现简单,没有外部碎片(总会有一个分区可以放得下,所以不存在有很多很小的没有被分配的外部碎片)
缺点:当用户程序太大的时候,会降低性能,并且会产生内部碎片(如果剩下一个较大的空间而分配给了一个小的进程,就会导致内部碎片)
三、动态分区分配
会根据进程的大小来进行动态的分区分配,不预先划分内存分区,只是在进程装入内存的时候再建立分区
用什么数据结构记录内存使用情况?
1、空闲分区表(只记录空闲区)
2、空闲分区链
当有很多分区都能满足需求的时候选择哪块进行分配?
1、first fit
空闲分区是按照地址递增的顺序排列,分配内存的时候顺序查找,找到第一个能满足需求的空闲块就分配
2、best fit
空闲分区按照容量递增的当时,分配内存的时候顺序查找,找到第一个能满足需求的空闲块就分配
3、worst fit
空闲分区按照容量递减的方式,分配内存的时候顺序查找,找到第一个能满足需求的空闲块就分配。每次都会找一个最大的分区进行分配。
4、Next fit
循环首次使用算法,每次分配都会在上一个分配的地方开始往后面找到满足需求的空间块
如何进行分区的分配和回收?
分配:
当使用一定的分配算法以后找到了可以满足需求的内存块时
判断需求大小与分区大小
需求<分区
,空闲表空闲数目不变;
需求=分区
,空闲表数目减一;
回收:
情况一:回收区后面有一个空闲分区
合并,更改分区大小和起始地址,不会导致空闲分区数量变化
———————————————————————————
情况二:回收区前面有一个空闲分区
合并,更改分区大小和起始地址,不会导致空闲分区数量变化
———————————————————————————
情况三:回收区上下都有空闲分区
合并,更改分区大小和起始地址,会导致空闲分区数量-1
———————————————————————————
情况四:回收区上下都没有空闲分区
更新空闲分配表,空闲区数量+1