动态分区分配存储管理系统.docx
- 文档编号:30039891
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:27
- 大小:263.02KB
动态分区分配存储管理系统.docx
《动态分区分配存储管理系统.docx》由会员分享,可在线阅读,更多相关《动态分区分配存储管理系统.docx(27页珍藏版)》请在冰豆网上搜索。
动态分区分配存储管理系统
动态分区分配存储管理系统
学院
专业
学号
学生姓名
指导教师姓名
2014年3月19日
一、课题要求
课程设计的目的:
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,
将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
●进一步巩固和复习操作系统的基础知识。
●培养学生结构化程序、模块化程序设计的方法和能力。
●提高学生调试程序的技巧和软件设计的能力。
●提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
设计内容:
用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算
法
1.首次适应算法
2.循环首次适应算法
设计要求:
1.内存中有0-100M的空间为用户程序空间,最开始用户空间是空闲的
2.作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入
3.可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存
时间、运行时间的初始化
4.根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度,
作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,
退出内存)三种状态。
(为了简化,不考虑CPU的调度与切换,运行时间为作业
在内存中驻留的时间)
5.能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程
均有动态图形变化的显示
6.采用可视化界面,可随时暂停显示当前内存分配和使用情况图。
设计结束需提交下列资料:
1、课程设计报告。
报告中至少应包括:
相关操作系统的知识介绍,程序总的功能说明、
程序各模块的功能说明、程序设计的流程图、源程序清单。
2、源程序和编译连接后的可执行程序文件。
时间安排:
分析设计贮备阶段(1天)
编程调试阶段(7天)
写课程设计报告、考核(2天)
二、算法思想
1、定义基本结构:
1作业结构:
typedefstructJOB
{
intnum;//作业号
intsize;//作业大小
intctime;//作业进入时间
intrtime;//作业运行时间
intstate;//作业状态
}Job
;
2)分区结构:
typedefstructDuLNode
{
intID;//分区号
intstart;//开始地址
intsize;//大小
intstate;//0=尚未使用1=使用2=释放
structDuLNode*prior;//前向指针
structDuLNode*next;//后向指针
}DuLNode,*DuLinkList;
2、基本操作:
intFirstfit(int);//首次适应算法
intNext_fit(int);//循环首次适应算法
voidshowJob(int);//显示作业表
voidshowPartiton(DuLinkList);//显示分区表
DuLinkListInitpartitionList(DuLinkList&p);//初始化
voidhuishou(DuLinkListpl3,DuLinkList&pl);//回收函数
intPutin(int&n);//输入函数,输入作业相关信息
3、首次适应算法
空闲分区链以地址递增的次序链接,分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,取消的空闲分区仍留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
4、循环首次适应算法
在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
三、主要功能模块流程图
主函数:
2
1
3
首次适应算法:
循环首次适应算法
四、系统测试
1、输入界面
2、首次适应算法:
3、循坏首次适应算法:
5、源程序
#include
#include
#include
#include
#defineFree0
#defineUse1
#defineMAX_length100//最大内存空间为100MB
//--------------作业结构体数组----------------------------
typedefstructJOB
{
intnum;//作业号
intsize;//作业大小
intctime;//作业进入时间
intrtime;//作业运行时间
intstate;//作业状态
}Job;
typedefstructDuLNode
{
intID;//分区号
intstart;//开始地址
intsize;//大小
intstate;//0=尚未使用1=使用2=释放
structDuLNode*prior;//前向指针
structDuLNode*next;//后向指针
}DuLNode,*DuLinkList;
//-------------------------------------------------------------------------------
intFirstfit(int);//首次适应算法
intNext_fit(int);//循环首次适应算法
voidshowJob(int);//显示作业表
voidshowPartiton(DuLinkList);//显示分区表
//-----------------------------------------------------------------------------
//---------------------------全局变量-------------------------------------------
intf;
Job*A;//排序前
Job*a;//排序后
Job*temp;
//--------------------------------------------------------------------------------
//------------------------初始化---------------------------------------------------
DuLinkListInitpartitionList(DuLinkList&p)
{
p=(DuLinkList)malloc(sizeof(DuLNode));//申请空间
if(!
p)
exit(0);
p->size=100;//初始化大小
printf("输入分区首地址:
");
scanf("%d",&p->start);
p->state=0;//状态置空闲
p->ID=0;//分区号
p->next=NULL;
p->prior=NULL;
returnp;
}
//------------------------------------------------------------------------------
//-----------------------------输入函数---------------------------------------------
intPutin(int&n)
{
inti;
Jobtemp;
printf("输入作业个数:
");
scanf("%d",&n);
a=(Job*)malloc(n*sizeof(Job));
A=(Job*)malloc(n*sizeof(Job));
for(i=0;i { printf("\n"); printf("作业号: "); scanf("%d",&a[i].num); printf("作业大小: "); scanf("%d",&a[i].size); printf("作业进入时间: "); scanf("%d",&a[i].ctime); printf("作业运行时间: "); scanf("%d",&a[i].rtime); a[i].state=0;//默认状态为Free A[i]=a[i]; } for(intj=0;j for(i=j;i if(a[j].ctime>a[i].ctime) { temp=a[j]; a[j]=a[i]; a[i]=temp; } //冒泡排序 freopen("data.txt","w",stdout); for(i=0;i { printf("%d%d%d%d\n",a[i].num,a[i].size,a[i].ctime,a[i].rtime); } fclose(stdout); freopen("CON","w",stdout); printf("保存成功\n\n"); return1; } //---------------------------------------------------------------------------------------- //-----------------------------读文件----------------------------------------------------- intorder(int&n) { Jobtemp; printf("Inputthenumberofthetask: \n"); scanf("%d",&n); a=(Job*)malloc(n*sizeof(Job)); freopen("data.txt","r",stdin); for(inti=0;i { scanf("%d",&a[i].num); scanf("%d",&a[i].size); scanf("%d",&a[i].ctime); scanf("%d",&a[i].rtime); } fclose(stdin); freopen("CON","r",stdin); for(intj=0;j for(i=j;i if(a[j].ctime>a[i].ctime) { temp=a[j]; a[j]=a[i]; a[i]=temp; } return1; } //------------------------------------------------------------------------ //-------------------------显示分区------------------------------- voidshowPartition(DuLinkListpl) { printf("\n分区表\n"); printf("---------------------------------------\n"); printf("开始地址\t分区号\t大小状态\n"); printf("---------------------------------------\n"); while(pl) { printf("%d\t\t%d\t%d\t",pl->start,pl->ID,pl->size); if(pl->state==0) printf("空闲\n"); if(pl->state==1) printf("已分配\n"); pl=pl->next; } printf("---------------------------------------\n"); } //------------------------------------------------------------------------- //---------------------------------回收函数--------------------------------- voidhuishou(DuLinkListpl3,DuLinkList&pl) { while(pl3) { if(pl3->state==0) { if(pl3->next&&pl3->prior&&pl3->prior->state==0&&pl3->next->state==1) { pl3->size+=pl3->prior->size; pl3->start=pl3->prior->start; pl3->state=0; pl3->ID=0; if(pl3->prior->prior) { pl3->prior->prior->next=pl3; pl3->prior=pl3->prior->prior; } else { pl3->prior=pl3->prior->prior; pl=pl3; pl3=pl; } } elseif(pl3->prior&&pl3->next&&pl3->next->state==0&&pl3->prior->state==1) { pl3->size+=pl3->next->size; pl3->state=0; pl3->ID=0; if(pl3->next->next) { pl3->next->next->prior=pl3; pl3->next=pl3->next->next; } else { pl3->next=pl3->next->next; } } elseif(! pl3->prior) { if(pl3->next->state==0) { pl3->size+=pl3->next->size; pl3->state=0; pl3->ID=0; if(pl3->next->next) pl3->next->next->prior=pl3; pl3->next=pl3->next->next; } else { pl3->state=0; } } elseif(! pl3->next) { if(pl3->prior->state==0) { pl3->size+=pl3->prior->size; pl3->state=0; pl3->ID=0; pl3->start=pl->start; if(pl3->prior->prior) { pl3->prior->prior->next=pl3; pl3->prior=pl3->prior->prior; } else {pl3->prior=NULL; pl=pl3; pl3=pl; } } else { pl3->state=0; } } elseif(pl3->next&&pl3->prior&&pl3->next->state==0&&pl3->prior->state==0) { pl3->size=pl3->size+pl3->next->size+pl3->prior->size; pl3->state=0; pl3->ID=0; pl3->start=pl3->prior->start; if(pl3->next->next) pl3->next->next->prior=pl3; if(pl3->prior->prior) { pl3->prior->prior->next=pl3; pl3->next=pl3->next->next; pl3->prior=pl3->prior->prior; } else { pl3->next=pl3->next->next; pl3->prior=pl3->prior->prior; pl=pl3; pl3=pl; } } } pl3=pl3->next; } } //-------------------------------------------------------------------------------------- //----------------------------------首次适应算法--------------------------------------- voidFirstfit(DuLinkListblock_first,intn) { intt=1; intnum=n; while(t&&num) { DuLinkListpl1=block_first,pl2,pl3=block_first; printf("时钟: %d\n",t); DuLNode*p=block_first; DuLNode*q=block_first; for(intm=0;m { if(t==a[m].ctime+a[m].rtime) { num-=1; a[m].state=2; while(q) { if(q->ID==a[m].num) { q->state=Free; } q=q->next; } showJob(n); showPartition(block_first); } } for(m=0;m { if(a[m].ctime==t) { a[m].state=1; printf("作业: %d开始运行,对其分配! ",a[m].num); } } for(m=0;m { if(t==a[m].ctime) { while(pl1&&(pl1->state==1||pl1->sizenext; if(pl1) { pl2=(DuLinkList)malloc(sizeof(DuLNode)); pl2->start=pl1->start+a[m].size; pl2->state=0; pl2->ID=0; pl2->size=pl1->size-a[m].size; if(pl2->size>5) { pl1->size=a[m].size; pl1->state=1; pl1->ID=a[m].num; if(pl1->next) pl1->next->prior=pl2; pl2->next=pl1->next; pl2->prior=pl1; pl1->next=pl2; pl1=block_first; } else { pl1->state=1; pl1->ID=a[m].num; } showJob(n); showPartition(block_first); } else { cout<<"内存不足,等待释放"< for(inti=m;i { a[i].ctime+=1; } p=block_first; huishou(p,block_first); } } } t+=1; } } //--------------------------------------------------------------- //---------------------------显示作业---------------------------- voidshowJob(intn) { printf("\n作业表: \n"); printf("--------------------------------------------------------------\n"); printf("作业号\t大小\t进入时间\t运行时间\t状态\n"); printf("--------------------------------------------------------------\n"); for(intm=0;m { printf("%d\t%d\t%d\t%d\t",a[m].num,a[m].size,a[m].ctime,a[m].rtime); if(a[m].state==0) print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 分配 存储 管理 系统