考研408《操作系统》复习笔记,第三章《3.2.1 内存分配:连续分配》 📅 2026/6/24 5:39:56 本来是打算把整个内存分配两大块【连续分配】【离散分配】一起写完笔记但是发现【离散分配】复杂到离谱只能分开写了本章节是《连续分配》连续分配就是顾名思义【整个进程完整】地装入到【内存】不去分割进程一个进程在内存里是连续存放的1、单一连续分配【总结特点】简单解释只用记住【只能允许一个进程独占】内存直到运行完也就是【还没有操作系统诞生前的 单道程序环境】既然没有多个进程分割内存那就【没有外部碎片】2、固定分区分配【总结特点】简单解释操作系统诞生了要支持多个程序并发运行那内存肯定得允许存放多个进程于是便为内存划分了很多分区每个分区只给一个进程每个进程根据【分区说明表】来选择空闲分区装入【相等分区划分】是事先规划了一堆相同大小的分区就像提前做了相等份量的预制菜的饭店【不相等分区划分】是事先规划了一堆大小不一样的分区就像做了不同分量预制菜的饭店那么【固定分区】里不管是【相等分区划分】还是【不相等分区划分】都是在进程进入内存之前事先划分好的不是完美动态适配进程需求的空间都必然会导致【内部碎片】即【分区大小 进程实际所需大小】而浪费出空闲空间【例题】3、⭐动态分区分配又叫“可变区分配”⭐为了更好地解决固定分区存在的问题内部碎片人们又提出了动态分区分配存储管理技术基本思路如下分区不是预先划分地固定区域而是动态创建的即装入一个程序时系统根据它的需求和内存空间的使用情况决定是否分配。饭店根据客人来了亲口说的需求做饭而不是做预制菜了1简单解释规则一开始内存只有【空闲区】和【操作系统进程运行区】随后分别进入进程1、进程2、进程3都是进程来了才动态根据【进程要多大就给多大】分配因此【每一个进程运行的分区】都刚好存满一个进程【不存在内部碎片】而进程结束后会释放分区然而由于各个进程没有连续挨着因此【空闲区也不连续】而离散的空闲区大小都无法满足新进程所需大小时就会导致【外部碎片】2所依赖的数据结构注意区分【固定分区分配】的分区表数据结构记录的是【所有分区】的信息【动态分区分配】记录的只是【空闲分区】的信息。3动态分区算法1、首次适应算法详细画法重点是空闲分区【按 “地址” 升序排列】每次内存分配后对空闲分区表【无需排序】【缺点】每一次分配内存都要【从头遍历到尾】麻烦【优点】因为每次都要从头先遍历低地址就会让低地址小分区先分配给小进程留出高地址的大分区给大进程使用跟 “最佳适应算法” 优点一样2、邻近适应算法重点其实就是【循环执行首次适应算法】和【首次使应算法】相同部分依旧从低地址往高地址升序排列空闲分区每次从头往后遍历到合适的分区来分配每次内存分配后对空闲分区表【无需排序】和【首次使应算法】不同部分采用【循环链表结构】【循环遍历】【优点】每次遍历【不会从头开始】直接从【上一次遍历结束位置】继续遍历下去内存分配速度快【缺点】高低地址都有同等概率被新进程分割那么【大空闲区】有可能被多个小进程分割成【小空闲区】导致【小进程有小空间不用】、【大进程需要大空间却没有】3、最佳适应算法重点按【空闲区 “容量” 递增排列】因为要排序所以每次内存分配后都要对空闲分区表【重新排序】【优点】每次都先给小进程使用小分区以防小进程占用分割大分区从而留下大片大分区给大进程使用【缺点】小分区被分割只会分割留下更多超小的小分区而没法使用导致大量【外部碎片】4、最坏适应算法重点按【空闲区 “容量” 递减排列】因为要排序所以每次内存分配后都要对空闲分区表【重新排序】【优点】每次都先给所有进程使用大分区后续的小分区就不至于被分割成小到没法用起码能够一些小进程使用【缺点】大分区先被小进程分割的话就导致没有足够大分区分配给大进程了5、伙伴系统了解即可虽非考纲内容但24年出现真题考察原理就是只会认定【2的次幂】大小的空间作为【空闲分区】标准就是若进程大小为nKB先按【2^i-1 n 2^i】找到内存中2^i的空闲分区若找到了就把进程装入如果【2^i-1 n 2^i】在内存中找不到2^i的空闲分区那就接着再找 2^i1 的空闲分区如果找到了就把分区分成两半因为2^i1/2就是2^i啊前面已经证明了n 2^i说明分了一半的大小还是够装入进程1半装入进程、另1半单独另成一个链表【另外要记住】进程大小并不会完美适配2的次幂所以伙伴系统一定会有比进程大的分区就肯定是会有【内部碎片】6、【基于索引搜索的动态分区分配】刚刚学得【伙伴系统】就是一种那么另外两种好像根本就不是考纲内容但是王道选择题里出了我看了一会就烦了所以我觉得只要知道【基于索引搜索的动态分区分配】是哪三个就行了无需在意这三个的细节【总结特点】4、例题