您好,欢迎访问三七文档
学号:操作系统实验报告20~20学年春季学期学院:专业班级:姓名:实验成绩:评阅教师:评阅日期:实验1进程调度模拟实验一.实验目的1.理解进程的概念,熟悉进程的组成;2.用高级语言编写和调试一个进程调度程序,以加深对进程调度算法的理解。二.实验准备1.几种进程调度算法短进程优先调度算法高优先权优先调度算法先来先服务调度算法基于时间片的轮转调度算法2.进程的组成进程控制块(PCB)程序段数据段3.进程的基本状态就绪W(Wait)执行R(Run)阻塞B(Block)三.实验内容编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等。算法流程图:四.源代码:#includestdio.h#includestdlib.h#includeconio.h#definegetpch(type)(type*)malloc(sizeof(type))#defineNULL0structpcb{/*定义进程控制块PCB*/charname[10];charstate;intsuper;intntime;intrtime;structpcb*link;}*ready=NULL,*p;typedefstructpcbPCB;voidsort()/*建立对进程进行优先级排列函数*/{PCB*first,*second;intinsert=0;if((ready==NULL)||((p-super)(ready-super)))/*优先级最大者,插入队首*/{p-link=ready;ready=p;}else/*进程比较优先级,插入适当的位置中*/{first=ready;second=first-link;while(second!=NULL){if((p-super)(second-super))/*若插入进程比当前进程优先数大,*/{/*插入到当前进程前面*/p-link=second;first-link=p;second=NULL;insert=1;}else/*插入进程优先数最低,则插入到队尾*/{first=first-link;second=second-link;}}if(insert==0)first-link=p;}}voidinput()/*建立进程控制块函数*/{inti;system(cls);/*清屏*/printf(\n请输入五个进程信息:\n);for(i=0;i5;i++){printf(\n进程号No.%d:\n,i);p=getpch(PCB);printf(\n输入进程名:);scanf(%s,p-name);printf(\n输入进程优先数:);scanf(%d,&p-super);printf(\n输入进程运行时间:);scanf(%d,&p-ntime);printf(\n);p-rtime=0;p-state='w';p-link=NULL;sort();/*调用sort函数*/}}//计算进程控制块的个数intspace(){intl=0;PCB*pr=ready;while(pr!=NULL){l++;pr=pr-link;}return(l);}voiddisp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/{printf(\nqname\tstate\tsuper\tndtime\truntime\n);printf(|%s\t,pr-name);printf(|%c\t,pr-state);printf(|%d\t,pr-super);printf(|%d\t,pr-ntime);printf(|%d\t,pr-rtime);printf(\n);}voidcheck()/*建立进程查看函数*/{PCB*pr;printf(\n****当前正在运行的进程是:%s,p-name);/*显示当前运行进程*/disp(p);pr=ready;printf(\n****当前就绪队列状态为:\n);/*显示就绪队列状态*/while(pr!=NULL){disp(pr);pr=pr-link;}}voiddestroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/{printf(\n进程[%s]已完成.\n,p-name);free(p);}voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态*/{(p-rtime)++;if(p-rtime==p-ntime)destroy();/*调用destroy函数*/else{(p-super)--;p-state='w';sort();/*调用sort函数*/}}voidyouxian(){intlen,h=0;charch;system(cls);input();//高优先级优先算法的程序入口len=space();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf(\nTheexecutenumber:%d\n,h);p=ready;ready=p-link;p-link=NULL;p-state='R';check();running();printf(\n按任一键继续......);}printf(\n\n进程已经完成.\n);ch=getchar();}//菜单voidmenu(){intm;system(cls);printf(\t\t\t\t进程调度\n);printf(\n\n\n\t\t\t1.演示最高优先数优先算法.);printf(\n\t\t\t0.退出程序.);printf(\n\n\t\t\t\t选择进程调度方法:);scanf(%d,&m);switch(m){case1:youxian();//高优先级优先算法的程序入口system(cls);menu();break;case0:system(cls);break;default:system(cls);menu();}}main()/*主函数*/{menu();}五.运行截图:实验2银行家算法模拟实验一.实验目的1.理解死锁的概念;2.用高级语言编写和调试一个银行家算法程序,以加深对死锁的理解。二.实验准备1.产生死锁的原因竞争资源引起的死锁进程推进顺序不当引起死锁2.产生死锁的必要条件互斥条件请求和保持条件不剥夺条件环路等待条件3.处理死锁的基本方法预防死锁避免死锁检测死锁解除死锁三.实验内容设计五个进程{a,b,c,d,e}共享三类资源{A,B,C}的系统,{A,B,C}的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。四.源代码#includeiostream.h#includestring.h#defineM3//资源的种类数#defineN5//进程的个数voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);//统一的输出格式boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);voidmain(){inti,j;//当前可用每类资源的资源数intiAvailable[M]={3,3,2};//系统中N个进程中的每一个进程对M类资源的最大需求intiMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//iNeed[N][M]每一个进程尚需的各类资源数//iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数intiNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//进程名charcName[N]={'a','b','c','d','e'};boolbExitFlag=true;//退出标记charch;//接收选择是否继续提出申请时传进来的值boolbSafe;//存放安全与否的标志//计算iNeed[N][M]的值for(i=0;iN;i++)for(j=0;jM;j++)iNeed[i][j]=iMax[i][j]-iAllocation[i][j];//输出初始值output(iMax,iAllocation,iNeed,iAvailable,cName);//判断当前状态是否安全bSafe=safety(iAllocation,iNeed,iAvailable,cName);//是否继续提出申请while(bExitFlag){cout\n继续提出申请?\ny为是;n为否。\n;cinch;switch(ch){case'y'://cout调用银行家算法;bSafe=banker(iAllocation,iNeed,iAvailable,cName);if(bSafe)//安全,则输出变化后的数据output(iMax,iAllocation,iNeed,iAvailable,cName);break;case'n':cout退出。\n;bExitFlag=false;break;default:cout输入有误,请重新输入:\n;}}}//输出voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){inti,j;cout\n\tMax\tAllocation\tNeed\tAvailableendl;cout\tABC\tABC\tABC\tABCendl;for(i=0;iN;i++){coutcName[i]\t;for(j=0;jM;j++)coutiMax[i][j];cout\t;for(j=0;jM;j++)coutiAllocation[i][j];cout\t;for(j=0;jM;j++)coutiNeed[i][j];cout\t;cout;//Available只需要输出一次if(i==0)for(j=0;jM;j++)coutiAvailable[j];coutendl;}}//安全性算法,进行安全性检查;安全返回true,并且输出安全序列,不安全返回false,并输出不安全的提示;boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){inti,j,flag,x=0;charName[N];intWork[M];boolFinish[N];for(j=0;jM;j++)Work[j]=iAvailable[j];for(i=0;iN;i++)Finish[i]
本文标题:操作系统实验报告
链接地址:https://www.777doc.com/doc-7224227 .html