加入我们有一个进程p1占用6k内存大小
此时p2进来占用2k进程,但是我们不能用p1所占剩下的2k空间
所以p1的进程剩下的2k内存空间就被浪费了,浪费的空间叫做内存碎片。
但是当p1执行完毕,被系统释放内存回收之后其他进程依旧可以进入。
实现上面的功能,我们需要记录两个情况,一个是我们有那些区域可用,另一个是那些区域被占用。
这里说了一个问题,最后我们会在内存中看到很多大小不一的“洞”(a hole)
问题演示
假设我们是下面大的进程集需要系统分配空间,那么1、2、3进来之后我们有一个洞,这时候4、5、6可以填补这个洞,那么这时2释放空间之后,我们有第二个洞,那么这个洞只有等7来占用,长此以往下去小的洞会越来越多。
动态存储分配问题
三个算法,分配原理不同,应用场景不同
第二个和第三个都需要便利内存
地址转换与保护
地址越界提示,需要查看变址寄存器
内部碎片
对固定大小内存分区内部产生的空出来的内存空间
外部碎片
可变分区长时间分配之后会产生很多大小不一的洞,这些洞实在太小了无法再被分配,这些洞叫做外部碎片
这里有一个算法,这个算法的原理是将内存一直向上或者向下移动(一个方向),这样就会将碎片覆盖,这个算法叫做compaction
注意:如果这里地址转化是静态的,也就是加载时内存基址被确定,那么这样就无法移动,那么也就无法使用这个算法;还有检测机制是需要有一定开销的,我们考虑是否开销的浪费大于内存碎片的浪费。







