1、要求:
用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。
假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
•作业1申请130KB •作业2申请60KB。
•作业3申请100KB •作业2释放60KB。
•作业4申请200KB •作业3释放100KB。
•作业1释放130KB •作业5申请140KB。
•作业6申请60KB •作业7申请50KB •作业6释放60KB。
请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。
2、数据结构:
程序采用链式存储结构存储空闲分区链。首先定义空闲分区表的结构体,包括空闲分区表的id号,首地址、分区大小、分配标志。然后用结构体表示链表的每一个节点,包括分区表结构体、front和next指针。
3、最佳适应算法思路:
首先,定义一个p指针,让p指针遍历空闲分区链表,当找到第一个满足进程请求空间大小的空闲区时,记录此位置,并且保存请求大小与空闲分区实际大小的差值记为a,然后让p指针继续遍历空闲分区链表,每当满足请求内存大小小于空闲区大小时,就记录两者的差值并且记录为b,比较a与b的大小关系,当a>b时,将b的值赋予a,并且修改记录位置为此空闲区的位置。若,a<=b,不做操作。继续遍历链表,重复上面的操作,直到p->next指向null为止。
4、 首次适应算法思路:
首次适应算法比较简单,只要找到满足条件的空闲区,就将此区的空间分配给进程。首先,用P指针遍历链表,找到第一个空间大于或者等于请求大小的位置,将此空间分配给进程,当此空闲区大小大于请求空间大小时,将空闲区分为两部分,一部分分配给进程,另一部分为空闲区,它的大小为之前空闲区大小减去分配给进程的空间大小。
5:、内存回收算法思想:
内存回收时,回收分区与空闲分区有四种关系。第一种情况为回收分区r上临一个空闲分区,此时应该合并为一个连续的空闲区,其始址为r上相邻的分区的首地址,而大小为两者大小之和。第二种情况为回收分区r与下相邻空闲分区,合并后仍然为空闲区,该空闲区的始址为回收分区r的地址。大小为两者之和,第三种情况为回收部分r与上下空闲区相邻,此时将这三个区域合并,始址为r上相邻区域的地址,大小为三个分区大小之和。当回收部分r上下区域都为非空闲区域,此时建立一个新的空闲分区,并且加入到空闲区队列中去。
6、主要函数伪代码:
Void first_fit()//首次适应算法
{
定义一个临时节点temp储存进程ID,和请求内存大小size,标记为繁忙BUSY;
定义p指针用来遍历空闲区链表;
初始p指向链表头结点;
While(p)
{
if(p为空闲区&&p大小刚好满足要求)
{
将此区域分配给进程;
标记为繁忙区域;
Return 1;
Break;
}
If(p为空闲区&&空闲区大小比进程请求空间大小大)
{
将temp插入到链表此位置上