操作系统-内存分配Ⅰ

操作系统的任务

在这里插入图片描述

地址空间

  • 物理地址空间
  • 逻辑地址空间(一维线性)

逻辑地址的生成

在这里插入图片描述

  1. 经过编译、汇编、链接,会得到一个.exe文件,这个文件地址从零开始
  2. 在运行时,需要把exe从硬盘加载到主存从,地址会增加特定的偏移量

整个这个过程,不需要操作系统的干预

转换到物理地址

在这里插入图片描述

  1. CPU拿到刚才的指令,里面有线性地址
  2. 在MMU中把线性地址转换为物理地址
    操作系统的任务就是提前建立好映射关系,快速地把线性地址转换为物理地址。

同时,操作系统还会保证程序只能访问一小段的内存空间,不能访问全部的内存空间(地址安全检测)
在这里插入图片描述

内存分配

内存碎片问题

外碎片

应用程序之间

内碎片

分配给应用程序,没法使用

内存分配时间

  1. 把程序从磁盘加载到主存
  2. 应用程序 运行时要访问数据,也需要操作系统分配

内存分配算法

首次适配(first fit)

在这里插入图片描述
回收时可能需要合并

优点

  1. 简单
  2. 容易产生更大空闲块

缺点
外碎片

最优适配(best fit)

分配最合适那一个
在这里插入图片描述
优点

  1. 小内存分配有效
  2. 简单

缺点

  1. 空间拆得细,外碎片
  2. 重分配慢
  3. 容易产生很多没用的微小碎片
最差分配(worst fit)

在这里插入图片描述
把大块变成小块,避免大量琐碎碎片

优点

  1. 中等尺寸效果最好

缺点

  1. 重分配慢
  2. 外碎片
  3. 破坏大碎块,以致大分区没法分区

这些算法,太简单,不能动态处理大大小大小小块

Compaction算法(压缩算法)(软件实现)

在这里插入图片描述
五个空闲块,放到一起

什么时候重定位??
不能正在运行时,得在程序停止时
有多大开销??
频繁这样做,开销挺大

swap(换入换出)

在这里插入图片描述
问题:
什么时候换??
选谁换??

需要优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统中常用的内存分配算法有首次适应算法、循环首次算法和最佳适应算法。下面是对这三种算法的介绍: 1. 首次适应算法(First Fit):该算法从内存的起始位置开始查找,找到第一个能够满足作业大小的空闲分区进行分配。这种算法简单且效率较高,但可能会导致内存碎片的产生。 2. 循环首次算法(Next Fit):该算法与首次适应算法类似,但是从上一次分配的位置开始查找,而不是从内存的起始位置开始。这种算法可以减少内存碎片的产生,但可能会导致分配不均匀。 3. 最佳适应算法(Best Fit):该算法从所有空闲分区中找到最小的能够满足作业大小的分区进行分配。这种算法可以最大程度地减少内存碎片的产生,但是需要遍历所有空闲分区,效率较低。 根据实验要求,我们可以通过输出“分配情况”来代替实际启动装入程序装入作业。具体操作如下: 1. 首次适应算法示例: ```shell # 初始状态 空闲区说明表:[0, 1000] 内存分配表:[] # 分配作业1(大小为200) 空闲区说明表:[200, 1000] 内存分配表:[作业1] # 分配作业2(大小为500) 空闲区说明表:[700, 1000] 内存分配表:[作业1, 作业2] # 分配作业3(大小为300) 空闲区说明表:[1000] 内存分配表:[作业1, 作业2, 作业3] ``` 2. 循环首次算法示例: ```shell # 初始状态 空闲区说明表:[0, 1000] 内存分配表:[] # 分配作业1(大小为200) 空闲区说明表:[200, 1000] 内存分配表:[作业1] # 分配作业2(大小为500) 空闲区说明表:[700, 1000] 内存分配表:[作业1, 作业2] # 分配作业3(大小为300) 空闲区说明表:[1000] 内存分配表:[作业1, 作业2, 作业3] ``` 3. 最佳适应算法示例: ```shell # 初始状态 空闲区说明表:[0, 1000] 内存分配表:[] # 分配作业1(大小为200) 空闲区说明表:[200, 1000] 内存分配表:[作业1] # 分配作业2(大小为500) 空闲区说明表:[700, 1000] 内存分配表:[作业1, 作业2] # 分配作业3(大小为300) 空闲区说明表:[700, 1000] 内存分配表:[作业1, 作业2, 作业3] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值