1、进程调度实验报告 操作系统进程调度实验报告 姓名: 何绍金 班级:自动化1202 学号:201203870408 指导教师: 张健 2014年10月10日 一实验题目编写采用简单轮转调度算法模拟进程调度程序。二. 实验内容1.实验要求(1)简单轮转算法的基本思想所有就绪程序进程按FCFS 排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU 的时间片相同。即将CPU 的处理时间划分成一个个相同的时间片,就绪队列的诸进程轮流运行一个时间片。当一个时间片结束时,如果正在运行的进程用完它的时间片后还未完成,就强迫该进程让出CPU,把它送回就绪队列的末尾,等待下一次的调度。同时,进程调度又去选
2、择就绪队列中的队首进程,分配给它一个时间片,以投入运行。直至所有的进程运行完毕。(2)实验分析a.设实验有六个进程,每个进程用一个进程控制块PCB 来代表。b.为每个进程任意确定一个要求运行的时间。c.按照进程输入的先后顺序排列成一个队列。再设一个队首指针指向第一个到达进程的首地址。d.执行处理机调度时,开始选择队首的第一个进程运行。另外,再设一个当前运行进程的指针,指向当前正在运行的进程。e.进程运行一次后,以后的调度则将当前指针下移一个位置,指向下一个进程。同时还应该判断进程的要求运行时间是否等于已运行时间。如果不等,则等待下一轮的运行,否则将该进程的状态置为完成态C,并退出循环队列。f.
3、如果就绪队列不空,则重复上述的d 和e 直到所有的进程都运行完。g.考虑到代码的可重用性,轮转法调度程序和最高优先级优先调度是调用同一个模块进行输出。h.在所设计的调度程序中,包含显示语句,显示每次选中的进程的名称及运行一次后队列的变化情况。i.实现流程图。三.实验流程图 2.程序源代码(C+语言) 按流程图编制的源代码如下所示:#include #include #include #include typedef struct node char name10; int prio; int round; int cputime; int ntime; int count; char stat
4、e; struct node *next; PCB; PCB *finish,*ready,*tail,*run; /队列指针int N; /进程数void firstin() run=ready; /就绪队列头指针赋值给运行头指针 run-state=R; /进程状态变为运行态 ready=ready-next; /就绪队列头指针后移到下一进程 /输出标题函数void prt1(char a) /优先级法 if(toupper(a)=P) cout endl; cout进程名占用CPU时间到完成还要的时间轮转时间片状态 endl; /进程PCB输出void prt2(char a,PCB *
5、q) if(toupper(a)=P) /优先级法的输出 coutname cputime ntime round statenext; p=finish; /输出完成队列的PCB while(p!=NULL) prt2(algo,p); p=p-next; getchar(); /按住任意键继续 void insert(PCB *q) /时间片轮转的插入算法 PCB *p1,*s,*r; s=q; /待插入的PCB指针 p1=ready; /就绪队列头指针 r=p1; /*r做pl的前驱指针 while(p1!=NULL) if(p1-roundround) r=p1; p1=p1-next
6、; if(r!=p1) r-next=s; s-next=p1; else s-next=p1; /否则插入在就绪队列的头 ready=s; void create(char alg) /优先级创建初 PCB *p; int i,time; char na10; ready=NULL; finish=NULL; run=NULL; cout输入进程名及其需要运行的时间:endl; for(i=1;ina; cintime; strcpy(p-name,na); p-cputime=0; p-ntime=time; p-state=W; p-round=0; if(ready!=NULL) in
7、sert(p); else p-next=ready; ready=p; cout输入进程名及其需要运行的时间:next; run-state=R; void timeslicecycle(char alg) while(run!=NULL) run-cputime=run-cputime+10; run-ntime=run-ntime-10; run-round=run-round+10; if(run-ntimenext=finish; finish=run; run-state=F; run=NULL; if(ready!=NULL) firstin(); else run-state=
8、W; insert(run); firstin(); prt(alg); 1/主函数void main() char algo=P; /算法标记 coutN; /输入进程数 create(algo); /创建进程 timeslicecycle(algo); 3.程序运行结果 运行程序得到如下结果: (1)输入进程数,并分别确定每个进程的要求运行时间。(2)数据输入完成后的初始状态,进程标识为x1的进程首先得到调度,运行10个时间单位。(3)进程标识为x1的进程运行完成,进程标识为x2的进程得到调度,从就绪态“W”改为运行态“R”,运行 10个时间单位。(4)进程标识为x2的进程运行完成,从运行
9、态“R”改为完成态“F”;进程标识为x3的进程得到调度,从就绪态“W”改为运行态“R”,运行 10个时间单位。(5)进程标识为x3的进程由于还未运行完被置于队末,等待下一次调度,从运行态“R”改为就绪态“W”;进程标识为x4的进程得到调度,从就绪态“W”改为运行态“R”,运行 10个时间单位。(6)进程标识为x4的进程运行完成,从运行态“R”改为完成态“F”;进程标识为x5的进程得到调度,从就绪态“W”改为运行态“R”,由于进程x4只用了5个单位时间,所以x5只运5个时间单位。 (7)进程标识为x5的进程被置于队末,进程标识为x6的进程得到调度,从就绪态“W”改为运行态“R”,运行 10个时间
10、单位。(8)进程标识为x6的进程被置于队末,进程标识为x1的进程再次得到调度,从就绪态“W”改为运行态“R”,运行 10个时间单位。(9)进程标识为x1的进程运行完成,进程标识为x3的进程再次得到调度,从就绪态“W”改为运行态“R”,运10个时间单位。(10)进程标识为x3的进程运行完成,进程标识为x5的进程再次得到调度,从就绪态“W”改为运行态“R”,只运5个时间单位。 (11)进程标识为x5的进程运行完成,进程标识为x6的进程再次得到调度,从就绪态“W”改为运行态“R”,运10个时间单位。 (12)进程标识为x6的进程运行完成,所有进程全部运行结束,均处于完成态“F”。3.实验小结 经过本次实验设计,把教材中的理论知识转化为实践,在一定程度上加深了我对时间片轮转调度算法的理解,同时也提高了我的动手编程能力。虽然在编程的过程中,遇到了很多的困难。但同时握了很多东西。更让我明白了操作系统中的一个核心的问题就是进程调度问题。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1