数据结构课程设计内存分配.docx
- 文档编号:8928878
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:316.92KB
数据结构课程设计内存分配.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->size { 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->size { 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->address &&(back1->address check=0; else before=before->next; if(check==0) printf("Errorinput! ! \n"); returncheck;/*返回检查结果*/ } 四.运行与测试 可以自己手动写入需要的相应文本内容,也可以系统自动生成 系统自动生成文本前或是手动建立文本前,选择1便会出错 现在我们选择2重新输入文本内容并选择输入4自由块空间,每个空间起始地址与长度自己定义,输入完选择3显示空闲表和分配表 返回选择界面,选择1申请空间 申请完毕选择3可看分配情况跟此时自由块的空闲和占用情况 完成作业后撤销作业 撤销完毕后再来查看此时自由块情况,会发现作业空间释放后自由块恢复原本大小 五、总结 在这次课设中,我发现自己c语言掌握的不够好,但是这次课设使我对操作系统的知识有了一定的了解,也巩固了c语言的知识,设计中,对程序代码的设计阶段比较困难,但是我觉得通过课设能提高我的动手能力与熟练程度。 参考文献 《数据结构》(C语言版)严蔚敏、吴伟民编著 [美]S巴斯.计算机算法: 《设计和分析引论》.朱洪等译 《数据库系统基础》姚诗斌编著
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 内存分配 数据结构 课程设计 内存 分配