数据结构课程设计内存分配.docx

上传人:b****6 文档编号:8928878 上传时间:2023-02-02 格式:DOCX 页数:14 大小:316.92KB
下载 相关 举报
数据结构课程设计内存分配.docx_第1页
第1页 / 共14页
数据结构课程设计内存分配.docx_第2页
第2页 / 共14页
数据结构课程设计内存分配.docx_第3页
第3页 / 共14页
数据结构课程设计内存分配.docx_第4页
第4页 / 共14页
数据结构课程设计内存分配.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构课程设计内存分配.docx

《数据结构课程设计内存分配.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计内存分配.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构课程设计内存分配.docx

数据结构课程设计内存分配

目录

一、题目概述(内容及要求)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巴斯.计算机算法:

《设计和分析引论》.朱洪等译

《数据库系统基础》姚诗斌编著

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1