PCB[RUN].status='W'; //插入链尾 link[TAIL]=RUN; link[RUN]=-1; TAIL=RUN; RUN=HEAD;//链首进程开始运行 HEAD=link[HEAD]; PCB[RUN].status='R'; } } } showit(); } //主函数 int main() { long algo; srand(time(NULL)); algo = ChooseAlgo(); if (algo == 1) { main_priority();//优先数法 } else { main_round_robin();//简单轮转法 } printf(\return 0; } 实验体会:
通过写代码的过程更加清晰地了解了两种算法的思想和用处,对算法的了解加深的同事也锻炼了写代码的能力。
《计算机操作系统》实验二报告
实验二 题目 : 死锁观察与避免 姓名 : 余果 学号 :14122602
实验环境 : Linux Ubuntu系统 实验目的 :
1、目的
死锁会引起计算机工作僵死,造成整个系统瘫痪。因此,死锁现象是操作系统特别是大型系统中必须设法防止的。学生应独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效的防止死锁的发生。通过实习,更直观地了解死锁的起因,初步掌握防止死锁的简单方法,加深理解课堂上讲授过的知识。 2、要求
(1) 设计一个 n 个并发进程共享 m 个系统资源的系统。进程可动态地申请资源和释放资源。系统按各进程的申请动态地分配资源。
(2) 系统应能显示各进程申请和释放资源以及系统动态分配资源的过程,便于用户观察和分析。
(3) 系统应能选择是否采用防止死锁算法或选用何种防止算法(如有多种算法)。在不采用防止算法时观察死锁现象的发生过程。在使用防止死锁算法时,了解在同样申请条件下,防止死锁的过程。
实验内容 :
1、题目
本示例采用银行算法防止死锁的发生。假设有三个并发进程共享十个系统。在三个进程申请的系统资源之和不超过 10 时,当然不可能发生死锁,因为各个进程申请的资源都能满足。在有一个进程申请的系统资源数超过 10 时,必然会发生死锁。应该排除这二种情况。程序采用人工输入各进程的申请资源序列。如果随机给各进程分配资源,就可能发生死锁,这也就是不采用防止死锁算法的情况。假如,按照一定的规则,为各进程分配资源,就可以防止死锁的发生。示例中采用了银行算法。这是一种犹如“瞎子爬山”的方法,即探索一步,前进一步,行不通,再往其他方向试探,直至爬上山顶。这种方法是比较保守的。所花的代价也不小。 2、代码
#include
struct Process{
int Had[15]; int Max[15]; int Need[15];
bool IsEnd;}Processes[15]; int curProcess; int Req[15];
Process tmpProcesses[15]; bool IsEnd(){
bool R = true;
for(int i = 0;i bool IstmpEnd(){ bool R = true; for(int i = 0;i bool Legal= false; bool Banker(){ Legal = true; for(int i = 0;i for(int i = 0;i int tmp[15]; for(int i = 0;i tmp[i] = Res[i]; } for(int i = 0;i for(int i = 0;i }while(!IstmpEnd() && IsFind == true); for(int i = 0;i if(tmpProcesses[i].IsEnd == false){ Legal = false; break;} } return Legal; } int main() { memset(Processes,0,sizeof(Processes)); memset(Res,0,sizeof(Res)); memset(Req,0,sizeof(Req)); cin>>n>>m; for(int i = 0;i for(int i = 0;i int option = -1; cin>>option; if(option == 0){ do{ for(int i = 0;i cin>>curProcess; for(int i = 0;i