欢迎来到天天文库
浏览记录
ID:45033713
大小:275.16 KB
页数:11页
时间:2019-11-08
《非抢占式动态优先算法进程调度实验》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用文档实验:进程调度算法一、实验目的:用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。二、实验要求:用C++语言实验对N个进程采用非抢占式的动态优先权优先算法的进程调度三、实验内容:(1)设计一个有N个进程并发的进程调度程序。进程调度算法:采用非抢占式最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)算法。(2)每个进程有一个进程控制块(PCB)表示。PCB用结构来描述,包括以下字段:l进程标识ID、l优先数、l到达时间、l需要运行时间、l已用CPU时间l进程阻塞时间startblock(表示进程在运行startblock个时间片后,进程将进入阻塞状
2、态),l进程被阻塞的时间blocktime(表示进程等待blocktime个时间片后,将转换成就绪状态),l进程状态state,就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态l队列指针next等等。进程的PCB中的数据需要程序员初始化给定。(3)优先数改变的规则进程在就绪对列中呆一个时间片,优先数增加1;进程每运行一个时间片,优先数减1;(4)运行过程描述首先按照初始化输入,按照各进程优先级高低排列就绪队列中进程的顺序,优先级最高的进程最先获得CPU控制权运行。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的
3、已占用CPU时间还未达所需要的运行时间,此时应将进程的优先数减1(即降低一级),如果到了进程阻塞的时间,阻塞进程,然后把它插入阻塞队列,等待经过blocktime后,再唤醒进程,把它按照优先级高低,插入就绪队列相应位置等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。实用文档重复以上过程,直到所要进程都完成为止。五、流程图进程完成,撤消该进程就绪队列首进程投入运行时间片到,运行进程已占用CPU时间+1运行进程已占用CPU时间已达到所需的运行时间把运行进程插入到下一个队列的队尾插入新的进程开始初始化PCB,输入进程信息所有队列都为空各进程按FCFS
4、原则排队等待调度退出程序是是实用文档六、结果过程及截图初始化队列输入所有进程后的进程信息如下:实用文档按Y键继续运行进程:按Y键继续运行进程:实用文档运行若干次后的状态:添加新的进程:实用文档七、所遇困难的解决以及心得体会在这个多级反馈的实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还有一个标志位Fend用来表明新插入的队列的位置。虽然实验原理很简单,但是在编写代码的过程中遇到了不少的问题,在两个小时之内已经完成的大体代码的编写,但是之中存在不少的问题,导致了用了差不多四个小时的时间去调试才把它弄好,这主要归咎于
5、在开始设计代码的不太合理,在后期使得代码结构有些混乱,使得调试更加的麻烦,以及对编程的不熟悉。通过这个实验不仅使我对进程的调度算法有了更深的认识,使得理论知识得到的实践,也使我的编程能力得到了进一步提高。八、源代码#include#include#include#definegetpch(type)(type*)malloc(sizeof(type))#defineNULL0#defineTIME2//时间片长度typedefstructpcb{//进程管理块charname[10];//进程名字charstate;//进程状态实用文档
6、intqueue;//进程所在的队列intntime;//进程需要运行的时间intrtime;//进程已经运行的时间intetime;//进程在本队列可运行的时间片structpcb*link;}PCB;PCB*ready=NULL,*pinsert=NULL,*pfend=NULL,*p=NULL;//就绪队列,进程插入位置的变量intgeti()//使用户仅能输入整数{charch;inti=0;fflush(stdin);ch=getchar();while(ch==''){printf("tf输入不能为空..请重新输入");fflush(stdin);ch=getchar(
7、);}while(ch!=''){if(ch>'9'
8、
9、ch<'0'){printf("t输入有误!!输入只能为正整数,请重新输入...");fflush(stdin);i=0;ch=getchar();}else{i=i*10+(ch-'0');ch=getchar();}}returni;}voidfindpos()//更新状态量{PCB*ps=pfend;if(!ps
10、
11、!ps->link
12、
13、
此文档下载收益归作者所有