在管理内存的时候,操作系统需要知道内存空间有多少空闲。如何才能知道有哪些空闲呢?这就必须跟踪内存的使用。
跟踪的办法有两种:
第1种办法是给每个分配单元赋予一个字位,用来记录该分配单元是否闲置。
例如,字位取值0表示分配单元闲置,字位取值1则表示该分配单元已被占用。这种表示法就是所谓的位图表示法,如图11-17所示
位图表示法的优点是直观、简单。在搜索需要的闲置空间时只需要找到一片连续0个数大于等于所需分配单元数即可。
例如,如果我们需要找一片4个分配单元大的闲置空间,则通过扫描位图表,找到连续4个0即可。将这片空间分配给需要的程序,并将相应的位图值设置为1。
另外一种办法是将分配单元按是否闲置链接起来,这种办法称为链表表示法。对于图11-17的位图所表示的内存分配状态,如果用链表表示则如图11-18所示。
图中的P代表程序,即当前这片空间由程序占用。后面的数字是本片空间的起始分配单元号和大小。而H代表的是空洞,即这是一片闲置空间。
例如,图中的第1个链表项表示一个大小为5个分配单元的程序,起始地址为第0个分配块。第2个链表项表示一片大小为4个分配单元的闲置空间块,起始地址为第5个分配单元。其他以此类推。
在链表表示下,寻找一个给定大小的闲置空间意味着找到一个类型为H的链表项,其大小大于或等于给定的目标值。不过,扫描链表速度通常较慢。为提高查找闲置单元的速度,有人提出了将闲置空间和被占空间分开设置链表,这样就形成了两个链表的管理模式。
位图表示和链表表示的比较
位图表示和链表表示各有优缺点。如果程序数量很少,那么链表比较好,因为链表的表项数量少。
例如,如果只有3个程序在内存中,则最多只需要7个链表节点。但是如果你的程序很稠密的话,那么链表的节点就很多了。
位图表示法的空间成本是固定的,它不依赖于内存中程序的数量。因此,从空间成本上分析,到底使用哪种表示法得看链表表示后的空间成本是大于位图表示还是小于位图表示而定。
从可靠性上看,位图表示法没有容错能力。如果一个分配单元为1,你并不能肯定它应该为1,还是因为错误变成1的。因为链表有被占空间和闲置空间的表项,可以相互验证,具有一定的容错能力。
从时间成本上,位图表示法在修改分配单元状态时,操作很简单,直接修改其位图值即可,而链表表示法则需要对前后空间进行检查以便做出相应的合并。例如,在图11-18所示的情况下,如果程序中间的那个程序(占用位置从9开始,长度为3)终止,则链表将如图11-19所示。如果是最前面的程序终止,则链表将如图11-20所示。
ps
- 为什么要知道内存空间有多少空闲