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