- 姓名 胡家揆
- 学号 201821121023
- 班级 计算1811
1. 记录内存空间使用情况

2. 记录空闲分区


3. 内存分配算法
(1)首次适应算法(First Fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给
作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到
高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。

(2)最佳适应算法(Best Fit):从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使
碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一
个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。

(3)最差适应算法(Worst Fit):从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中
的结点大小趋于均匀,适用于请求分配的内存大小范围较窄的系统。为适应此算法,空闲分区表(空闲区链)中的空
闲分区按大小从大到小进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留小的空闲区,尽量
减少小的碎片产生。

4. 内存释放算法


//创建一个新进程
int new_process(int x)
{
struct allocated_block *ab;
int size;
int ret;
ab= (struct allocated_block*)malloc(sizeof(struct allocated_block));
if(!ab)
exit(-5);
ab->next= NULL;
pid++;
sprintf(ab->process_name,"PROCESS-%02d",pid);//将格式化的数据写入某字符串中
ab->pid= pid;
ab->size=x;
ret= allocate_mem(ab);
if((ret== 1)&&(allocated_block_head== NULL)) //如果此时未赋值,则赋值
{
allocated_block_head= ab;
return 1;
}
else if(ret== 1) //分配成功,将该已分配块的描述插入已分配链表
{
ab->next= allocated_block_head;
allocated_block_head= ab;
return 2;
}
else if(ret== -1) //分配不成功
{
printf("Allocation fail.\n");
free(ab);
return -1;
}
return 3;
}
5. 运行结果
(1)产生测试数据
int main()
{
int i,x;//定义变量
pid= 0;//初始化pid
free_block= init_free_block(mem_size);
for(i=0;i<=9;i++){//十次循环
x=rand()%100;//产生0~100的随机数
new_process(x);//添加新进程
display_mem_usage();//显示内存使用情况
}
for(i=10;i>0;i--){//十次循环
kill_process(i);//释放pid为i的进程
display_mem_usage();//显示内存使用情况
}
}
使用for循环产生10个100内的随机数代表每次新进程占用的空间,我的内存空间初始为1024,不会出现内存不足。产生的随机数为size:





以上是分配10个进程空间
下面将10个进程空间释放:





(2)解释结果

pid为1的进程占用地址0~83的空间,占用大小为83,分配完的空闲内存空间为地址83开始,大小941的空间大小
pid为2的进程占用地址83~169的空间,占用大小为86,分配完的空闲内存空间为地址169开始,大小855的空间大小
pid为3的进程占用地址169~246的空间,占用大小为77,分配完的空闲内存空间为地址169开始,大小778的空间大小
pid为4的进程占用地址246~261的空间,占用大小为15,分配完的空闲内存空间为地址261开始,大小763的空间大小

637到1024大小为387的空间为添加完10个进程后剩下的空间
pid=10的进程被释放,多出地址从616开始大小为21的空间
释放完全部进程后:

剩下11个空间(10为之前10个进程的空间,11为添加剩余的空间)
正在使用的进程为0。
提交于2020-05-17 13:36
修改完添加了释放的功能测试 ,修改时的随机数和之前一样,可能是C语言的伪随机。
修改于2020-05-17 14:21
浙公网安备 33010602011771号