1中国地质大学(北京)计算机操作系统实验报告姓名李萌专业班级10041311学号1004131112指导老师郑春梅成绩实验时间2016/4/23–2016/6/12内容摘要:为了提高本专业学生专业素养,加深对操作系统知识的理解,对算法思想更熟练的应用,由指导教师提供参考题目与学生自主命题相结合的办法选定了以下课程设计题目:1.编制银行家算法通用程序2.处理机管理3.存储器管理采用可变式分区管理4.LRU与改进型的CLOCK算法5.磁盘调度算法在指导教师的指导下,各个学生独立完成课题分析、设计、代码编写和调试,独立撰写课程设计报告。所有工作任务主要在微机实验室完成。关键词:操作系统;课程设计3目录目录内容摘要:........................................................................................................................................2目录..................................................................................................................................................3实验一编制银行家算法通用程序...............................................................................................4实验二处理机管理.....................................................................................................................11实验三存储器管理采用可变式分区管理.................................................................................20实验四LRU与改进型的CLOCK算法....................................................................................31实验五磁盘调度算法.................................................................................................................384实验一编制银行家算法通用程序(1)需求分析编制银行家算法通用程序,并检测所给状态的系统安全性。假定系统的任何一种资源在任一时刻只能被一个进程使用。任何进程已经占用的资源只能由进程自己释放,而不能由其它进程抢占。进程申请的资源不能满足时,必须等待。设计的要求:(1)程序中使用的数据结构及主要符号说明;(2)资源的种类和数目可以变化的(3)进程可以任意的顺序创建和变化(2)概要设计:5所用到的结构体:typedefstruct{intA;intB;intC;}RESOURCE//最大需求矩阵RESOURCEMax[MAX_PROCESSES_NUMBER];//已分配资源数矩阵RESOURCEAllocation[MAX_PROCESSES_NUMBER];//需求矩阵RESOURCENeed[MAX_PROCESSES_NUMBER];6//可用资源向量RESOURCEAvailable={3,3,2};intsafe[MAX_PROCESSES_NUMBER];//用于存放安全序列(3)详细设计:(3)-1安全检查函数//安全性检查boolSafeCheck(intprocessNumber){RESOURCEWork=Available;bool*Finish=newbool[processNumber];//boolFinish[5]={false,false,false,false,false};inti;intj=0;for(i=0;iprocessNumber;i++){Finish[i]=false;}for(i=0;iprocessNumber;i++){//是否已检查过if(Finish[i]==false){//是否有足够的资源分配给该进程if(Need[i].A=Work.A&&Need[i].B=Work.B&&Need[i].C=Work.C){//有则使其执行完成,并将已分配给该进程的资源全部回收Work.A+=Allocation[i].A;Work.B+=Allocation[i].B;Work.C+=Allocation[i].C;Finish[i]=true;safe[j++]=i;i=-1;//重新进行遍历}}}//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态for(i=0;iprocessNumber;i++){7if(Finish[i]==false){returnfalse;}}returntrue;}(3)-2资源分配请求函数//资源分配请求boolrequest(intprocess,RESOURCE*res,intprocessNumber){//request向量需小于Need矩阵中对应的向量if(res-A=Need[process].A&&res-B=Need[process].B&&res-C=Need[process].C){//request向量需小于Available向量if(res-A=Available.A&&res-B=Available.B&&res-C=Available.C){//试探分配ProbeAlloc(process,res);//如果安全检查成立,则请求成功,否则将分配回滚并返回失败if(SafeCheck(processNumber)){returntrue;}else{printf(安全性检查失败。原因:系统将进入不安全状态,有可能引起死锁。\n);printf(正在回滚...\n);RollBack(process,res);}}else{printf(安全性检查失败。原因:请求向量大于可利用资源向量。\n);}}else{printf(安全性检查失败。原因:请求向量大于需求向量。\n);}returnfalse;8}(3)-3试探分配函数//试探分配voidProbeAlloc(intprocess,RESOURCE*res){Available.A-=res-A;Available.B-=res-B;Available.C-=res-C;Allocation[process].A+=res-A;Allocation[process].B+=res-B;Allocation[process].C+=res-C;Need[process].A-=res-A;Need[process].B-=res-B;Need[process].C-=res-C;}//若试探分配后进入不安全状态,将分配回滚voidRollBack(intprocess,RESOURCE*res){Available.A+=res-A;Available.B+=res-B;Available.C+=res-C;Allocation[process].A-=res-A;Allocation[process].B-=res-B;Allocation[process].C-=res-C;Need[process].A+=res-A;Need[process].B+=res-B;Need[process].C+=res-C;}(4)调试分析:测试数据:53327539322902222433010200302211002测试结果截图:10(5)结论和展望:在设计合适的数据结构时遇到了一些阻碍,但最终还是敲定了代码中的结构体,程序得以完成。本次实验不仅让我对银行家算法有了更深入的理解,并且还让我的编程能力得到了提高,希望能有更多这样的机会,借此较好的锻炼自己,从而更好的掌握和运用自己的专业知识,提高能力水平。(6)主要参考文献。11计算机操作系统第三版西安电子科技大学出版社汤子瀛主编实验二处理机管理(1)需求分析设计程序模拟进程的轮转法调度过程。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法、高响应比优先(HRRN)进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。《操作系统》课程实验教学大纲《程序要求如下:《操作系统》课程实验教学大纲《操名称(1)输出系统中进程的调度次序;《(2)计算CPU利用率。《操作(2)概要设计:12开始当前作业为依编号找到第一个还没执行的作业当前作业是最后一个作业和下一个还没执行的作业比较返回这一次要执行的作业当前作业取较早到达且相应比较高的一个YN当前在上次作业被执行完之前到达同时到达当前作业取相应比较高的一个当前作业取较早到达的一个YNYNHRN数据结构:structProcess{charname[100];doublearriveTime;//到达时间13doubleserveTime;//要求服务时间doublewaitTime;//HRRN算法等待时间doublepriority;//优先级boolisFinish;//是否完成};(3)详细设计:(3)-1所使用变量intnumOfAliveProcess;intsliceOfTime;//时间片doublecountTimes=0;//全局时间片计数stringnameOfProcess[1000];//存放进程调度次序intcountDispatch=0;//调度下标doublemaxWaitTime=0;//用于计算cpu利用率(3)-2排序函数voidsortByArriveTime(Process*pro,intn)//按照进程到达的顺序升序排列{Processtemp;for(inti=0;in-1;i++){for(intj=i+1;jn;j++){if(pro[j].arriveTimepro[i].arriveTime){temp=pro[i];pro[i]=pro[j];pro[j]=temp;}}}}(3)-3响应比计算函数voidgetPriority(Process*pro,intn,doublerelativeTime)//计算响应比函数{inti;//该作业等待时间=最后一个的提交时间-该作业到达的时刻for(i=0;in;++i){pro[i].waitTime=relativeTime-pro[i].arriveTime;}14//响应比为(等待时间+要求服务时间)\要求服务时间=等待时间/要求服务时间+1for(i=0;in;++i){pro[i].priority=(pro[i].waitTime/pro[i].serveTime)+1;}}(3)-4主函数中的关键逻辑while(!areAllFinish(process,n)){nameOfProcess[countDispatch]=process[0].name;++countDispatch;if(process[0].serveTime=copayOfSlice)//如果当前被处理的进程要求服务的时间小于时间片大小{process[0].isFinish=true;//进程运行完毕process[0].arriveTime=relativeTime;relativeTime+=copay