连续分配:意味着为用户进程分配的必须是一个连续的内存空间。
一、单一连续分配
在单一连续分配方式中,内存被分为系统区和用户区,系统区通常位于内存的地址部分,用于存放系统相关数据;用户区用于存放用户进程相关数据。
内存中只能有一道用户程序,用户程序独占整个用户区空间。
优点:实现简单,无外部碎片
缺点:只能用于单用户,单任务的操作系统;有内部碎片;存储器利用率极其低
内存碎片:指分配给某进程的内存区域中,如果有些部分没有用上,就是“内部碎片”
二、固定分区分配
20世纪60年代出现了支持多道程序的系统,为了能在内存中装入多道程序,并且这些程序之间不会互相干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区只装入一道作业,这样就形成看最早、最简单的一种可运行多道程序的内存管理方式。
固定分区分配分为:分区大小相等和分区大小不等两种
分区大小相等:缺乏灵活性,但适合用于一台计算机控制多个相同对象的场合
分区带下不等:增加了灵活性,可以满足不同大小的进程需求,根据常在系统中运行的作业大小情况进行划分(比如:划分多个小分区、适量中等分区、少量大分区)
分区说明表:
优点:实现简单,无外部碎片
缺点:当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能;
会产生内部碎片,内存利用率低
三、动态分区分配
动态分区分配又称可变分区分配。它不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态建立分区,并使分区的大小正好适合进程的需要,因此系统分区的大小和数目是可变的。
三个问题:
1、系统要用什么样的数据结构来记录内存的使用情况?
系统使用空闲分区表或空闲分区链的数据结构来记录内存的使用情况。
空闲分区表:每个空闲分区对应一个表项。表项中包含分区号、分区大小、分区起始地址等信息
空闲分区链:每个分区的起始部分和末尾部分分别设置前向指针和后向指针。起始部分处还可记录分区大小等信息
2、当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?
当很多个进程都能满足需求时,系统会根据动态分区分配算法来选择分区进行分配
3、如何进行分区的分配与回收操作?
分区进行分配时,如果被分配的分区空间大于进程使用空间,就修改空闲分区表中分区的大小,将越来的大小减去被使用的大小。如果被分配的分区空间等于进程使用空间,就从表中删除这个表项。
分区进行回收时,如果回收的分区,相邻的前后有相邻的空闲分区,就将它们进行合并,相应的修改分区表中的大小和起始地址。如果前后没有空闲分区,就需要在分区表中添加一个新的表项,填写相关信息。
- 外部碎片:内存中存在某些空闲区间由于太小而难以利用
- 内部碎片:分配给某进程的内存区域中,如果有些部分没有用上的区域
- 可以用紧凑技术来解决外部碎片问题
两个思考:
1、回忆交换技术,什么是换入/换出?什么是中级调度(内存调度)?
2、思考动态分区分配应使用哪种装入方式?“紧凑”之后需要做什么处理?
红框内,常考选择题。