《2022年2022年进程调度操作系统实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年进程调度操作系统实验报告 .pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 1 页 共 9 页电子信息工程学系实验报告课程名称:操作系统实验项目名称:进程调度实验时间: 2014/3/22 班级:姓名:学号:一、实验 目 的:用高级语言编写和调试一个有 N 个进程并行的进程调度程序,以加深对进程的概念及进程调度算法的理解。二、实验 环 境: PC机、 windows2000 操作系统、 VC+6.0 三、实验要求实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告,按时上交。四、实验 内 容 及 过 程:设计一个有N个进程并行的进程调度程序。进程调度
2、算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。具体描述如下:每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。分析:进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait) 、运行 R(Run) 、或完成 F(Finish )三种状态之一。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加 1 来表示。如果运行一个时间片后,进程
3、的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级) ,然后按照优先数的大小把它插入就绪队列等待CPU 。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。调度算法的参考流程图如下:成绩:指导教师(签名) :名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 -
4、 - - - - - - - - 第 2 页 共 9 页五、实验步骤1编写一个有N个进程并行的进程调度程序(程序详见附录)。2在上机环境中输入程序,调试,编译。3设计输入数据,写出程序的执行结果。4根据具体实验要求,填写好实验报告。六、实验 结 果 及 分 析:1、分析:初始化队列。输入进程数为3 个进程,各个进程的进程名、优先级、需要时间片设置分别如下:Process Name Process Priorty Process Running Time aa 2 2 bb 2 1 cc 1 2 根据最高优先数优先的调度算法,我们可以得出理论结果如下:名师资料总结 - - -精品资料欢迎下载 -
5、 - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - 第 3 页 共 9 页进程 aa的优先数和bb 一样都为 2, 根据先来先服务原则, 进程 aa优先插入队列, 此时队列排序为aabbcc。就绪进程获得CPU后都只能运行一个时间片。1)执行第1 个时间片时,进程aa 得到 CPU ,进程状态为R,bb、cc 则状态为W 。当一个时间片结束,进程 aa 的优先数减1,变为 1,按照优先数的大小把它插入就绪队列等待CPU 。此时队列排序为bbccaa。2)执行第2 个时间片时,
6、进程bb 得到 CPU ,进程状态为R,cc、aa 则状态为W 。当一个时间片结束,进程 bb 的已占用 CPU时间已达到所需要的运行时间,撤消进程bb,此时队列排序为ccaa。3)执行第3 个时间片时,进程cc 得到 CPU ,进程状态为R,aa、bb 则状态为W 。当一个时间片结束,进程 cc 的优先数减1,变为 0,此时队列为aabb。4)执行第 4 个时间片时,进程aa 得到 CPU ,进程状态为R,cc 则状态为W 。进程 aa 的已占用 CPU时间已达到所需要的运行时间,撤消进程aa,此时队列排序为cc。5)执行第 5 个时间片时,进程cc 得到 CPU ,进程状态为R。进程 cc
7、 的已占用 CPU时间已达到所需要的运行时间,撤消进程cc。程序运行结束。2、实验结果截图如下:1)初始化队列:1)执行第1 个时间片, aa 执行, bb、cc 等待。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - 第 4 页 共 9 页2)执行第2 个时间片, bb 执行, cc、aa 等待。 bb 结束进程。3)执行第3 个时间片, cc 执行, aa 等待。名师资料总结 - - -精品资料欢迎下载 - - - - - -
8、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 第 5 页 共 9 页4)执行第4 个时间片, aa 执行, cc 等待。 aa 结束进程。5)执行第5 个时间片, cc 执行。 cc 结束进程。七、实验 心 得:通过本次实验,我加深对进程的概念及最高优先数优先的调度算法和先来先服务算法的理解。进程是一个程序的一次执行过程,是包括创建、调度和消亡的整个过程,当用户在系统中输入命令执行一个程序时,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
9、- - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - 第 6 页 共 9 页它将启动一个进程。进程控制块包含了进程的描述信息、控制信息及资源信息,它是进程的一个静态描述。最高优先数优先的调度算法要求在进程调度中,每次调度时,系统把处理机分配给就绪队列中优先数最高的进程。先来先服务算法总是把当前处于就绪队列之首的那个进程调度到运行状态,它只考虑进程进入就绪队列的先后。在本次实验中,我也遇到了许多问题。所安装的软件有瑕疵,导致程序一直运行不正确,后来通过与同学比较才发现错误。刚开始对进程概念不大了解,对程序的结构模模糊糊,但是,通过自
10、己自主的学习,终于对本实验有了更深的理解。虽然现在自己还不能自主完成一个完整的程序,但是至少我在本次试验中也学到了很多。在今后的时间里,我会尽量争取自己编写一个程序。附 录:#include stdio.h #include #include #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定义进程控制块 PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link; *ready=NUL
11、L,*p; typedef struct pcb PCB; void sort() /* 建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=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) /*若插入进程比当前进程优先数大
12、,*/ /* 插入到当前进程前面 */ p-link=second; first-link=p; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - 第 7 页 共 9 页second=NULL; insert=1; else /* 插入进程优先数最低 ,则插入到队尾 */ first=first-link; second=second-link; if(insert=0) first-link=p; void input() /*
13、 建立进程控制块函数 */ int i,num; system(cls); /* 清屏*/ printf(n Please Enter The Number of Process: ); scanf(%d,&num); for(i=1;iname); printf(n Please Enter The Process Priority:); scanf(%d,&p-super); printf(n Please Enter The Process Running Time:); scanf(%d,&p-ntime); printf(n); p-rtime=0;p-state=W; p-link
14、=NULL; sort(); /* 调用 sort 函数*/ int space() int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - 第 8 页 共 9 页 void disp(PCB * pr) /* 建立进程显示函数 ,用于显示当前进程 */ printf(n Process Name | S
15、tatus | Priority Number | Need Run Time | Has Been Running Timen); printf( %st,pr-name); printf( %ct,pr-state); printf( %dt,pr-super); printf( %dtt,pr-ntime); printf( %dt,pr-rtime); printf(n); void check() /* 建立进程查看函数*/ PCB* pr; printf(n * Currently Running Process:n); /* 显示当前运行进程 */ disp(p); pr=rea
16、dy; printf(n * Current Ready Queue Status:n); /* 显示就绪队列状态 */ while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数 (进程运行结束 ,撤消进程 )*/ printf(n Progress %s Finished.n,p-name); free(p); void running() /* 建立进程就绪函数 (进程运行时间到 ,置就绪状态 */ (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用 destroy函数*/
17、else (p-super)-; p-state=W; sort(); /* 调用 sort 函数*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - 第 9 页 共 9 页void main() /* 主函数 */ int len,h=0; char ch; input(); len=space(); while(len!=0)&(ready!=NULL) h+; printf(-); printf(n Now Is The %d Times: n,h); p=ready; ready=p-link; p-link=NULL; p-state=R; check(); running(); printf(n Press Any Key To Continue.n); printf(nn Progress Has Finished.n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -
限制150内