计算机操作系统动态分区.docx
- 文档编号:5699659
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:15
- 大小:182.06KB
计算机操作系统动态分区.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;i if(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;i if(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;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;i if(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;j if(freeblock[j].state==0) { freeblock[j].startaddress=s; freeblock[j].size=l; freeblock[j].state=1; break; } } } voidadjust() { inti,j; structfreeareamiddata; for(i=0;i for(j=0;j 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; } for(i=0;i for(j=0;j 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; 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(i i=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,显示如图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机操作系统 动态分区 计算机 操作系统 动态 分区