printf(\所申请资源已大过系统所拥有的,请重新输入!\\n\
return list; }
Partition *Reclaim( Partition *list, Partition *FP) { //结束作业,资源回收,No为作业名,回收内存
Partition * H1,*H2,*H3,*HF;//H1为释放区,H2为后分区,H3为前分区 int No; //作业名 H1=list;
HF=FP;//可有可无? H1=H1->next;
HF=FP->next;
printf(\请输入您想结束的作业名:\ scanf(\
while(HF)//对已分配表进行操作 { if(HF->Par_No==No) { HF->IsUse=0; //标志为空表目
break;//这时保存着HF所指分区的信息
}
HF=HF->next;
}
if(!HF) //如果找不到该作业,则提示出错 printf(\所输入的作业名称不正确,请重新输入!\ else{ while(H1)//对空闲表进行操作 { if(H1->Par_No==No) { H1->IsUse=0; //标志为空表目 printf(\内存回收成功\
break;
}
H1=H1->next;
}
H2=H1->next;//后分区 H3=H1->pri;//前分区
if(H2&&H2->IsUse==0) //后接分区为空闲 { if(H2->next==NULL) //判断后接分区是否为尾结点 { H1->Par_Size+=H2->Par_Size; //把H2合并到H1
H1->next=NULL;
free(H2);
21
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 printf(\空表目\\n\ H1=H1->next;
}
printf(\
}
void Main_Print( Partition *list, Partition *FP) { //主入口函数,进行菜单选择
22
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(); Main_Print(list,FP);
}
23
程序运行结果及分析
24
实验五:模拟使用银行家算法判断系统的状态
实验目的:
了解进程管理的实现方法,理解和掌握处理进程同步问题的方法。
实验内容:
实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算
法。
实验步骤:
?
理解安全性算法和银行家算法的核心机制:
? 理解进程的三状态调度过程,及各状态间的转换关系; ? 设计读者--写者问题的写者优先算法;
实验代码:
#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() {
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(\
25