- 姓名 胡家揆
- 学号 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