进程调度算法实验报告篇一:操作系统进程调度算法模拟实验报告进程调度算法模拟专业:XXXXX 学号:XXXXX 姓名:XXX实验日期:20XX年XX月XX日一、实验目的通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。
二、实验要求编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法分别进行模拟调度。
三、实验方法内容1. 算法设计思路将每个进程抽象成一个控制块PCB, PCB用一个结构体描述。
构建一个进程调度类。
将进程调度的各种算法分装在一个类中。
类中存在三个容器,一个保存正在或未进入就绪队列的进程,一个保存就绪的进程,另一个保存已完成的进程。
还有一个PCB实例。
主要保存正在运行的进程。
类中其他方法都是围绕这三个容器可以这个运行中的PCB展开。
主要用到的技术是STL中的vector以维护和保存进程容器、就绪容器、完成容器。
当程序启动时,用户可以选择不同的调度算法。
然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。
进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。
判断进程容器中是否有新的进程可以加入就绪队列。
2. 算法流程图主程序的框架:();//先来先服务();//最短进程优先调度//简单时间片轮转//最高优先数优先//输入进程信息();.m_WaitQueue.empty()||.m_ProcessQueue.empt() ();();进程调度过程:;3. 算法中用到的数据结构struct fcfs{//先来先服务算法从这里开始char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;floatdqzztime;};//定义一个结构体,里面包含的有一个进程相关的信息4. 主要的常量变量vectorm_ProcessQueue;//进程输入队列vectorm_WaitQueue;//进程就绪队列vectorm_FinishQueue;//完成队列vector::iterator m_iter;//迭代器 PCB m_runProcess;//运行中的进程int m_ProcessCount;//进程数 float m_RunTime;//运行时间int m_tagIsRun;//是否在运行标志。
表示正在运行,表示没有 float m_TimeSlice;//时间片大小int m_TimeSliceCount;//指时间片轮转中一次分到的时间片个数 char m_SchedulerAlgorithm;//调度算法5. 主要模块void PCBInput();//输入进程信息void PCBSort();//对进程控制块按照优先级排序(采用冒泡排序)void ProcessSelect();//若当前就绪队列不为空则根据选择的调度算法开始调度。
否则,系统时间void PCBDisplay();//打印当前状况下。
就绪队列、完成队列、运行中的进程信息void ProcessRun();//进程运行一次。
运行时间加个时间片。
并判断进程是否达到完成条件。
若是则void ProcessQueueProcess();//查看当前时间下,有无进程加入。
若有则把该进程调入就绪队列 void ProcessDispatch();//进程分派,进程执行完成后决定进程该进入哪个队列(就绪、完成) void TimePast(){ m_RunTime +=m_TimeSlice; ProcessQueueProcess();}//当前系统时间加个时间void SchedulerStatistics();//调度统计,计算周转时间等void FCFS();//先来先服务 void SJF();//最短进程优先调度 void RR();//简单时间片轮转 void PD();//最高优先数优先加.以等待新的进程到来ProcessStatus='f'.否则为'w';片,并检查是否有新的进程加入四、实验代码#include #include #includeusing namespace std;struct fcfs{//先来先服务算法从这里开始char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};//定义一个结构体,里面包含的有一个进程相关的信fcfs a[100];void input(fcfs *p,int N) {int i;cout for(i=0;i }}void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){ int k;printf("\n\n调用先来先服务算法以后进程运行的顺序是: ");printf("%s",p[0].name);for(k=1;k%s",p[k].name);} cout printf("\t进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n");for(k=0;k printf("\t%s\t%-.2f\t %-.2f\t%-.2f\t %-.2f\t %-.2f \t %-.2f\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k ].zztime,p[k].dqzztime);}getchar(); //此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框}void sort(fcfs *p,int N) //排序篇二:进程的调度算法实验报告-计算机操作系统教程(第三版)进程的调度算法实验报告(完整版)一、实验目的:用高级语言编写和调试一个简单的进程调度程序。
加深了解有关进程控制块,进程队列的概念,并体会和了解优先数和时间片调度算法的具体实施方法。
二、实验内容:根据不同的调度算法模拟操作系统对进程的调度。
调度算法有二种:动态优先级法和时间片循环法。
1、设计进程控制块PCB表结构,分别适用优先数调度算法和循环时间片轮转算法。
2、PCB结构通常包括以下信息:进程名、进程优先数、轮转时间片、进程的CPU时间,进程状态等。
根据调度算法不同,PCB结构可作适当的调整。
3、建立进程队列。
对不同的算法编制不同的入链程序编制两种进程调度算法:a、优先数调度;b、循环时间轮转调度三、实验设计1.实验原理:2.算法思想:以时间片为计量单位A:优先数调度算法1)系统初始化时给每一个进程赋一个NEEDTIME和初始PRI。
并按优先数入队。
2)系统每次选定一个优先级最高的进程投入运行,进程每执行一次,优先数减2,并将它的进程占用的CPU时间加10,进程到完成还要的CPU时间减10。
3)每当一个进程运行一个时间片后,系统根据它的CPUTIME来判断它是否已经结束,若CPUTIME>0,那么将它重新排入就绪队列。
4)如果系统中尚有进程没有运行完毕,那么转入2)。
B:循环时间片轮转算法1)系统初始化时给每一个进程赋以一个NEEDTIME,并将所有进程按进入的次序排成一个队列。
2)取队头进程,并投入运行。
3)采用相对固定时间片(ROUND),进程每执行一次,进程占用的CPU时间加ROUND,进程到完成还要的CPU时间减ROUND。
并排到就绪队列的尾部。
4)如果当前进程的NEEDTIME>0,那么将它排到队尾。
5)如果尚有进程在队列中,那么转入2)3.编程语言、主要数据结构和意义使用VC6.0语言PCB结构:name 进程名pri /round 进程优先数/进程轮转时间片cputime 进程占用的CPU时间needtime 进程到完成还要的时间state 进程状态(假设状态为 Ready、Run、Finish)next 链指针void showlist(link,char*,int);//显示进程队列void instlist(link,link);//按优先数插入进程void appenlist(link,link);//按就绪先后加入进程link gethead(link);//取队首进程4.流程图(优先数算法)5. 源程序(含主要注释)#include "stdlib.h"#include "iostream.h"#include "string.h"const int MAX= 5;const int ROUND=2;const char *ITOA[10]={"0","1","2","3","4","5","6","7","8","9"}; typedef enum flag{Ready,Run,Finish};struct pcb{public:char name[10];//进程名int pri; //进程优数int round; //进程轮转时间片int cputime; //进程占用的CPU时间int needtime; //进程到完成还要的CPU时间 flag state; //进程状态struct pcb *next;//链指针};typedef struct pcb plist;typedef plist *link;void main(){void showlist(link,char*,int);//显示进程队列 v oid instlist(link,link);//按优先数插入进程void appenlist(link,link);//按就绪先后加入进程link gethead(link);//取队首进程int num=MAX+1;char str[10];link ptr,head1,head2;int i;int j=0;head1=new plist;head1->next=NULL;//就绪队首指针head2=new plist;head2->next=NULL;//完成队首指针while ((num>MAX)||(num {// printf("请输入演示进程数\n");cout // scanf("%d",&num);篇三:操作系统原理---进程调度实验报告一、实验目的通过对进程调度算法的设计,深入理解进程调度的原理。