第二十四课:连续内存分配


一、什么是连续内存分配?

先理解名字。

连续:

表示:

一个程序:

必须:

占用一整块连续的内存空间。

例如:

程序A:

需要:

100MB。

那么:

分配:

----------------
程序A 100MB
----------------

必须:

连续。

不能:

拆成:

50MB + 50MB。


早期操作系统:

主要采用:

连续分配。


二、最简单方式:单一连续分配

这是:

最早的方法。

思想:

非常简单:

内存只分给一个用户程序。

结构:

高地址

-------------
用户程序

-------------

操作系统

-------------
低地址

例如:

电脑:

内存:

8GB。

系统:

占:

1GB。

剩下:

7GB:

全部:

给当前程序。


优点

简单。

容易实现。


缺点

最大问题:

浪费。

例如:

一个程序:

只需要:

1GB。

但是:

系统给它:

7GB。

剩下:

6GB:

没人用。


所以:

这种方式:

现在基本不用。


三、固定分区分配

为了:

提高利用率。

操作系统:

把内存:

提前:

划分:

几个固定区域。

例如:

内存:

100MB。

分成:

----------------
系统 20MB

----------------
分区1 20MB

----------------
分区2 30MB

----------------
分区3 30MB

每个程序:

进入:

一个分区。


例如:

程序A:

需要:

15MB。

进入:

20MB分区。


程序B:

需要:

25MB。

进入:

30MB分区。


四、固定分区的问题

最大问题:

内部碎片。


例子:

分区:

大小:

100MB。

程序:

需要:

70MB。

系统:

给:

100MB。

那么:

剩余:

30MB。

但是:

这个30MB:

别人:

不能使用。

为什么?

因为:

分区已经:

属于:

这个程序。


这就是:

内部碎片。


五、动态分区分配(重点)

固定分区:

太死板。

于是:

出现:

动态分区。

思想:

程序需要多少,就分多少。


例如:

内存:

----------------
系统

----------------
空闲100MB

----------------
程序A 50MB

----------------
空闲200MB

来了:

程序B:

需要:

80MB。

系统:

找:

100MB空闲区。

分:

80MB。

变成:

----------------
程序B 80MB

----------------
剩余20MB

优点:

减少内部碎片。


但是:

产生:

新的问题。


六、外部碎片出现

假设:

内存:

如下:

程序A

空闲10MB

程序B

空闲20MB

程序C

空闲30MB

总空闲:

60MB。


现在:

来了:

程序D。

需要:

50MB。

能放吗?

不能。

为什么?

虽然:

总共有:

60MB。

但是:

没有:

连续50MB。


这就是:

外部碎片。


七、动态分区如何选择空间?

重点来了。

假设:

有多个空闲区域。

程序来了。

选择哪个?

操作系统:

有几种算法。


1. 首次适应算法(First Fit)★★★★★

英文:

First Fit。

思想:

从低地址开始找,第一个满足的空闲区。


例如:

空闲:

100MB

50MB

200MB

程序:

需要:

40MB。

从头找:

第一个:

100MB。

够。

于是:

放进去。


结果:

简单。

速度快。


缺点:

低地址:

容易:

产生很多小碎片。


口诀:

首次适应:第一个能放就放。


2. 最佳适应算法(Best Fit)★★★★★

思想:

找最小但够用的空闲区。


例如:

空闲:

100MB

50MB

200MB

程序:

需要:

40MB。

比较:

100:

剩60。

50:

剩10。

200:

剩160。

选择:

50MB。


优点:

减少大空间浪费。


缺点:

容易产生大量小碎片。

因为:

总是切小空间。


口诀:

最佳适应:留下最小剩余。

3. 最坏适应算法(Worst Fit)

思想:

总是选择最大的空闲区。


例如:

空闲:

100MB

50MB

200MB

程序:

需要:

40MB。

选择:

200MB。

剩:

160MB。


优点:

剩余空间较大。


缺点:

大空间容易被消耗。


口诀:

最坏适应:拿大块,留大块。


八、三个算法比较(★★★★★)

算法 选择方式 特点
首次适应 第一个满足 速度快
最佳适应 最小满足 碎片多
最坏适应 最大空间 浪费大空间

九、考试计算题怎么做?

典型题:

空闲区:

100KB
500KB
200KB
300KB
600KB

进程:

P1=212KB
P2=417KB
P3=112KB
P4=426KB

问:

使用首次适应:

如何分配?


步骤:

第一步

P1:

212KB。

从头找:

100:

不够。

500:

够。

分配。


第二步

P2:

417KB。

继续:

找:

剩余空间。


注意:

考试:

一定:

按照顺序模拟。

不能:

凭感觉。


十、连续分配总结

我们学了:

① 单一连续分配

特点:

一个程序。

简单。

浪费大。


② 固定分区

特点:

提前划分。

产生:

内部碎片。


③ 动态分区

特点:

按需分配。

产生:

外部碎片。


④ 三种算法

首次适应 First Fit

最佳适应 Best Fit

最坏适应 Worst Fit

十一、本课重点(★★★★★)

必须掌握:

连续分配:

一个程序占连续内存。


内部碎片:

分给你的比需要的大。


外部碎片:

空闲总量够,但不连续。


三个算法:

口诀:

首次找第一个,最佳找最小,最坏拿大块。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐