动态分区分配算法&基本分页存储管理

前程似锦,未来可期

动态分区分配算法

  • 动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?

首次适应算法(First Fit)

  • 算法思想:每次都从低地址开始査找,找到第一个能满足大小的空闲分区。
  • 如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
    在这里插入图片描述

最佳适应算法(Best Fit)

  • 算法思想由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。
  • 如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序査找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
  • 缺点:每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片。

最坏适应算法(Worst Fit)

  • 又称最大适应算法( Largest Fit)
  • 算法思想为了解决最佳适应算法的问题一一即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
  • 如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
  • 缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。
    在这里插入图片描述

领近适应算法(Next Fit)

  • 算法思想:首次适应算法每次都从链头开始査找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配査找时,都要经过这些分区,因此也增加了査找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
  • 如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表).每次分配内存时从上次查找结束的位置开始査找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

在这里插入图片描述

  • 分析: 首次适应算法每次都要从头査找,每次都需要检索低地址的小分区。但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留下来(最佳适应算法的优点)
  • 邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使用,划分为小分区,最后导致无大分区可用(最大适应算法的缺点)
  • 这样导致反而首次适应算法效果更好

小结

在这里插入图片描述

基本分页存储管理

连续分配方式的缺点

  • 考虑支持多道程序的两种连续分配方式
    1、固定分区分配:缺乏灵活性,会产生大量的内部碎片,内存的利用率很低。
    2、动态分区分配:会产生很多外部碎片,虽然可以用“紧凑”技术来处理,但是“紧凑”的时间代价很高
    在这里插入图片描述

改进: 如果允许将一个进程分散地装入到许多不相邻的分区中,便可充分地利用内存,而无需再进行“紧凑”------------>基于这一思想,产生了“非连续分配方式”,或者称为“离散分配方式”

  • 连续分配:为用户进程分配的必须是一个连续的内存空间。
  • 非连续分配:为用户进程分配的可以是一些分散的内存空间。

内部碎片外部碎片

  • 动态分区分配没有内部碎片,但是有外部碎片。

  • 内部碎片:分配给某进程内存区域中,如果有些部分没有用上

  • 外部碎片:是指内存中的某些空闲分区由于太小而难以利用

在这里插入图片描述

分页存储管理的基本概念

  • 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”,或称“页帧”、“内存块”、“物理块”.每个页框有一个编号,即“页框号”(或者“内存块号”、“页帧号”、“物理块号”)页框号从0开始
  • 将用户进程的地址空间也分为与页框大小相等的一个个区域称为“”或“页面”.每个页面也有一个编号,即“页号”页号也是从0开始。(注:进程的最后一个页面卤能没有一个页框那么大。因此,页框不能太大,否则可能产生过大的内部碎片)
  • 操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中。
    在这里插入图片描述

实现地址的转换

  • 将进程地址空间分页之后,操作系统该如何实现逻辑地址物理地址的转换?

跳转链接
在这里插入图片描述

  • 动态重定位:进程在内存中连续存放,操作系统实现从逻辑地址到物理地址的转换

  • 思想:模块在内存中的起始地址(重定位寄存器)+目标内存单元相对于起始地址的偏移量

在这里插入图片描述

计算方法

人工计算方法:

  • 页号=逻辑地址/页面长度(取除法的整数部分)
  • 页内偏移量≡逻辑地址%页面长度(取除法的余数部分)
  • 页面在内存中的起始位置:操作系统需要用某种数据结构记录进程各个页面的起始位置。

Eg:
页号=80/50=1
页内偏移量=80%50=30
1号页在内存中存放的起始位置450

计算机计算方法

  • 后面12位表示页内偏移量
    在这里插入图片描述

知识交叉:

  • cache 块内地址总是2的整数幂

  • 全相联映射、组相联映射、直接映射

  • 子网划分的掩码

  • 重要结论:如果每个页面大小为2KB,用二进制数表示逻辑地址,则末尾K位即为页内偏移量,其余部分就是页号

逻辑地址结构

在这里插入图片描述

页表

  • 为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表

在这里插入图片描述

  • 为什么每个页表项的长度是相同的,页号是“隐含”的?
    在这里插入图片描述

小结

在这里插入图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值