数据结构课程设计内存分配.docx
《数据结构课程设计内存分配.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计内存分配.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计内存分配
目录
一、题目概述(内容及要求)3
二、功能分析4
三、设计5
四、运行与测试6
五、总结7
参考文献8
一、题目概述(内容及要求)
模拟分区内存管理的模式下的各种内存分配策略,根据输入的各进程的信息(进程名,需要内存大小,进入内存时间,退出内存时间,发生申请内存的时间,申请内存的大小等),输出各个时间段上系统中的内存分布情况(各个空闲区位置和大小,各个进程空间的位置和大小)。
任务:
利用静态链表,模拟实现内存分配(分页,分区)
要求:
1.设计数据结构,存储结构;
2.在c兼容环境完成上述题目的代码编写与调试;
3.程序运行界面交互性好;
4.软件运行,给出测试数据。
二、功能分析
最先适应算法:
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间,为适应这种算法,空闲分区表中的空闲分区要按地址由低到高进行排序。
该算法优先使用低址部分空闲区。
分区模式的基本工作流程图:
总体流程图:
三、设计
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#defineMAX32767
typedefstructnode/*设置分区描述器*/
{
intaddress,size;
structnode*next;
}RECT;/*函数原型*/
RECT*assignment(RECT*head,intapplication);
voidacceptment1(RECT*head,RECT*back1);
voidacceptment2(RECT*head,RECT*back1)
intbackcheck(RECT*head,RECT*back1);
voidprint(RECT*head);/*变量声明*/
RECT*head,*back,*assign1,*p;
intapplication1,maxblocknum;
charway;/*主函数*/
main()
{
charchoose[10];
intcheck;
head=malloc(sizeof(RECT));/*建立可利用区表的初始状态*/
p=malloc(sizeof(RECT));
head->size=MAX;
head->address=0;
head->next=p;
maxblocknum=1;
p->size=MAX;
p->address=0;
p->next=NULL;
print(head);/*输出可利用表初始状态*/
printf("Entertheway(bestorfirst(b/f)\n");/*选择适应策略*/
scanf("%c",&way);
do{
printf("Entertheassignoraccept(as/ac)\n");
scanf("%s",choose);/*选择分配或回收*/
if(strcmp(choose,"as")==0)/*as为分配*/
{
printf("Inputapplication:
\n");
scanf("%d",&application1);/*输入申请空间大小*/
assign1=assignment(head,application1);/*调用分配函数*/
if(assign1->address==-1)/*分配不成功*/
printf("Toolargeapplication!
assignfails!
!
\n\n");
else
printf("Success!
!
ADDRESS=%5d\n",assign1->address);/*分配成功*/
print(head);/*输出*/
}
elseif(strcmp(choose,"ac")==0)/*回收*/
{
back=malloc(sizeof(RECT));
printf("InputAdressandSize!
!
\n");
scanf("%d%d",&back->address,&back->size);/*输入回收地址和大小*/
check=backcheck(head,back);/*检查*/
if(check==1)
{
if(tolower(way)=='f')/*首先适应算法*/
acceptment1(head,back);/*首先适应*/
else
acceptment2(head,back);/*最佳适应*/
print(head);
}
}
}while(!
strcmp(choose,"as")||!
strcmp(choose,"ac"));
}
/*
分配函数
*/
RECT*assignment(RECT*head,intapplication)
{
RECT*after,*before,*assign;
assign=malloc(sizeof(RECT));/*分配申请空间*/
assign->size=application;
assign->next=NULL;
if(application>head->size||application<=0)
assign->address=-1;/*申请无效*/
else
{
before=head;
after=head->next;
while(after->size{
before=before->next;
after=after->next;
}
if(after->size==application)/*结点大小等于申请大小则完全分配*/
{
if(after->size==head->size)
maxblocknum--;
before->next=after->next;
assign->address=after->address;
free(after);
}
else
{
if(after->size==head->size)maxblocknum--;
after->size=after->size-application;/*大于申请空间则截取相应大小分配*/
assign->address=after->address+after->size;
if(tolower(way)=='b')/*如果是最佳适应,将截取后剩余结点重新回收到合适位置*/
{
before->next=after->next;
back=after;
acceptment2(head,back);
}
}
if(maxblocknum==0)/*修改最大数和头结点值*/
{
before=head;
head->size=0;
maxblocknum=1;
while(before!
=NULL)
{
if(before->size>head->size)
{
head->size=before->size;
maxblocknum=1;
}
elseif(before->size==head->size)
maxblocknum++;
before=before->next;
}
}
}
assign1=assign;
returnassign1;/*返回分配给用户的地址*/
}
voidacceptment1(RECT*head,RECT*back1)/*首先适应*/
{
RECT*before,*after;
intinsert;
before=head;
after=head->next;
insert=0;
while(!
insert)/*将回收区插入空闲区表*/
{
if((after==NULL)||((back1->address<=after->address)&&(back1->address>=before->address)))
{
before->next=back1;
back1->next=after;
insert=1;
}
else
{
before=before->next;
after=after->next;
}
}
if(back1->address==before->address+before->size)/*与上一块合并*/
{
before->size=before->size+back1->size;
before->next=back1->next;
free(back1);
back1=before;
}
if(after!
=NULL&&(after->address==back1->address+back1->size))
{/*与下一块合并*/
back1->size=back1->size+after->size;
back1->next=after->next;
free(after);
}
if(head->sizesize)/*修改最大块值和最大块个数*/
{
head->size=back1->size;
maxblocknum=1;
}
else
if(head->size==back1->size)
maxblocknum++;
}
/*最佳适应,back1为回收结点的地址*/
voidacceptment2(RECT*head,RECT*back1)
{
RECT*before,*after;
intinsert
insert=0;
before=head;
after=head->next;
if(head->next==NULL)/*如果可利用区表为空*/
{
head->size=back1->size;
head->next=back1;
maxblocknum++;
back1->next=NULL;
}
else
{
while(after!
=NULL)/*与上一块合并*/
if(back1->address==after->size+after->address)
{
before->next=after->next;
back->size=after->size+back1->size;
free(after);
after=NULL;
}
else
{
after=after->next;
before=before->next;
}
before=head;
after=head->next;
while(after!
=NULL)
if(after->address==back1->size+back1->address)/*与下一块合并*/
{
back1->size=back1->size+after->size;
before->next=after->next;
free(after);
after=NULL;
}
else
{
before=before->next;
after=after->next;
}
before=head;/*将回收结点插入到合适的位置*/
after=head->next;
do{
if(after==NULL||(after->size>back1->size))
{
before->next=back1;
back1->next=after;
insert=1;
}
else
{
before=before->next;
after=after->next;
}
}while(!
insert);
if(head->sizesize)/*修改最大块值和最大块数*/
{
head->size=back1->size;
maxblocknum++;
}
else
if(head->size==back1->size)
maxblocknum++;
}
}
voidprint(RECT*head)/*输出链表*/
{
RECT*before,*after;
intindex,k;
before=head->next;
index=1;
if(head->next==NULL)
printf("NOpartforassignment!
!
\n");
else
{
printf("*****index*******address********end*********size*****\n");
while(before!
=NULL)
{
printf("----------------------------------------------------\n");
printf("%-13d%-13d%-13d%-13d\n",index,before->address,before->address+before->size-1,before->size);
printf("----------------------------------------------------\n");
index++;
before=before->next;
}
}
}/*检查回收块的合法性,back1为要回收的结点地址*/
intbackcheck(RECT*head,RECT*back1)
{
RECT*before,*after;
intcheck=1;
if(back1->address<0||back1->size<0)
check=0;/*地址和大小不能为负*/
before=head->next;
while((before!
=NULL)&&check)/*地址不能和空闲区表中结点出现重叠*/
if(((back1->addressaddress)&&(back1->address+back1->size>before->address))||((back1->address>=before->address)
&&(back1->addressaddress+before->size)))
check=0;
else
before=before->next;
if(check==0)
printf("Errorinput!
!
\n");
returncheck;/*返回检查结果*/
}
四.运行与测试
可以自己手动写入需要的相应文本内容,也可以系统自动生成
系统自动生成文本前或是手动建立文本前,选择1便会出错
现在我们选择2重新输入文本内容并选择输入4自由块空间,每个空间起始地址与长度自己定义,输入完选择3显示空闲表和分配表
返回选择界面,选择1申请空间
申请完毕选择3可看分配情况跟此时自由块的空闲和占用情况
完成作业后撤销作业
撤销完毕后再来查看此时自由块情况,会发现作业空间释放后自由块恢复原本大小
五、总结
在这次课设中,我发现自己c语言掌握的不够好,但是这次课设使我对操作系统的知识有了一定的了解,也巩固了c语言的知识,设计中,对程序代码的设计阶段比较困难,但是我觉得通过课设能提高我的动手能力与熟练程度。
参考文献
《数据结构》(C语言版)严蔚敏、吴伟民编著
[美]S巴斯.计算机算法:
《设计和分析引论》.朱洪等译
《数据库系统基础》姚诗斌编著