《计算机操作系统进程调度实验报告.doc》由会员分享,可在线阅读,更多相关《计算机操作系统进程调度实验报告.doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、. .操作系统实验题:设计一假设干并发进程的进程调度程序一、 实验目的无论是批处理系统、分时系统还是实时系统,用户进程数一般都大于处理机数,这将导致用户进程互相争夺处理机。这就要求进程调度程序按一定的策略,动态地把处理及分配给处于就绪队列中的某一进程,以使之执行。进程调度是处理机管理的核心容。本实验要求采用最高优先数优先的调度算法即把处理机分配给优先数最高的进程和先来先效劳算法编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念。并体会了优先数和先来先效劳调度算法的具体实施方法。二、 实验要求用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算
2、法的理解 三、 实验容进程调度算法:采用最高优先数优先的调度算法即把处理机分配给优先数最高的进程和先来先效劳算法将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先效劳的方式进展调度处理。 每个进程有一个进程控制块 PCB表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定也可以由随机数产生。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进展计算。 每个进程的状态可以是就绪 WWait、运行RRun、或完成FFinish三种状态之一。 就绪进程获得 CPU后都
3、只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已到达所需要的运行时间,那么撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1即降低一级,然后把它插入就绪队列等待CPU。每进展一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进展检查。 重复以上过程,直到所要进程都完成为止。四、 实验算法流程调度算法的流程图如下 :五、 实验程序清单#include stdio.h #include #include #define getpch(type) (t
4、ype*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定义进程控制块PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; char sort() /* 建立对进程进展优先级排列函数*/ PCB *first, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入
5、队首*/ 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) f
6、irst-link=p; char input() /* 建立进程控制块函数*/ int i,num; /clrscr(); /*清屏*/ printf(n 请输入被调度的进程数目:); scanf(%d,&num); for(i=0;iname); 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函数*/ int space() int l=0; PCB*
7、pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); char disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t ndtime t runtime n); printf(|%st,pr-name); printf(|%ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-ntime); printf(|%dt,pr-rtime); printf(n); char check() /* 建立进程查看函数 *
8、/ PCB* pr; printf(n * 当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ disp(p); pr=ready; printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; char destroy() /*建立进程撤消函数(进程运行完毕,撤消进程)*/ printf(n 进程 %s 已完成.n,p-name); free(p); char running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-rtime)+; if(p-rtime=p-
9、ntime) destroy(); /* 调用destroy函数*/ else (p-super)-; p-state=w; sort(); /*调用sort函数*/ main() /*主函数*/ int len,h=0; char ch; input(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n The execute number:%d n,h); p=ready; ready=p-link; p-link=NULL; p-state=R; check(); running(); printf(
10、n 按任一键继续.); ch=getchar(); printf(nn 进程已经完成.n); ch=getchar(); 六、 运行结果分析结果分析:根据上述输入的三个进程的信息可以得到:优先级最高的是进程ping,所以最先调度进程ping,它的状态为运行态,需要执行的时间为5。而当前就绪队列状态为:进程xu的优先级比拟高,处于就绪队列前面,而进程gui的优先级是三者中最低的,所以处于就绪队列的最后。而此时这两个进程的状态都为就绪态。结果分析:当进程ping执行了一个时间片之后而它已占用 CPU时间已到达所需要的运行时间,那么将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级
11、大的进程进入运行状态,那么该次进入运行态的是进程xu。按照这种方式一直运行下去,直到:结果分析:当进程ping的CPU占用时间等于它需要的执行时间时,进程ping调度完成。那么这时进程调度中还有两个进程:进程gui和进程xu。结果分析:当调度进程中只剩下进程gui和进程xu时,这时根据进程优先级的大小,进程gui将进入运行态。结果分析:当进程xu完成调度时,进程调度程序中直剩下进程gui了,这时进程gui将进入运行态,而当前就绪队列将为空。结果分析:当进程gui的CPU占用时间等于所需要的执行时间时,进程gui调度完成,那么这时进程调度中已经没有需要调度的进程了,那么整个进程调度完成。七、 总
12、结与体会该实验利用进程调度中的优先级算法调度进程,开场给每一个进程设定一个优先级数,对于优先级高的进程先调度,优先级低的进程后调度,在调度一个进程时,其他进程将处于就绪态,而正在被调度的进程应处于运行态。一开场在做这个实验的时候,我感觉大脑一片空白,不知道该从哪里动笔。后来根据书上的容和从网上下载的资料,我慢慢地了解了大致的流程。通过这次实验,首先加深了我对进程调度方法和功能的认识,其次让我更加深刻地理解了操作系统中进程调度中优先级调度的根本原理。优先级调度算法只是进程调度算法的一种,我们还应依照书本去学习进程调度的其它算法,以便更好地了解进程调度。. .word.zl. . .word.zl.