if(H2&&H2->IsUse==0) //后接分区为空闲
{ if(H2->next==NULL) //判断后接分区是否为尾结点
{ H1->Par_Size+=H2->Par_Size; //把H2合并到H1
H1->next=NULL;
free(H2); printf(\已回收%d大小内存\ }else //后分区不为空闲,表示已经被使用
{ H1->Par_Size+=H2->Par_Size; H1->next=H2->next;
H2->next->pri=H1; free(H2);
printf(\已回收%d大小内存\
}
}
if(H3&&H3->IsUse==0)
//前分区为空闲分区,则合并去前分区 { H3->Par_Size+=H1->Par_Size; H3->next=H1->next; if(H1->next!=NULL)
//若H1为尾结点
H1->next->pri=H3; free(H1);
printf(\已回收%d大小内存\
}
}
return list; }
void Print( Partition *list, Partition *FP) { //输出已分配分区和空闲分区 Partition *H1,*H2; H1=list->next; H2=FP;
H2=H2->next;
printf(\ printf(\总分配分区表*******************\\n\ printf(\分区序号 大小 开始地址状态\\n\
while(H1) { printf(\
%d %d\
if(H1->IsUse==1) printf(\已分配\\n\
else
26
printf(\空表目\\n\
H1=H1->next; }
printf(\
}
void Main_Print( Partition *list, Partition *FP) { //主入口函数,进行菜单选择 int op; while(1) { printf(\主菜单------------------------\\n\ printf(\
printf(\申请新的作业,分配内存\\n\ printf(\结束作业,回收内存\\n\ printf(\查看内存表\\n\ printf(\退出系统\\n\ printf(\请选择<1-4>:\ scanf(\ switch(op) //根据输入,选择分支方向
{ case 1:
New_Process(list,FP); break; case 2: Reclaim(list,FP); break; case 3:
Print(list,FP); break; case 4:
break; default: printf(\选择错误,请重新选择!\ break; }
if(op==4) break;
//退出循环
}
}
void main()
{ //主函数入口
struct Partition *list,*FP; list=Int();
FP=InitFP();
27
Main_Print(list,FP);
}
程序运行结果及分析
28
实验感想:
通过本实验,加深了对动态分区分配、回收程序的功能和具体实现,特别是对回收分区的合
并的理解。
实验五:模拟使用银行家算法判断系统的状态
实验目的:
了解进程管理的实现方法,理解和掌握处理进程同步问题的方法。
实验内容:
实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算
法。
实验步骤:
?
理解安全性算法和银行家算法的核心机制:
? 理解进程的三状态调度过程,及各状态间的转换关系; ? 设计读者--写者问题的写者优先算法;
实验代码:
#include
int no1; //进程数 int no2; //资源数 int r;
int allocation[m][m],need[m][m],available[m],max[m][m];
char name1[m],name2[m]; //定义全局变量 void main() {
29
void check();
void print(); int i,j,p=0,q=0; char c;
int request[m],allocation1[m][m],need1[m][m],available1[m];
printf(\银行家算法--------------------\\n\
printf(\请输入进程总数:\ scanf(\ printf(\请输入资源种类数:\ scanf(\
printf(\请输入最大需求矩阵:\\n\
for(i=0;i for(i=0;i print(); //输出已知条件 check(); //检测T0时刻已知条件的安全状态 if(r==1) //如果安全则执行以下代码 { do{ q=0; for(i=0;i for(i=0;i p=0; printf(\请输入请求资源的进程号(0~4):\\n\ for(j=0;j<=10;j++) { scanf(\ if(i>=no1) { printf(\输入错误,请重新输入:\\n\ 30