计算机操作系统动态分区.docx
《计算机操作系统动态分区.docx》由会员分享,可在线阅读,更多相关《计算机操作系统动态分区.docx(15页珍藏版)》请在冰豆网上搜索。
计算机操作系统动态分区
动态分区算法
源代码:
#include"stdio.h"
#defineN5
intstart;
structfreearea
{
intstartaddress;
intsize;
intstate;
}freeblock[N]={{20,20,1},{80,50,1},{150,30,1},{300,30,0},{600,10,1}};
intalloc(intapplyarea)
{
inti,tag=0;
for(i=0;iif(freeblock[i].state==1&&freeblock[i].size>applyarea)
{
freeblock[i].startaddress=freeblock[i].startaddress+applyarea;
freeblock[i].size=freeblock[i].size-applyarea;
tag=1;
returnfreeblock[i].startaddress-applyarea;
}
else
if(freeblock[i].state==1&&freeblock[i].size==applyarea)
{
freeblock[i].state=0;
tag=1;
returnfreeblock[i].startaddress;
}
if(tag==0)
return-1;
}
intalloc2(intapplyarea,ints)
{
inti,tag=0;
for(i=s;iif(freeblock[i].state==1&&freeblock[i].size>applyarea)
{
freeblock[i].startaddress=freeblock[i].startaddress+applyarea;
freeblock[i].size=freeblock[i].size-applyarea;
tag=1;
start=freeblock[i].startaddress-applyarea;
returni;
}
else
if(freeblock[i].state==1&&freeblock[i].size==applyarea)
{
freeblock[i].state=0;
tag=1;
start=freeblock[i].startaddress;
returni;
}
if(tag==0)
return-1;
}
intalloc3(intapplyarea)
{
inti,k,h,flag,tag=0,j=0;
inta[N];
structfreeareamin;
structfreeareamid;
for(i=0;i{
if(freeblock[i].state==1&&freeblock[i].size==applyarea)
{
freeblock[i].state=0;
tag=1;
returnfreeblock[i].startaddress;
}
}
for(i=0;i{
if(freeblock[i].state==1&&freeblock[i].size>applyarea)a[j++]=i;
}
if(j>1)
{
h=a[0];
min=freeblock[h];
for(k=1;k{
h=a[k];
if(freeblock[h].size{
mid.size=freeblock[h].size;
mid.state=freeblock[h].state;
mid.startaddress=freeblock[h].startaddress;
freeblock[h].size=min.size;
freeblock[h].state=min.state;
freeblock[h].startaddress=min.startaddress;
min.size=mid.size;
min.state=mid.state;
min.startaddress=mid.startaddress;
}
}
min.startaddress=min.startaddress+applyarea;
min.size=min.size-applyarea;
tag=1;
returnmin.startaddress-applyarea;
}
elseif(j==1)
{
h=a[0];
min=freeblock[h];
min.startaddress=min.startaddress+applyarea;
min.size=min.size-applyarea;
tag=1;
returnmin.startaddress-applyarea;
}
if(tag==0)
return-1;
}
voidsetfree()
{
ints,l,tag1=0,tag2=0,tag3=0,i,j;
printf("inputfreeareastartaddress:
\n");
scanf("%d",&s);
printf("inputfreeareasize:
\n");
scanf("%d",&l);
for(i=0;i{
if(freeblock[i].startaddress==s+l&&freeblock[i].state==1)
{
l=l+freeblock[i].size;
tag1=1;
for(j=0;jif(freeblock[j].startaddress+freeblock[j].size==s&&freeblock[j].state==1)
{
freeblock[i].state=0;
freeblock[j].size=freeblock[j].size+l;
tag2=1;
break;
}
if(tag2==0)
{
freeblock[i].startaddress=s;
freeblock[i].size=l;
break;
}
}
}
if(tag1==0)
{
for(i=0;iif(freeblock[i].startaddress+freeblock[i].size==s&&freeblock[i].state==1)
{
freeblock[i].size=freeblock[i].size+l;
tag3=1;
break;
}
if(tag3==0)
for(j=0;jif(freeblock[j].state==0)
{
freeblock[j].startaddress=s;
freeblock[j].size=l;
freeblock[j].state=1;
break;
}
}
}
voidadjust()
{
inti,j;
structfreeareamiddata;
for(i=0;ifor(j=0;jif(freeblock[j].startaddress>freeblock[j+1].startaddress)
{
middata.startaddress=freeblock[j].startaddress;
middata.size=freeblock[j].size;
middata.state=freeblock[j].state;
freeblock[j].startaddress=freeblock[j+1].startaddress;
freeblock[j].size=freeblock[j+1].size;
freeblock[j].state=freeblock[j+1].state;
freeblock[j+1].startaddress=middata.startaddress;
freeblock[j+1].size=middata.size;
freeblock[j+1].state=middata.state;
}
for(i=0;ifor(j=0;jif(freeblock[j].state==0&&freeblock[j+1].state==1)
{
middata.startaddress=freeblock[j].startaddress;
middata.size=freeblock[j].size;
middata.state=freeblock[j].state;
freeblock[j].startaddress=freeblock[j+1].startaddress;
freeblock[j].size=freeblock[j+1].size;
freeblock[j].state=freeblock[j+1].state;
freeblock[j+1].startaddress=middata.startaddress;
freeblock[j+1].size=middata.size;
freeblock[j+1].state=middata.state;
}
}
voidprint()
{
inti;
printf("|---------------------------------------------------------------|\n");
printf("|startsizestate|\n");
printf("|---------------------------------------------------------------|\n");
for(i=0;i{
printf("|%3d%3d%3d|\n",
freeblock[i].startaddress,freeblock[i].size,freeblock[i].state);
printf("|---------------------------------------------------------------|\n");
}
}
voidshouci()
{
intapplyarea,start,i,j;
charend;
getchar();
printf("\nisthereanyjobrequestmemory?
yorn:
");
while((end=getchar())=='y')
{
printf("atfirstthefreememoryisthis:
\n");
adjust();
print();
printf("inputrequestmemorysize:
");
scanf("%d",&applyarea);
start=alloc(applyarea);
if(start==-1)
printf("thereisnofitmemory,pleasewait\n");
else
{
adjust();
printf("afterallocation,thefreememoryisthis:
\n");
print();
printf("job'smemorystartaddressis:
%d\n",start);
printf("jobsizeis:
%d\n",applyarea);
printf("jobisrunning.\n");
printf("jobisterminated.\n");
}
for(j=1;j<100000;j++);
setfree();
adjust();
print();
printf("isthereanyjobthatiswaiting?
y/n:
");
end=getchar();
}
}
voidxunhuan()
{
intapplyarea,i=0,j;
charend;
getchar();
printf("\nisthereanyjobrequestmemory?
yorn:
");
while((end=getchar())=='y')
{
printf("atfirstthefreememoryisthis:
\n");
adjust();
print();
printf("inputrequestmemorysize:
");
scanf("%d",&applyarea);
if(i==N-1)
{
i=alloc2(applyarea,i);
if(i==-1)i=0;
}
elseif(ii=alloc2(applyarea,i);
if(i==-1)
printf("thereisnofitmemory,pleasewait\n");
else
{
adjust();
printf("afterallocation,thefreememoryisthis:
\n");
print();
printf("job'smemorystartaddressis:
%d\n",start);
printf("jobsizeis:
%d\n",applyarea);
printf("jobisrunning.\n");
printf("jobisterminated.\n");
}
for(j=1;j<100000;j++);
setfree();
adjust();
print();
printf("isthereanyjobthatiswaiting?
y/n:
");
end=getchar();
}
}
voidbest()
{
intapplyarea,start,i,j;
charend;
getchar();
printf("\nisthereanyjobrequestmemory?
yorn:
");
while((end=getchar())=='y')
{
printf("atfirstthefreememoryisthis:
\n");
adjust();
print();
printf("inputrequestmemorysize:
");
scanf("%d",&applyarea);
start=alloc3(applyarea);
if(start==-1)
printf("thereisnofitmemory,pleasewait\n");
else
{
adjust();
printf("afterallocation,thefreememoryisthis:
\n");
print();
printf("job'smemorystartaddressis:
%d\n",start);
printf("jobsizeis:
%d\n",applyarea);
printf("jobisrunning.\n");
printf("jobisterminated.\n");
}
for(j=1;j<100000;j++);
setfree();
adjust();
print();
printf("isthereanyjobthatiswaiting?
y/n:
");
end=getchar();
}
}
main()
{
chars;
printf("choseonemethod:
a首次适应b循环首次c最佳适应\n");
s=getchar();
switch(s)
{
case'a':
shouci();
case'b':
xunhuan();
case'c':
best();
default:
printf("error\n");
}
}
运行结果:
调试、编辑、运行程序,开始显示如图:
输入a,选择进行首次适应,然后输入y显示空闲区,显示如图:
再输入区间大小20,选择进行分配空间,作业开始运行,显示如图:
输入空闲区的开始地址1000,空闲区大小30,显示如图: