接下来我们讨论碎片整理
碎片整理是想说
我们已经把内存分区分配给了进程
它们也已经占定了某一个位置
但是这个时候
我正在执行的应用进程
或者说新创建的进程需要内存空间
这个时候没有了
或者说这些都已经剩下小的碎片了
那我想要内存空间
这个时候怎么办
我们可以通过碎片整理
来获取更大的可用内存空间
以便于满足进程的应用空间需求
我们看碎片整理
碎片整理是指我们通过调整
已分配给进程的内存分区它的位置
来减少碎片的一种做法
这种做法有一个图示
说这里头这几个闪烁的地方
就在我们这里头是空闲的空间
但是假定说这里头最大是剩三块
但是现在我要分配一个连续四块
那就没有了
这个时候怎么办呢
我们希望通过碎片整理
我们把它压缩到一起
然后剩的这块就可以满足要求了
但是我要把正在内存当中的
这些进程的位置挪动
这个事是不可以随便弄的
原因在于我里头
可能有各种各样的地址引用
这种引用用的是绝对地址的话
那这个时候你挪了之后
它是没办法正确运行的
所以在这里头要进行碎片紧凑
它是需要一些条件
也就是说我所有这些进程
都是可以动态重定位的
只有做到这点之后
我这里程序才可以去搬它
当然这种搬也是有开销的
你不可以正在处于运行的状态去搬
通常情况下我们会在什么情况去搬
正常情况下 处于等待状态进程
我会对它进行搬动
然后再有一个
并不是说为了一小块区域
我要把整个内存当中的
很多进程都把它挪一遍
这个开销也是大的
我在这里头在什么情况下
我需要考虑到开销
然后进行这种紧凑
关于具体的做法
在大家需要相应的技术的时候
再仔细去看
我们在这就介绍到这种程度
第二种做法是分区对换
刚才我把内存里的这些分区
不管怎么挪
最后的结果它都是在内存里头
如果说这个时候仍然不能用
你还是没办法
所以在这里 内存分区对换
是指我把这种处于等待状态进程
它占用地址空间给它抢占了
然后把这个等待进程占用的数据
我总得找个地方存
我把它存到外存里头去
在这里就是对换到对换区
这时候我内存里的空间也就变大了
在这 我们也通过一个图示来看
在这个图示里
底下是内存和外存的状态
中间这个图实际上说的是
我们在系统里头
进程在执行过程当中
我们维护进程的状态信息
这个我们在后面讨论还会再说到
我们看每创建一个进程
创建的时候它在内存里要占一块区域
创建好之后 它数据结构都弄好
操作系统维护的数据建好
然后这个时候它可以投入到运行状态
它在运行的过程当中
可能会有另外一个进程要创建
它也需要在这里分配相应的存储区域
然后进到就绪状态
第一个还在继续运行
在这个过程当中我们继续可以进行下去
由于某种原因我P1处于等待状态
这个时候P2 P3又进内存里
来运行状态
那么在这种状态下
如果说我再有一个P4进来
它要的空间就不够了
这个时候怎么办呢
我们会把处于等待状这个搬到外存里头去
这样空出一块区域来
我把这个P4放在这里
这是我们就可以让它更多进程在系统里交替运行
使得我的可用空间能变大
在这里大家可以注意到
我们这有一个对换的名字
实际上大家如果注意的话
在你的Linux或者Unix系统里
它有一个分区 叫换区
实际上这个对换区在早期的时候
它就是一种充分利用内存的做法
那么在这张图里头我们可以看到
在早的时候 甚至在操作系统里头
只有一个应用进程可以在内存的状态下
它都可以用对换来实现多进程交替运行
在这是这样的
任何一个时候只有一个进程在内存当中运行
而处于暂停的 是把它放到外存里头
如果说当前进程主动让出处理机使用权限
这个时候做法 把它对换到外存当中
在把外存当中这个搬回去
这个时候我就可以继续运行下去了
用这种办法实际上在我们比较早的时候
内存很紧张的情况下
我们在系统里就可以实现
多进程的交替运行
当然在这里这个交替
它的开销是非常大的
原因在于内存和外存之间的速度差的很远
即使是这样 由于我们前面的系统
计算机系统它的成本非常高
所以这样做的开销 也是可以接受的
当然在这里头我在对换的时候
到底把谁对换出来
这个时候开销有多大
这个时候在系统里
你就得经过仔细的权衡
所以在前面做的时候
它花很大的精力会去解决
我到底是对换哪一个进程
这是我们在早期的时候
计算机系统里的多进程
通过对换区的方式来做的一种实现