操作系统:内存管理(连续内存分配管理)

连续内存分配管理方式有以下三种:
1.单一连续分配
2. 固定分区分配
3. 动态分区分配

这三种都属于连续内存分配管理方式,即要求进程必须装入内存中一片连续的物理地址空间。它们各有特点:
1.单一连续分配 (Single Contiguous Allocation)
在这里插入图片描述

  • 原理: 这是最简单的内存管理方式。整个用户内存空间在任何时刻只允许一个用户进程使用。通常将内存划分为两部分:
  • 系统区: 供操作系统使用(通常位于低地址部分)。
  • 用户区: 剩余的全部内存空间,一次只装入一个用户进程。
  • 特点:
  • 实现极其简单: 不需要复杂的内存管理数据结构。
  • 开销极小: 几乎没有管理开销。
  • 内存利用率极低: 如果进程很小,用户区大部分空间被浪费(称为内部碎片)。如果进程很大,可能无法装入。
  • 不支持多道程序设计: 一次只能运行一个用户进程。
  • 缺乏存储保护: 进程可以访问整个用户区,甚至可能破坏操作系统(通常通过硬件界限寄存器提供基本保护)。
  • 适用场景: 主要用于早期的单用户、单任务操作系统(如 MS-DOS)或简单的嵌入式系统/微控制器。
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2d6f93dae8744f35bb9cae68d27ea87d.png

2.固定分区分配 (Fixed Partitioning / Static Partitioning)
在这里插入图片描述
在这里插入图片描述

  • 原理: 在系统启动时,将用户内存空间预先静态地划分成若干个大小固定(但可以不同)的分区。每个分区在任何时刻只能容纳一个进程。
  • 特点:
  • 支持多道程序设计: 多个分区可以同时容纳多个进程(只要分区数大于1)。
  • 实现相对简单: 管理数据结构通常是一个分区说明表,记录每个分区的起始地址、大小和状态(已分配/空闲)。
  • 存在内部碎片: 如果一个进程小于它所在的分区,分区中剩余的空间就被浪费了。分区越大,内部碎片可能越大。分区越小,能容纳的进程数越多,但大进程可能无法装入任何分区(称为外部碎片的一种特殊形式,但通常特指动态分区中的问题)。
  • 灵活性差: 分区大小和数量在系统启动时就固定了,无法根据进程的实际大小动态调整。
  • 可能限制进程大小: 进程大小不能超过最大的分区。
  • 分配策略:
  • 等长分区: 所有分区大小相同。实现最简单,但内部碎片可能更严重,且无法运行大进程。
  • 不等长分区: 分区大小不同。可以减少大进程无法装入的问题,但需要更复杂的策略决定进程放入哪个分区(如:按进程大小选择最小但足够的分区,以减少内部碎片)。
  • 适用场景: 早期的批处理多道程序系统。

3.动态分区分配 (Dynamic Partitioning / Variable Partitioning)
在这里插入图片描述

  • 原理: 在系统运行过程中,根据进程的实际大小动态地划分内存空间。初始时,整个用户区是一个大的空闲分区。当进程需要装入时,系统从空闲分区中划分出一块刚好满足进程需求的空间分配给它。进程退出时,释放其占用的分区,该分区会与相邻的空闲分区(如果有)合并,形成更大的空闲分区。
  • 特点:
  • 内存利用率高: 没有内部碎片(分配的空间大小正好等于进程需求)。
  • 支持多道程序设计。
  • 灵活性高: 分区大小和数量是动态变化的,能更好地适应进程大小。
  • 存在外部碎片: 随着进程的不断装入和撤出,内存中会散布着许多不连续的、较小的空闲分区。虽然每个分区的总和可能很大,但没有一个足够大的连续空闲分区来满足某个进程的需求。这是动态分区的主要缺点。
  • 实现较复杂: 需要维护空闲分区表或空闲分区链来记录所有空闲分区的位置和大小。分配和回收时需要搜索空闲分区、进行分区划分和合并。
  • 分配算法影响性能: 如何从多个空闲分区中选择一个进行分配,对碎片产生和分配速度有重要影响。
  • 常用的分配算法(用于选择哪个空闲分区进行分配):
  • 首次适应 (First-Fit): 从空闲分区链/表的头部开始顺序查找,选择第一个满足大小的空闲分区。简单快速,倾向于保留高地址的大分区,但低地址容易产生小碎片。
  • 最佳适应 (Best-Fit): 扫描整个空闲分区链/表,选择满足需求且大小最接近的空闲分区(即最小的足够分区)。试图最小化碎片,但可能留下大量难以利用的微小碎片(外部碎片恶化)。
  • 最坏适应 (Worst-Fit): 扫描整个空闲分区链/表,选择最大的空闲分区进行分配。试图避免产生微小的碎片,但可能很快耗尽大分区,不利于后续大进程的装入。
  • 邻近适应 / 下次适应 (Next-Fit): 类似首次适应,但每次查找不是从头开始,而是从上一次查找结束的位置开始。性能通常介于首次适应和最佳适应之间。
    在这里插入图片描述

已使用的内存如何回收:
在这里插入图片描述

  • 解决外部碎片的方法:
  • 紧凑 (Compaction): 操作系统在适当时机移动已装入的进程,使它们连续存放,从而将所有空闲分区合并成一个大的连续空间。代价高(需要重定位进程,暂停所有进程执行)。
  • 允许非连续分配: 引入更复杂的内存管理方案,如分页、分段,从根本上避免连续分配的要求。
  • 适用场景: 现代通用操作系统(如 Windows, Linux, macOS)在采用分页机制之前,其核心内存管理逻辑在某种程度上借鉴了动态分区的思想(尽管物理内存本身通过分页实现了非连续映射)。
    总结对比:
    在这里插入图片描述
    另欢迎关注公众号【比特层递】,一起交流进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值