操作系统实验(进程调度存储管理磁盘调度银行家算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验三进程调度一、实验目的多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。二、实验要求1.设计进程调度算法,进程数不定2.包含几种调度算法,并加以实现3.输出进程的调度过程——进程的状态、链表等。三、参考例1.题目——优先权法、轮转法简化假设1)进程为计算型的(无I/O)2)进程状态:ready、running、finish3)进程需要的CPU时间以时间片为单位确定2.算法描述1)优先权法——动态优先权当前运行进程用完时间片后,其优先权减去一个常数。2)轮转法四、实验流程图开始键盘输入进程数n,和调度方法的选择优先权法?轮转法产生n个进程,对每个进程产生一个PCB,并用随机数产生进程的优先权及进程所需的CPU时间按优先权大小,把n个进程拉成一个就绪队列初始化其他数据结构区链首进程投入运行时间片到,进程所需的CPU时间减1,优先权减3,输出个进程的运行情况所需的CPU时间=0?撤销进程就绪队列为空?结束将进程插入就绪队列NYNYYBN注意:1.产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。2.进程数n不要太大通常取4~8个3.使用动态数据结构4.独立编程5.至少三种调度算法6.若有可能请在图形方式下,将PCB的调度用图形成动画显示。五.实验过程:(1)输入:进程流文件(1.txt),其中存储的是一系列要执行的进程,每个作业包括四个数据项:进程名进程状态(1就绪2等待3运行)所需时间优先数(0级最高)进程01502进程12104进程21150进程33285进程42191进程5387输出:进程执行流等待时间,平均等待时间本程序包括:FIFO算法,优先数调度算法,时间片轮转调度算法产生n个进程,对每个进程用随机数产生进程的轮转时间片数及进程所需的时间片数,已占用CPU的时间片数置为0按进程产生的先后次序拉成就绪队列链链首进程投入运行时间片到,进程所需时间片数减1,已占用CPU时间片数加1输出各进程的运行情况进程所需时间片数=0?撤销该进程就绪队列为空吗?占用CPU的时间片数=轮转时间片数?占用CPU的时间片数置为0把该进程插入就绪队列尾BNYNYY结束N(2)程序代码#includestdio.h#includestring.h#includeiostream.hconstintblock_time=10;//定义时间片的长度为10秒constintMAXPCB=100;//定义最大进程数//定义进程结构体typedefstructnode{charname[20];intstatus;inttime;intprivilege;intfinished;intwait_time;}pcb;pcbpcbs[MAXPCB];intquantity;//初始化函数voidinitial(){inti;for(i=0;iMAXPCB;i++){strcpy(pcbs[i].name,);pcbs[i].status=0;pcbs[i].time=0;pcbs[i].privilege=0;pcbs[i].finished=0;pcbs[i].wait_time=0;}quantity=0;}//读数据函数intreadData(){FILE*fp;charfname[20];inti;cout请输入进程流文件名:;cinfname;if((fp=fopen(fname,r))==NULL){cout错误,文件打不开,请检查文件名endl;}else{while(!feof(fp)){fscanf(fp,%s%d%d%d,pcbs[quantity].name,&pcbs[quantity].status,&pcbs[quantity].time,&pcbs[quantity].privilege);quantity++;}//输出所读入的数据cout输出所读入的数据endl;cout进程名进程状态所需时间优先数endl;for(i=0;iquantity;i++){coutpcbs[i].namepcbs[i].statuspcbs[i].timepcbs[i].privilegeendl;}return(1);}return(0);}//重置数据,以供另一个算法使用voidinit(){inti;for(i=0;iMAXPCB;i++){pcbs[i].finished=0;pcbs[i].wait_time=0;}}//先进先出算法voidFIFO(){inti,j;inttotal;//输出FIFO算法执行流coutendl*****************************************************endl;coutFIFO算法执行流:endl;cout进程名等待时间endl;for(i=0;iquantity;i++){coutpcbs[i].namepcbs[i].wait_timeendl;for(j=i+1;jquantity;j++){pcbs[j].wait_time+=pcbs[i].time;}}total=0;for(i=0;iquantity;i++){total+=pcbs[i].wait_time;}cout总等待时间:total平均等待时间:total/quantityendl;}//优先数调度算法voidprivilege(){inti,j,p;intpassed_time=0;inttotal;intqueue[MAXPCB];intcurrent_privilege=1000;for(i=0;iquantity;i++){current_privilege=1000;for(j=0;jquantity;j++){if((pcbs[j].finished==0)&&(pcbs[j].privilegecurrent_privilege)){p=j;current_privilege=pcbs[j].privilege;}}queue[i]=p;pcbs[p].finished=1;pcbs[p].wait_time+=passed_time;passed_time+=pcbs[p].time;}//输出优先数调度执行流coutendl***********************************************************endl;cout优先数调度执行流:endl;cout进程名等待时间endl;for(i=0;iquantity;i++){coutpcbs[queue[i]].namepcbs[queue[i]].wait_timeendl;}total=0;for(i=0;iquantity;i++){total+=pcbs[i].wait_time;}cout总等待时间:total平均等待时间:total/quantityendl;}//时间片轮转调度算法voidtimer(){inti,j,number,flag=1;intpassed_time=0;intmax_time=0;intround=0;intqueue[1000];inttotal=0;while(flag==1){flag=0;number=0;for(i=0;iquantity;i++){if(pcbs[i].finished==0){number++;j=i;}}if(number==1){queue[total]=j;total++;pcbs[j].finished=1;}if(number1){for(i=0;iquantity;i++){if(pcbs[i].finished==0){flag=1;queue[total]=i;total++;if(pcbs[i].time=block_time*(round+1)){pcbs[i].finished=1;}}}}round++;}if(queue[total-1]==queue[total-2]){total--;}coutendl*******************************************************endl;cout时间片轮转调度执行流:endl;for(i=0;itotal;i++){coutpcbs[queue[i]].name;coutendl;}}//显示voidversion(){cout/*********************进程调度********************/;coutendlendl;}//主函数voidmain(){intflag;version();initial();flag=readData();if(flag==1){FIFO();init();privilege();init();timer();}}(3)运行结果:输入进程流文件名1.txt即可得出以下输出结果:实验二银行家算法一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。二、实验要求设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;三、数据结构1.可利用资源向量Available,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available(j)=k,标是系统中现有Rj类资源k个。2.最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。3.分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation(i,j)=k,表示进程i当前已经分到Rj类资源的数目为k。Allocationi表示进程i的分配向量,有矩阵Allocation的第i行构成。4.需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need(i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。Needi表示进程i的需求向量,由矩阵Need的第i行构成。上述三个矩阵间存在关系:Need(i,j)=Max(i,j)-Allocation(i,j);四、银行家算法Requesti是进程Pi的请求向量。Requesti(j)=k表示进程Pi请求分配Rj类资源k个。当Pi发出资源请求后,系统按下述步骤进行检查:1.如果Requesti≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。2.如果Requesti≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。3.系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-RequestiAllocationi=Allocationi+RequestiNeedi=Needi-Requesti4.系统执行安全性算法,检查此次资

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功