《计算机操作系统进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《计算机操作系统进程调度实验报告.docx(10页珍藏版)》请在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 getp
4、ch(type) (type*)malloc(sizeof(type) #define NULL 0struct pcb /* 定义进程掌握块PCB */char name10; char state;第 2 页 共 10 页2int 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-supe
5、r) /*优先级最大者,插入队首*/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
6、=0) first-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 spaceint 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;第 4 页 共 10 页4char destroy /*建立进程撤消函数(进程运行完毕,撤消进程)*/printf(“n 进程 %s 已完成.n“,p-name); free(p);char running /* 建立进程就绪函数(进程运行时间到,置就绪状态*/(p-rtime)+;
9、if(p-rtime=p-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(“n 按任一键
10、连续“);ch=getchar;printf(“nn 进程已经完成.n“); ch=getchar;第 5 页 共 10 页5六、 运行结果分析结果分析:依据上述输入的三个进程的信息可以得到:优先级最高的是进程 ping,所以最先调度进程 ping,它的状态为运行态,需要执行的时间为 5。而当前就绪队列状态为:进程 xu 的优先级比较高,处于就绪队列前面,而进程 gui 的优先级是三者中最低的,所以处于就绪队列的最终。而此时这两个进程的状态都为就绪态。第 6 页 共 10 页6结果分析:当进程 ping 执行了一个时间片之后而它已占用 CPU 时间已到达所需要的运行时间,则将它的优先级减 1
11、之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程 xu。依据这种方式始终运行下去 ,直到:结果分析:当进程 ping 的 CPU 占用时间等于它需要的执行时间时,进程 ping 调度完成。则这时进程调度中还有两个进程:进程 gui 和进程 xu。第 7 页 共 10 页7结果分析:当调度进程中只剩下进程 gui 和进程 xu 时,这时依据进程优先级的大小,进程 gui 将进入运行态。结果分析:当进程xu 完成调度时,进程调度程序中直剩下进程gui 了,这时进程gui 将进入运行态,而当前就绪队列将为空。第 8 页 共 10 页8结果分析:当进程
12、 gui 的 CPU 占用时间等于所需要的执行时间时,进程 gui 调度完成, 则这时进程调度中已经没有需要调度的进程了,则整个进程调度完成。七、 总结与体会该试验利用进程调度中的优先级算法调度进程,开头给每一个进程设定一个优先级数, 对于优先级高的进程先调度,优先级低的进程后调度,在调度一个进程时,其他进程将处于就绪态,而正在被调度的进程应处于运行态。一开头在做这个试验的时候,我感觉大脑一片空白,不知道该从哪里动笔。后来依据书上的内容和从网上下载的资料,我渐渐地了解了大致的流程。通过这次试验,首先加深了我对进程调度方法和功能的生疏,其次让我更加深刻地理解了操作系统中进程调度中优先级调度的根本原理。优先级调度算法只是进程调度算法的一种,我们还应依照书本去学习进程调度的其它算法,以便更好地了解进程调度。第 9 页 共 10 页9第 10 页 共 10 页10