连续与非连续内存分配1

连续内存分配

简单内存管理

  • 内存碎片:不能被利用的空间内存
    • 外部碎片:在分配单元间的未使用内存
    • 内部碎片:在分配单元中的未使用内存,已经分配,无法使用
  • 分区的动态分配
  • 简单内存管理:给需要运行的程序分配一个连续的内存区间
    • 算法:
      • 首次适配:
        • 基本原理:简单
        • 实现: 寻找第一个适合的空闲块进行分配
        • 需求:
          1. 按地址排序的空闲块链表
          2. 分配需要寻找一个合适的分区
          3. 重分配需要检查,看是否自由分区能合并于相邻的空闲分区(若有)
        • 优势:简单 易于产生大的空闲块,向着地址空间的结尾
        • 劣势:外部碎片 不确定性
      • 最优适配:
        • 基本原理: 寻找最适合满足分配请求的空闲块进行分配
          为了避免分割大的空闲块
          为了最小化外部碎片产生的尺寸
        • 需求:
          1. 按尺寸排列的空闲块链表
          2. 分配需要寻找一个合适的分区
          3. 重分配需要搜索及合并于相邻的空闲分区(若有)
        • 优势: 当大部分分配是小尺寸时非常有效 比较简单
        • 劣势: 外部碎片 重分配慢 易产生很多没用的微小碎片(不怎么好)
      • 最差适配(找到一个与内存分配请求的大小差距最大的空闲块)
        • 原理:为了避免太多的微笑块
        • 需求:
          1. 按尺寸排列的空闲块链表
          2. 分配很快(获得最大分区)
          3. 重分配
        • 优势:分配是中等尺寸效果最好
        • 劣势:重分配慢 外部碎片 易于破碎大的空闲块以至于大分区无法被分配

没有最好的算法 各有利弊

压缩式(紧致)和交换式内存管理

  • 压缩式:将内存中运行的程序位置挪动,为后面的程序腾出大的空闲空间
    • 需要考虑的问题:
      什么时候进行挪动? 程序在等待中挪动,不能在运行时挪动
      +拷贝开销大 如果频繁操作)
  • 交换:将硬盘当做备份,将等待的程序挪动到硬盘,腾出空间
    • 问题: 选择哪一个换出,什么时候
      交换力度:单个程序 如果程序较大 则开销大

非连续内存分配

为什么要用非连续?

  • 连续缺点:
    • 分配给一个程序的物理内存是连续的
    • 内存利用率低
    • 有内存碎片
      通过非连续改善这些问题
  • 非连续好处:
    • 更好的内存利用和管理
    • 共享代码与数据
    • 支持动态加载和动态链接
  • 非连续缺点 : 在于管理开销本身

建立虚拟地址和物理地址转换

  • 软件方面 :开销大
  • 硬件方面:
    • 分段

      • 程序的分段地址空间
        代码角度:各个断 主程序 子程序 共享库
        数据角度:栈段 堆段
        段表硬件实现 操作系统进行初始化
        在这里插入图片描述
    • 分页

      • 帧 物理内存被分割成大小相等的帧
      • 页 程序的逻辑地址空间被划分为大小相等的页
      • 在这里插入图片描述
    • 分段与分页的区别:段大小可变,页大小不可变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值