动态分区分配存储管理系统.docx

上传人:b****6 文档编号:7838145 上传时间:2023-01-26 格式:DOCX 页数:28 大小:461.67KB
下载 相关 举报
动态分区分配存储管理系统.docx_第1页
第1页 / 共28页
动态分区分配存储管理系统.docx_第2页
第2页 / 共28页
动态分区分配存储管理系统.docx_第3页
第3页 / 共28页
动态分区分配存储管理系统.docx_第4页
第4页 / 共28页
动态分区分配存储管理系统.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

动态分区分配存储管理系统.docx

《动态分区分配存储管理系统.docx》由会员分享,可在线阅读,更多相关《动态分区分配存储管理系统.docx(28页珍藏版)》请在冰豆网上搜索。

动态分区分配存储管理系统.docx

动态分区分配存储管理系统

 

动态分区分配存储管理系统

动态分区分配存储管理系统

学院

专业

学号

学生姓名

指导老师

2014年3月19日

1、设计目的3

1、设计目的与内容

设计的目的

操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

●进一步巩固和复习操作系统的基础知识。

●培养学生结构化程序、模块化程序设计的方法和能力。

●提高学生调试程序的技巧和软件设计的能力。

●提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

设计内容:

用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算法

1.首次适应算法

2.循环首次适应算法

设计要求:

1.内存中有0-100M的空间为用户程序空间,最开始用户空间是空闲的

2.作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入

3.可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存时间、运行时间的初始化

4.根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度,作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。

(为了简化,不考虑CPU的调度与切换,运行时间为作业在内存中驻留的时间)

5.能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程均有动态图形变化的显示

6.采用可视化界面,可随时暂停显示当前内存分配和使用情况图。

二、算法的思想

1、首次适应算法

空闲分区链以地址递增的次序链接,分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,取消的空闲分区仍留在空闲链中。

若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。

2、循环首次适应算法

在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业

三、主要功能模块流程图

主函数

 

是否

首次适应算法:

 

 

 

 

循环首次适应算法

 

 

 

四、系统测试

程序运行实例如下:

输入界面,按要求输入:

 

 

五、结论

作业采用数组形式进行存储,起初想用数组模拟分区,但划分记录比较不易,时间空间复杂度较大,容易混乱,遂决定用链表形式模拟分区情况。

基本能运行符合要求,能模拟出动态分区过程及最终结果

六.源程序

#include

#include

#include

#include

#defineFree0

#defineUse1

#defineMAX_length100//最大内存空间为100MB

#defineMaxNumber100

intFreePartition[MaxNumber]={16,16,8,32,64,32,8,16,64};//空闲分区

intProcessNeed[MaxNumber]={7,18,9,20,35,8};//每个进程需求

intFirstPartition[MaxNumber];//首次

intCycleFirstPartition[MaxNumber];//循环

intPartitionNumber=9,ProcessNum=6;//空闲分区数及进程数

boolv();

boolv()

{

intj;

cout<<"首次适应算法"<

//FirstPartitionMethod();

for(inti=0;i

for(j=0;j

{

if(FreePartition[j]>=ProcessNeed[i])

{FirstPartition[i]=j;

FreePartition[j]-=ProcessNeed[i];

break;

}

}

//c_out(FirstPartition);

for(i=0;i

cout<

cout<

//Beginning();

FreePartition[0]=16;

FreePartition[1]=16;

FreePartition[2]=8;

FreePartition[3]=32;

FreePartition[4]=64;

FreePartition[5]=32;

FreePartition[6]=8;

FreePartition[7]=16;

FreePartition[8]=64;

cout<<"循环首次适应算法"<

//CycleFirstPartitionMethod();

j=0;

for(i=0;i

for(;;)//分区

{

if(FreePartition[j]>=ProcessNeed[i])

{CycleFirstPartition[i]=j;

FreePartition[j]-=ProcessNeed[i];

break;

}

j++;

j=j%PartitionNumber;

}

//c_out(CycleFirstPartition);

for(i=0;i

cout<

cout<

return1;

}

//--------------作业结构体数组----------------------------

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;

//-----------------------------功能函数-------------------------------------------

voiddelay()

{

for(intx=10000;x>0;x--)

for(inty=1000;y>0;y--);

}

//--------------------------------------------------------------------------------

//------------------------初始化---------------------------------------------------

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("信息输入:

\n\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\t\t\t分区表\n");

printf("\t---------------------------------------\n");

printf("\t开始地址\t分区号\t大小状态\n");

printf("\t---------------------------------------\n");

while(pl)

{

printf("\t%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("\t---------------------------------------\n");

}

//-------------------------------------------------------------------------

//---------------------------------回收函数---------------------------------

voidhuishou(DuLinkListpl3,DuLinkList&pl)//pl3是分区链表指针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与最前一个

pl3->prior=pl3->prior->prior;//

}

else

{

pl3->prior=pl3->prior->prior;//pl3指向空

pl=pl3;

pl3=pl;//pl3与头

}

}

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与最后一个结点

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与最后

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与最前

pl3->prior=pl3->prior->prior;//

}

else

{pl3->prior=NULL;//pl3指向空

pl=pl3;//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(intx=0;x

{if(t==a[x].ctime+a[x].rtime)

a[x].state=2;

}

for(intm=0;m

{

if(t==a[m].ctime+a[m].rtime)

{

num-=1;

a[m].state=2;//0等待1装入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->si

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

当前位置:首页 > PPT模板 > 动物植物

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

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