📄 主存空间的分配与回收.cpp
字号:
}
else
{ s=s->link; isup=0;} /*上邻标志位置0*/
}
if(isup==0) /*无下邻且无上邻*/
{
k=getsub(SUB); /*重新生成一个新的分区结点*/
strcpy(k->name,pr->name);
k->addr=pr->addr;
k->size=pr->size;
k->state='n';
r=sub;
while(r!=NULL)
{
if((r->size)>(k->size)) /*按分区大小排列,回收区域插在合适的位置*/
{
if(r==sub) /*第一个空闲分区大于回收区域的情况*/
{ k->link=r; sub->link=k; }
else
{
s=sub;
while(s->link!=r) s=s->link;
k->link=r;
s->link=k;
}
break;
}
else r=r->link;
}
if(r==NULL) /*所有空闲分区都大于回收区域的情况*/
{
s=sub;
while(s->link!=NULL) s=s->link;
s->link=k;
k->link=NULL;
}
}
}
printf("\n区域%s己回收.",pr->name);
}
//--------------------------------------------------------------------------
void reclfirst(JCB *pr) /*首次适应与循环首次适应区域回收*/
{
SUB *k;
r=sub;
while(r!=NULL)
{
if(r->addr==((pr->addr)+(pr->size))) /*回收区域有下邻*/
{
pr->size+=r->size;
s=sub;
isdown=1; /*下邻标志位置1*/
while(s!=NULL)
{
if(((s->addr)+(s->size))==(pr->addr)) /*有下邻又有上邻*/
{
s->size+=pr->size;
k=sub;
while(k->link!=r) k=k->link;
k->link=k->link->link;
isup=1; /*上邻标志位置1*/
break;
}
else
{s=s->link; isup=0;} /*上邻标志位置0*/
}
if(isup==0) /*有下邻无上邻*/
{
r->addr=pr->addr;
r->size=pr->size;
}
break;
}
else
{r=r->link; isdown=0;} /*下邻标志位置0*/
}
if(isdown==0) /*区域无下邻*/
{
s=sub;
while(s!=NULL)
{
if(((s->addr)+(s->size))==(pr->addr)) /*无下邻但有上邻*/
{
s->size+=pr->size;
isup=1; /*上邻标志位置1*/
break;
}
else
{ s=s->link; isup=0;} /*上邻标志位置0*/
}
if(isup==0) /*无下邻且无上邻*/
{
k=getsub(SUB); /*重新生成一个新的分区结点*/
strcpy(k->name,pr->name);
k->addr=pr->addr;
k->size=pr->size;
k->state='n';
r=sub;
while(r!=NULL)
{
if((r->addr)>(k->addr)) /*按分区首地址排列,回收区域插在合适的位置*/
{
if(r==sub) /*第一个空闲分区首址大于回收区域的情况*/
{ k->link=r; sub->link=k; }
else
{
s=sub;
while(s->link!=r) s=s->link;
k->link=r;
s->link=k;
}
break;
}
else r=r->link;
}
if(r==NULL) /*所有空闲分区的首址都大于回收区域首址的情况*/
{
s=sub;
while(s->link!=NULL) s=s->link;
s->link=k;
k->link=NULL;
}
}
}
printf("\n区域%s己回收.",pr->name);
}
//--------------------------------------------------------------------------
void print()
{
printf("\n\n\n\n");
printf("\t\t\t=================================\n");
printf("\t\t\t实验三:主存空间的分配与回收演示\n");
printf("\t\t\t=================================\n\n\n");
printf("\t\t\t班级:06级软件工程2班\n");
printf("\t\t\t姓名:李海云\n");
printf("\t\t\t学号:3106006958\n");
printf("\n\n\n");
printf("\t\t\t按任意键进入演示...");
getch();
system("cls");
}
void init()
{
printf("\t\t===================================\n");
printf("\t\t\t 1. 显示空闲分区 \n");
printf("\t\t\t 2. 分配作业 \n");
printf("\t\t\t 3. 回收作业 \n");
printf("\t\t\t 0. 返回菜单 \n");
printf("\t\t===================================\n\n\n");
printf("\t\t\t请选择你要的操作:");
}
void firstfitf() //首次适应算法
{
init();
switch(getchar())
{
case '1':
system("cls");
disp();
getch();
system("cls");
firstfitf();
break;
case '2':
system("cls");
system("cls");
input();
printf("\n");
while(num!=0)
{
p=ready;
ready=p->link;
p->link=NULL;
firstfit(p);
num--;
}
getch();
printf("\n\t\t 完成分配后的空闲分区表 \n");
disp();
printf("\n\t\t 已分配作业表 \n");
disp2();
if(is==0)
printf("\n 全部作业已经被分配内存.");
else printf("\n 作业没有全部被分配内存.\n");
getch();
system("cls");
firstfitf();
break;
case '3':
system("cls");
disp2();
printf("\n\n按任意键进行区域回收.");
printf("\n");
while(as!=NULL)
{
getch();
input2();
printf("按任意键继续...");
getch();
printf("\n");
reclfirst(q);
getch();
printf("\n\t\t 回收后的空闲分区表 \n");
disp();
printf("\n\t\t 已分配作业表 \n");
disp2();
printf("\n继续回收...(Enter)");
}
printf("\n所有已分配作业已完成!");
printf("\nPress any key to return...");
getch();
system("cls");
firstfitf();
break;
case '0':
break;
default:
getch();
system("cls");
firstfitf();
break;
}
}
void cyclefirstf() //循环首次适应算法
{
init();
switch(getchar())
{
case '1':
system("cls");
disp();
getch();
system("cls");
cyclefirstf();
break;
case '2':
system("cls");
cur=sub;
input();
printf("\n");
while(num!=0)
{
p=ready;
ready=p->link;
p->link=NULL;
cyclefit(p);
num--;
}
getch();
printf("\n\t\t 完成分配后的空闲分区表 \n");
disp();
printf("\n\t\t 已分配作业表 \n");
disp2();
if(is==0)
printf("\n 全部作业已经被分配内存.");
else printf("\n 作业没有全部被分配内存.\n");
getch();
system("cls");
cyclefirstf();
break;
case '3':
system("cls");
disp2();
printf("\n\n按任意键进行区域回收.");
while(as!=NULL)
{
getch();
printf("\n");
input2();
printf("按任意键继续...");
getch();
printf("\n");
reclfirst(q);
getch();
printf("\n\t\t 回收后的空闲分区表 \n");
disp();
printf("\n\t\t 已分配作业表 \n");
disp2();
printf("\n继续回收...(Enter)");
}
printf("\n所有已分配作业已完成!");
getch();
system("cls");
cyclefirstf();
break;
case '0':
break;
default:
getch();
system("cls");
cyclefirstf();
break;
}
}
void perfitf()
{
init();
switch(getchar())
{
case '1':
system("cls");
less_to_more();
disp();
getch();
system("cls");
perfitf();
break;
case '2':
system("cls");
cur=sub;
input();
printf("\n");
while(num!=0)
{
p=ready;
ready=p->link;
p->link=NULL;
less_to_more(); /*重新排列分区,按从小到大排列*/
perfit(p);
num--;
}
getch();
printf("\n\n\t\t 完成分配后分区表(分区按由小到达排列) \n");
disp();
printf("\n\t\t 已分配作业表 \n");
disp2();
if(is==0)
printf("\n 全部作业已经被分配内存.");
else printf("\n 作业没有全部被分配内存.\n");
getch();
system("cls");
perfitf();
break;
case '3':
system("cls");
disp2();
printf("\n\n按任意键进行区域回收.");
while(as!=NULL)
{
getch();
printf("\n");
input2();
printf("按任意键继续...");
getch();
printf("\n");
reclperfit(q);
getch();
printf("\n\t\t 回收后的空闲分区表 \n");
disp();
printf("\n\t\t 已分配作业表 \n");
disp2();
printf("\n继续回收...(Enter)");
}
printf("\n所有已分配作业已完成!");
getch();
system("cls");
perfitf();
break;
case '0':
break;
default:
getch();
system("cls");
perfitf();
break;
}
}
//--------------------------------------------------------------------------
void menu() /*菜单函数*/
{
//int i;
printf("\n\n\n\t\t\t==========================\n");
printf("\t\t\t主存空间的分配与回收演示\n");
printf("\t\t\t==========================\n");;
printf("\t\t\t\n\n");
printf("\t\t\t 1. 首次适应算法 \n");
printf("\t\t\t 2. 循环首次适应算法 \n");
printf("\t\t\t 3. 最佳适应算法 \n");
printf("\t\t\t 0. 退出 \n");
printf("\t\t\t请选择你要的操作:");
switch(getchar())
{
case '1':
system("cls");
firstfitf();
getch();
system("cls");
menu();
break;
case '2':
system("cls");
cyclefirstf();
getch();
system("cls");
menu();
break;
case '3':
system("cls");
perfitf();
getch();
system("cls");
menu();
break;
case '0':
break;
default:
getch();
system("cls");
menu();
break;
}
}
//--------------------------------------------------------------------------
void main() /*主函数*/
{
init_sub();
print();
menu();
}
//--------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -