进程调度算法的模拟实现
模拟进程调度实验报告
模拟进程调度实验报告模拟进程调度实验报告引言:进程调度是操作系统中的一个重要功能,它决定了各个进程在处理器上的执行顺序。
合理的进程调度算法能够提高系统的性能和效率。
为了深入了解进程调度算法的工作原理和效果,我们进行了一系列的模拟实验。
实验目的:1. 了解不同进程调度算法的工作原理;2. 分析不同算法对系统性能的影响;3. 探索如何选择合适的进程调度算法。
实验过程:1. 实验环境的搭建我们使用了一台配置较高的计算机作为实验环境,操作系统选择了Linux。
为了模拟多个进程同时运行的情况,我们编写了一段简单的多进程程序,并通过设置不同的优先级和时间片来模拟不同的进程调度算法。
2. FCFS(先来先服务)调度算法FCFS是最简单的进程调度算法,它按照进程到达的顺序进行调度。
我们通过设置不同的进程到达时间,观察FCFS算法的运行情况。
实验结果显示,FCFS算法对于长时间运行的进程效果较好,但是对于短时间进程会出现饥饿现象。
3. SJF(短作业优先)调度算法SJF算法是根据进程的执行时间来进行调度的,执行时间短的进程优先执行。
我们通过设置不同的进程执行时间,观察SJF算法的运行情况。
实验结果显示,SJF算法能够有效地减少平均等待时间和周转时间,但是对于长时间进程会出现饥饿现象。
4. RR(时间片轮转)调度算法RR算法是按照时间片的方式进行调度的,每个进程被分配一个固定的时间片,当时间片用完后,进程被挂起,等待下一次调度。
我们通过设置不同的时间片长度,观察RR算法的运行情况。
实验结果显示,RR算法能够公平地分配CPU 时间,并且能够较好地处理长时间和短时间进程。
实验结果与讨论:通过对不同进程调度算法的模拟实验,我们得出了以下结论:1. FCFS算法适用于长时间运行的进程,但对于短时间进程容易出现饥饿现象。
2. SJF算法能够有效地减少平均等待时间和周转时间,但对于长时间进程也容易出现饥饿现象。
3. RR算法能够公平地分配CPU时间,但对于长时间进程可能会产生较大的上下文切换开销。
操作系统进程调度算法模拟实验报告
操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。
二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。
常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)、轮转法(Round Robin)和多级反馈队列调度(Multilevel Feedback Queue Scheduling)等。
1.先来先服务(FCFS)算法:按照进程到达的先后顺序进行调度,被调度的进程一直执行直到结束或主动阻塞。
2.最短作业优先(SJF)算法:按照进程需要的执行时间的短长程度进行调度,执行时间越短的进程越优先被调度。
3. 优先级调度(Priority Scheduling)算法:为每个进程分配一个优先级,按照优先级从高到低进行调度。
4. 轮转法(Round Robin)算法:将进程按照到达顺序排列成一个队列,每个进程被分配一个时间片(时间量度),当时间片结束时,将进程从队列头取出放置到队列尾。
5.多级反馈队列调度算法:将进程队列分为多个优先级队列,每个队列时间片大小依次递减。
当一个队列中的进程全部执行完毕或者发生阻塞时,将其转移到下一个优先级队列。
三、实验步骤与结果1.实验环境:- 操作系统:Windows 10- 编译器:gcc2.实验过程:(1)首先,设计一组测试数据,包括进程到达时间、需要的执行时间和优先级等参数。
(2)根据不同的调度算法编写相应的调度函数,实现对测试数据的调度操作。
(3)通过模拟实验,观察不同调度算法之间的区别,比较平均等待时间、完成时间和响应时间的差异。
(4)将实验过程和结果进行记录整理,撰写实验报告。
3.实验结果:这里列举了一组测试数据和不同调度算法的结果,以便对比分析:进程,到达时间,执行时间,优先------,----------,----------,-------P1,0,10,P2,1,1,P3,2,2,P4,3,1,P5,4,5,a.先来先服务(FCFS)算法:平均等待时间:3.8完成时间:15b.最短作业优先(SJF)算法:平均等待时间:1.6完成时间:11c. 优先级调度(Priority Scheduling)算法:平均等待时间:2.8完成时间:14d. 轮转法(Round Robin)算法:时间片大小:2平均等待时间:4.8完成时间:17e.多级反馈队列调度算法:第一级队列时间片大小:2第二级队列时间片大小:4平均等待时间:3.8完成时间:17四、实验总结通过上述的实验结果可以得出以下结论:1.在上述测试数据中,最短作业优先(SJF)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。
进程调度实验报告
进程调度实验报告一、实验目的。
本实验旨在通过对进程调度算法的模拟和实验,加深学生对进程调度原理的理解,掌握各种进程调度算法的特点和应用场景,提高学生的实际操作能力和分析问题的能力。
二、实验环境。
本次实验使用了C语言编程语言,通过模拟实现了先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和多级反馈队列(MFQ)四种进程调度算法。
三、实验过程。
1. 先来先服务(FCFS)调度算法。
先来先服务调度算法是一种非抢占式的调度算法,按照进程到达的先后顺序进行调度。
在本次实验中,我们通过模拟多个进程到达并排队等待CPU执行,观察其平均等待时间和平均周转时间。
实验结果表明,先来先服务调度算法适用于作业长度差异较大的情况,但容易产生“饥饿”现象。
2. 最短作业优先(SJF)调度算法。
最短作业优先调度算法是一种非抢占式的调度算法,按照作业执行时间的长短进行调度。
在本次实验中,我们通过模拟多个作业的执行时间,观察其平均等待时间和平均周转时间。
实验结果表明,最短作业优先调度算法能够最大程度地减少平均等待时间,但可能会导致长作业被“饿死”。
3. 时间片轮转(RR)调度算法。
时间片轮转调度算法是一种抢占式的调度算法,每个进程被分配一个时间片,当时间片用完后,该进程被放到队尾等待。
在本次实验中,我们通过模拟多个进程的执行和时间片的调度,观察其平均等待时间和平均周转时间。
实验结果表明,时间片轮转调度算法能够保证每个进程都能得到一定的执行时间,但可能会导致上下文切换频繁。
4. 多级反馈队列(MFQ)调度算法。
多级反馈队列调度算法是一种综合性的调度算法,根据进程的优先级和执行时间进行动态调整。
在本次实验中,我们通过模拟多个进程的执行和不同优先级队列的调度,观察其平均等待时间和平均周转时间。
实验结果表明,多级反馈队列调度算法能够兼顾短作业和长作业,提高了系统的整体性能。
四、实验总结。
通过本次实验,我们深入理解了不同进程调度算法的特点和适用场景。
操作系统五种进程调度算法的代码
进程调度算法的模拟实现⏹实验目的1.本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。
2.利用程序设计语言编写算法,模拟实现先到先服务算法FCFS、轮转调度算法RR、最短作业优先算法SJF、优先级调度算法PRIOR、最短剩余时间优先算法SRTF。
3.进行算法评价,计算平均等待时间和平均周转时间。
⏹实验内容及结果1.先来先服务算法2.轮转调度算法3. 优先级调度算法4. 最短时间优先算法5. 最短剩余时间优先算法⏹实验总结在此次模拟过程中,将SRTF单独拿了出来用指针表示,而其余均用数组表示。
⏹完整代码【Srtf.cpp代码如下:】//最短剩余时间优先算法的实现#include<stdio.h>#include<stdlib.h>#include<time.h>typedef struct{int remain_time; //进程剩余执行时间int arrive_time; //进程到达时间int Tp; //进入就绪队列的时间int Tc; //进入执行队列的时间int To; //进程执行结束的时间int number; //进程编号}Process_Block; //定义进程模块typedef struct _Queue{Process_Block PB;struct _Queue *next;}_Block,*Process; //定义一个进程模块队列中结点typedef struct{Process head; //队列头指针Process end; //队列尾指针}Process_Queue; //进程队列Process_Queue PQ; //定义一个全局队列变量int t; //全局时间Process Run_Now; //当前正在运行的进程,作为全局变量void InitQueue(Process_Queue PQ){PQ.head ->next = NULL;PQ.end ->next = PQ.head;}/*初始化队列*/int IsEmpty(Process_Queue PQ){if(PQ.end->next == PQ.head)return 1; //队列空的条件为头指针指向尾指针并且尾指针指向头指针elsereturn 0;}/*判定队列是否为空队列*/void EnQueue(Process_Queue PQ,Process P){Process temp =(Process)malloc(sizeof(_Block));temp = PQ.end;temp->next->next = P;PQ.end->next = P;}/*插入队列操作*/Process DeQueue(Process_Queue PQ){if(IsEmpty(PQ))return NULL;Process temp = PQ.head->next;PQ.head->next= temp ->next;if(PQ.end->next == temp)PQ.end->next = PQ.head;return temp;}/*出列操作*/Process ShortestProcess(Process_Queue PQ){if(IsEmpty(PQ)) //如果队列为空,返回{if(!Run_Now)return NULL;elsereturn Run_Now;}Process temp,shortest,prev;int min_time;if(Run_Now) //如果当前有进程正在执行,{shortest = Run_Now; //那么最短进程初始化为当前正在执行的进程,min_time = Run_Now->PB.remain_time;}else//如果当前没有进程执行,{shortest = PQ.head->next; //则最短进程初始化为队列中第一个进程min_time = PQ.head->next->PB.remain_time;}temp = PQ.head;prev = temp;while(temp->next){if(temp->next->PB.remain_time <min_time) //如果当前进程的剩余时间比min_time短,{shortest = temp->next; //则保存当前进程,min_time = shortest->PB.remain_time;prev=temp; //及其前驱}temp=temp->next;}if(shortest == PQ.end->next) //如果最短剩余时间进程是队列中最后一个进程,PQ.end->next = prev; //则需要修改尾指针指向其前驱prev->next = shortest->next; //修改指针将最短剩余时间进程插入到队头return shortest;}/*调度最短剩余时间的进程至队头*/void Run(){Run_Now->PB.remain_time--; //某一时间运行它的剩余时间减return;}/*运行函数*/void Wait(){return ;}int sum(int array[],int n){int i,sum=0;for(i=0;i<n;i++)sum+=array[i];return sum;}int main(){PQ.head = (Process)malloc(sizeof(_Block));PQ.end = (Process)malloc(sizeof(_Block));Run_Now = (Process)malloc(sizeof(_Block));Run_Now =NULL;InitQueue(PQ);int i,N,Total_Time=0; //Total_Time为所有进程的执行时间之和printf("请输入计算机中的进程数目:\n");scanf("%d",&N);Process *P,temp;P = (Process*)malloc(N*sizeof(Process));int *wt,*circle_t;wt =(int*)malloc(N*sizeof(int));circle_t =(int*)malloc(N*sizeof(int));for(i=0;i<N;i++){P[i] = (Process)malloc(sizeof(_Block));P[i]->PB.number =i+1;P[i]->next =NULL;wt[i] =0;circle_t[i] =0;printf("输入第%d个进程的到达时间及剩余执行时间:\n",i+1);scanf("%d %d",&P[i]->PB.arrive_time,&P[i]->PB.remain_time);}for(i=0;i<N;i++)Total_Time+=P[i]->PB.remain_time;printf("\n进程按顺序运行依次为:\n");i=0;int k=0;for(t=0;;t++){if(Run_Now) //如果当前有进程正在执行{Run();if(t == P[i]->PB.arrive_time) //如果当前时间正好有进程进入{if(P[i]->PB.remain_time < Run_Now->PB.remain_time){temp = P[i];P[i] = Run_Now;Run_Now = temp; //则调度它至运行队列中,Run_Now->PB.Tp=t;Run_Now->PB.Tc=t;wt[Run_Now->PB.number-1]+=Run_Now->PB.Tc-Run_Now->PB.Tp;printf("%d ",Run_Now->PB.number);}EnQueue(PQ,P[i]); //并将当前运行进程重新插入队列中P[i]->PB.Tp=t;k++;i=(i+1)>(N-1)?(N-1):(i+1);}if(Run_Now->PB.remain_time == 0) //如果当前进程运行结束,{Run_Now->PB.To=t; //进程运行结束的时间circle_t[Run_Now->PB.number-1] +=t-Run_Now->PB.arrive_time;free(Run_Now); //则将它所占资源释放掉,Run_Now =NULL; //并修改Run_Now为NULLRun_Now = ShortestProcess(PQ); //从就绪队列中调出最短剩余时间进程至队头,if(!Run_Now) //如果队列为空,转为等待状态{if(IsEmpty(PQ) && k >= N) break;Wait();continue;}else{Run_Now->PB.Tc=t;wt[Run_Now->PB.number-1]+=Run_Now->PB.Tc-Run_Now->PB.Tp;printf("%d ",Run_Now->PB.number);}}}else//如果当前运行进程为空,那么{if(t == P[i]->PB.arrive_time) //如果正好这时有进程入队{k++;EnQueue(PQ,P[i]);Run_Now = DeQueue(PQ); //则直接被调入运行队列中Run_Now->PB.Tp=t;Run_Now->PB.Tc=t;printf("%d ",Run_Now->PB.number);i=(i+1)>(N-1)?(N-1):(i+1);}else{Wait();continue;}}}printf("\n");printf("平均等待时间是:\n%f\n",((float)sum(wt,N))/N);printf("平均周转时间是:\n%f\n",((float)sum(circle_t,N))/N);return 0;}//////////////////////////////////////////////////////【Process.cpp代码如下:】#include<iostream>#include<string>using namespace std;class Process{public:string ProcessName; // 进程名字int Time; // 进程需要时间int leval; // 进程优先级int LeftTime; // 进程运行一段时间后还需要的时间};void Copy ( Process proc1, Process proc2); // 把proc2赋值给proc1void Sort( Process pr[], int size) ; // 此排序后按优先级从大到小排列void sort1(Process pr[], int size) ; // 此排序后按需要的cpu时间从小到大排列void Fcfs( Process pr[], int num, int Timepice); // 先来先服务算法void TimeTurn( Process process[], int num, int Timepice); // 时间片轮转算法void Priority( Process process[], int num, int Timepice); // 优先级算法void main(){int a;cout<<endl;cout<<" 选择调度算法:"<<endl;cout<<" 1: FCFS 2: 时间片轮换 3: 优先级调度 4: 最短作业优先 5: 最短剩余时间优先"<<endl; cin>>a;const int Size =30;Process process[Size] ;int num;int TimePice;cout<<" 输入进程个数:"<<endl;cin>>num;cout<<" 输入此进程时间片大小: "<<endl;cin>>TimePice;for( int i=0; i< num; i++){string name;int CpuTime;int Leval;cout<<" 输入第"<< i+1<<" 个进程的名字、cpu时间和优先级:"<<endl;cin>>name;cin>> CpuTime>>Leval;process[i].ProcessName =name;process[i].Time =CpuTime;process[i].leval =Leval;cout<<endl;}for ( int k=0;k<num;k++)process[k].LeftTime=process[k].Time ;//对进程剩余时间初始化cout<<" ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级!! )";cout<<endl; cout<<endl;cout<<"进程名字"<<"共需占用CPU时间 "<<" 还需要占用时间 "<<" 优先级"<<" 状态"<<endl;if(a==1)Fcfs(process,num,TimePice);else if(a==2)TimeTurn( process, num, TimePice);else if(a==3){Sort( process, num);Priority( process , num, TimePice);}else// 最短作业算法,先按时间从小到大排序,再调用Fcfs算法即可{sort1(process,num);Fcfs(process,num,TimePice);}}void Copy ( Process proc1, Process proc2){proc1.leval =proc2.leval ;proc1.ProcessName =proc2.ProcessName ;proc1.Time =proc2.Time ;}void Sort( Process pr[], int size) //以进程优先级高低排序{// 直接插入排序for( int i=1;i<size;i++){Process temp;temp = pr[i];int j=i;while(j>0 && temp.leval<pr[j-1].leval){pr[j] = pr[j-1];j--;}pr[j] = temp;} // 直接插入排序后进程按优先级从小到大排列for( int d=size-1;d>size/2;d--){Process temp;temp=pr [d];pr [d] = pr [size-d-1];pr [size-d-1]=temp;} // 此排序后按优先级从大到小排列}/* 最短作业优先算法的实现*/void sort1 ( Process pr[], int size) // 以进程时间从低到高排序{// 直接插入排序for( int i=1;i<size;i++){Process temp;temp = pr[i];int j=i;while(j>0 && temp.Time < pr[j-1].Time ){pr[j] = pr[j-1];j--;}pr[j] = temp;}}/* 先来先服务算法的实现*/void Fcfs( Process process[], int num, int Timepice){ // process[] 是输入的进程,num是进程的数目,Timepice是时间片大小while(true){if(num==0){cout<<" 所有进程都已经执行完毕!"<<endl;exit(1);}if(process[0].LeftTime==0){cout<<" 进程"<<process[0].ProcessName<< " 已经执行完毕!"<<endl;for (int i=0;i<num;i++)process[i]=process[i+1];num--;}else if(process[num-1].LeftTime==0){cout<<" 进程"<<process[num-1].ProcessName<< " 已经执行完毕!"<<endl;num--;}else{cout<<endl; //输出正在运行的进程process[0].LeftTime=process[0].LeftTime- Timepice;process[0].leval =process[0].leval-1;cout<<" "<<process[0].ProcessName <<" "<<process[0].Time <<" ";cout<<process[0].LeftTime <<" "<<process[0].leval<<" 运行";cout<<endl;for(int s=1;s<num;s++){cout<<" "<<process[s].ProcessName <<" "<<process[s].Time <<"";cout<<process[s].LeftTime <<" "<<process[s].leval<<" 等待"<<endl; ;}} // elsecout<<endl;system(" pause");cout<<endl;} // while}/* 时间片轮转调度算法实现*/void TimeTurn( Process process[], int num, int Timepice){while(true){if(num==0){cout<<" 所有进程都已经执行完毕!"<<endl;exit(1);}if(process[0].LeftTime==0){cout<<" 进程"<<process[0].ProcessName<< " 已经执行完毕!"<<endl;for (int i=0;i<num;i++)process[i]=process[i+1];num--;}if( process[num-1].LeftTime ==0 ){cout<<" 进程" << process[num-1].ProcessName <<" 已经执行完毕! "<<endl;num--;}else if(process[0].LeftTime > 0){cout<<endl; //输出正在运行的进程process[0].LeftTime=process[0].LeftTime- Timepice;process[0].leval =process[0].leval-1;cout<<" "<<process[0].ProcessName <<" "<<process[0].Time <<" ";cout<<process[0].LeftTime <<" "<<process[0].leval<<" 运行";cout<<endl;for(int s=1;s<num;s++){cout<<" "<<process[s].ProcessName <<" "<<process[s].Time <<"";cout<<process[s].LeftTime <<" "<<process[s].leval;if(s==1)cout<<" 就绪"<<endl;elsecout<<" 等待"<<endl;}Process temp;temp = process[0];for( int j=0;j<num;j++)process[j] = process[j+1];process[num-1] = temp;} // elsecout<<endl;system(" pause");cout<<endl;} // while}/* 优先级调度算法的实现*/void Priority( Process process[], int num, int Timepice){while( true){if(num==0){cout<< "所有进程都已经执行完毕!"<<endl;exit(1);}if(process[0].LeftTime==0){cout<<" 进程" << process[0].ProcessName <<" 已经执行完毕! "<<endl;for( int m=0;m<num;m++)process[m] = process[m+1]; //一个进程执行完毕后从数组中删除num--; // 此时进程数目减少一个}if( num!=1 && process[num-1].LeftTime ==0 ){cout<<" 进程" << process[num-1].ProcessName <<" 已经执行完毕! "<<endl;num--;}if(process[0].LeftTime > 0){cout<<endl; //输出正在运行的进程process[0].LeftTime=process[0].LeftTime- Timepice;process[0].leval =process[0].leval-1;cout<<" "<<process[0].ProcessName <<" "<<process[0].Time <<" "; cout<<process[0].LeftTime <<" "<<process[0].leval<<" 运行";cout<<endl; // 输出其他进程for(int s=1;s<num;s++){cout<<" "<<process[s].ProcessName <<" "<<process[s].Time <<" "; cout<<process[s].LeftTime <<" "<<process[s].leval ;if(s==1)cout<<" 就绪"<<endl;elsecout<<" 等待 "<<endl;}} // elseSort(process, num);cout<<endl;system(" pause");cout<<endl;} // while}。
动态优先权进程调度算法模拟实验报告
动态优先权进程调度算法模拟实验报告动态优先权调度算法是一种动态调度算法,根据进程的优先级来决定下一个要执行的进程。
进程的优先级可以根据其紧迫性、重要性和资源需求等因素来确定。
本实验利用模拟算法来模拟动态优先权调度算法,并通过实例来说明该调度算法的工作原理和优缺点。
一、实验目的通过本实验,我们可以了解动态优先权调度算法的工作原理,掌握如何使用模拟算法来模拟进程的调度过程,进一步了解该调度算法的优缺点。
二、实验环境本实验使用C++编程语言来实现动态优先权调度算法的模拟。
编译器使用Dev-C++。
三、实验步骤1.设计进程控制块(PCB)的数据结构,包括进程优先级、进程标识、进程状态等信息。
2.设计模拟算法来模拟动态优先权调度算法。
具体算法如下:a.初始化就绪队列,将所有的进程按照优先级插入到就绪队列中。
b.选择优先级最高的进程执行,并更新该进程的优先级。
c.执行完毕后更新进程的状态,并将其从就绪队列中删除。
d.如果新的进程到达,将其插入到就绪队列中。
3.实现主函数,模拟进程的创建、调度和执行过程。
4.进行多个实例的测试,观察进程的调度顺序和执行结果。
5.总结实验结果,分析动态优先权调度算法的优缺点。
四、实验结果与分析通过多个实例的测试,我们可以观察到动态优先权调度算法的工作过程和效果。
该算法可以根据进程的优先级来确定下一个要执行的进程,从而可以更好地满足不同进程的需求。
同时,动态优先权调度算法可以确保优先级高的进程能够及时得到执行,提高系统的响应速度。
然而,动态优先权调度算法存在一些缺点。
首先,该算法对进程的优先级要求较高,需要合理设置进程的优先级。
如果优先级设置不合理,可能导致优先级高的进程一直占用CPU资源,而优先级低的进程无法得到执行,造成资源浪费。
其次,该算法没有考虑进程的等待时间和执行时间,容易导致饥饿现象的发生,即一些进程无法得到执行。
五、实验总结通过本实验,我们了解了动态优先权调度算法的工作原理和模拟方法。
进程的调度实验报告(3篇)
第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。
二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。
2. 实现三种调度算法:FCFS、RR和DP。
3. 创建一个进程队列,用于存储所有进程。
4. 实现调度函数,根据所选算法选择下一个执行的进程。
5. 模拟进程执行过程,打印进程执行状态和就绪队列。
四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。
操作系统进程调度算法模拟实验
操作系统进程调度算法模拟实验进程调度是操作系统中一个重要的功能,它决定了哪些进程能够获得处理器资源以及如何按照一定的策略来分配这些资源。
为了更好地理解进程调度算法的工作原理,我们可以进行一个模拟实验来观察不同算法的表现效果。
实验设想:我们设想有5个进程要运行在一个单核处理器上,每个进程有不同的运行时间和优先级。
进程信息如下:进程A:运行时间10ms,优先级4进程B:运行时间8ms,优先级3进程C:运行时间6ms,优先级2进程D:运行时间4ms,优先级1进程E:运行时间2ms,优先级5实验步骤:1.先来先服务(FCFS)调度算法实验:将上述进程按照先来先服务的原则排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。
2.最短作业优先(SJF)调度算法实验:将上述进程按照运行时间的大小排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。
3.优先级调度算法实验:将上述进程按照优先级的大小排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。
4.时间片轮转(RR)调度算法实验:设置一个时间片大小,将上述进程按照先来先服务的原则排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。
实验结果:通过模拟实验,我们可以得到每个进程的运行时间、完成时间和等待时间。
对于FCFS算法,进程的运行顺序是按照先来先服务的原则,因此进程A首先得到处理器资源并完成运行,其它进程依次按照到达顺序得到资源。
因此,对于进程A、B、C、D、E,它们的完成时间分别是10ms、18ms、24ms、28ms和30ms,等待时间分别是0ms、10ms、18ms、24ms和28ms。
对于SJF算法,进程的运行顺序是按照运行时间的大小,即短作业优先。
因此,进程E首先得到处理器资源并完成运行,其它进程依次按照运行时间的大小得到资源。
对于进程E、D、C、B、A,它们的完成时间分别是2ms、6ms、12ms、20ms和30ms,等待时间分别是0ms、2ms、6ms、12ms和20ms。
操作系统进程调度优先级算法C语言模拟
操作系统进程调度优先级算法C语言模拟```cstruct Processint pid; // 进程IDint priority; // 优先级};```接下来,我们使用一个简单的示例来说明操作系统进程调度优先级算法的模拟实现。
假设有5个进程需要调度执行,它们的初始优先级和运行时间如下:进程ID,优先级,已运行时间--------,--------,------------P1,4,2P2,3,4P3,1,6P4,2,1P5,5,3首先,我们需要将这些进程按照优先级排序,以得到调度队列。
可以使用冒泡排序算法实现,代码如下:```cvoid bubbleSort(struct Process *processes, int n)for (int i = 0; i < n - 1; i++)for (int j = 0; j < n - i - 1; j++)if (processes[j].priority > processes[j + 1].priority)struct Process temp = processes[j];processes[j] = processes[j + 1];processes[j + 1] = temp;}}}``````c#include <stdio.h>void bubbleSort(struct Process *processes, int n);int maistruct Process processes[] = {{1, 4, 2}, {2, 3, 4}, {3, 1, 6}, {4, 2, 1}, {5, 5, 3}};int n = sizeof(processes) / sizeof(struct Process);bubbleSort(processes, n);printf("初始调度队列:\n");printf("进程ID\t优先级\t已运行时间\n");for (int i = 0; i < n; i++)}//模拟进程调度printf("\n开始模拟进程调度...\n");int finished = 0;while (finished < n)struct Process *current_process = &processes[0];printf("执行进程 P%d\n", current_process->pid);finished++;printf("进程 P%d 执行完毕\n", current_process->pid);} else}bubbleSort(processes, n);}printf("\n所有进程执行完毕,调度队列的最终顺序为:\n"); printf("进程ID\t优先级\t已运行时间\n");for (int i = 0; i < n; i++)}return 0;```以上代码中,我们使用了一个变量`finished`来记录已完成的进程数量,当`finished`等于进程数量`n`时,所有进程执行完毕。
时间片轮转进程调度模拟算法的实现
时间片轮转进程调度模拟算法的实现时间片轮转进程调度算法是一种常用的进程调度算法,适用于多任务操作系统。
它采用固定长度的时间片(也称为时间量),将CPU的占用时间划分为多个时间片。
每个进程在每个时间片内被允许执行的时间是固定的,当一个进程的时间片用完时,调度器会切换到下一个进程。
实现时间片轮转进程调度算法,可以使用队列来管理进程的调度。
具体实现如下:1.定义进程和时间片的结构体:进程结构体包含进程的ID、到达时间、服务时间和剩余时间;时间片结构体包含时间片的长度和当前时间。
2.创建就绪队列和完成队列:就绪队列用于管理等待执行的进程,完成队列用于管理已经完成执行的进程。
3.输入待执行进程的信息,包括进程的ID、到达时间和服务时间。
4.将进程按照到达时间的先后顺序加入就绪队列。
5.设置当前时间为0,循环执行以下步骤直到就绪队列为空:-从就绪队列中取出第一个进程。
-如果进程剩余时间小于等于时间片长度,则执行进程的剩余时间,并将进程移动到完成队列。
-如果进程剩余时间大于时间片长度,则执行一个时间片的时间,并将进程重新加入就绪队列。
6.计算各个进程的等待时间和周转时间。
等待时间等于完成时间减去到达时间减去服务时间,周转时间等于等待时间加上服务时间。
7.计算平均等待时间和平均周转时间,分别为所有进程的等待时间和周转时间的总和除以进程数。
8.输出结果,包括进程的ID、到达时间、服务时间、完成时间、等待时间和周转时间。
以下是一个C++实现示例:```cpp#include <iostream>#include <queue>using namespace std;//进程结构体struct Processint id;int arrivalTime;int serviceTime;int remainingTime;};//时间片结构体struct TimeSlotint length;int currentTime;};int maiint n; // 进程数量queue<Process> readyQueue; // 就绪队列queue<Process> finishQueue; // 完成队列//输入进程数量和时间片长度cout << "Enter the number of processes: "; cin >> n;//输入进程信息for (int i = 0; i < n; i++)Process process;cout << "Process ID: ";cin >> process.id;cin >> process.arrivalTime;cin >> process.serviceTime;process.remainingTime = process.serviceTime; readyQueue.push(process);}int currentTime = 0;while (!readyQueue.empty()Process currentProcess = readyQueue.front(;readyQueue.pop(;currentProcess.remainingTime = 0;finishQueue.push(currentProcess);currentTime += currentProcess.remainingTime;} elsereadyQueue.push(currentProcess);}}//计算等待时间和周转时间int totalWaitingTime = 0;int totalTurnaroundTIme = 0;int numProcesses = finishQueue.size(;cout << "Process ID\tArrival Time\tService Time\tFinish Time\tWaiting Time\tTurnaround Time" << endl;while (!finishQueue.empty()Process process = finishQueue.front(;finishQueue.pop(;int waitingTime = currentTime - process.arrivalTime - process.serviceTime;int turnaroundTime = waitingTime + process.serviceTime;cout << process.id << "\t\t" << process.arrivalTime <<"\t\t" << process.serviceTime << "\t\t" << currentTime << "\t\t" << waitingTime << "\t\t" << turnaroundTime << endl;totalWaitingTime += waitingTime;totalTurnaroundTIme += turnaroundTime;}//计算平均等待时间和平均周转时间float avgWaitingTime = (float)totalWaitingTime / numProcesses;float avgTurnaroundTIme = (float)totalTurnaroundTIme / numProcesses;cout << "Average Waiting Time: " << avgWaitingTime << endl;cout << "Average Turnaround Time: " << avgTurnaroundTIme << endl;return 0;```这个示例演示了时间片轮转进程调度算法的实现过程,包括进程的输入、时间片的设置、进程的调度、等待时间和周转时间的计算,以及最后的结果输出。
模拟调度实验报告(3篇)
第1篇一、实验背景进程调度是操作系统核心功能之一,它负责在多道程序环境下,按照一定的策略对进程进行调度,以确保系统资源的合理分配和高效利用。
为了加深对进程调度算法的理解,本次实验采用模拟的方式,实现了先来先服务(FCFS)、时间片轮转(RR)和动态优先级调度(DP)三种算法,并对实验过程进行了详细记录和分析。
二、实验目的1. 理解进程调度的基本原理和不同调度算法的特点。
2. 掌握进程控制块(PCB)的设计与实现。
3. 通过模拟实验,验证三种调度算法的执行效果。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验内容1. 定义进程控制块(PCB)进程控制块是操作系统用于描述和管理进程的实体,它包含了进程的基本信息。
本实验中,PCB包含以下字段:- 进程ID:唯一标识一个进程。
- 到达时间:进程进入就绪队列的时间。
- 需要运行时间:进程完成所需的时间。
- 已运行时间:进程已运行的时间。
- 状态:进程当前的状态(就绪、运行、阻塞、完成)。
2. 实现三种调度算法(1)先来先服务(FCFS)算法FCFS算法按照进程到达就绪队列的顺序进行调度,先到先服务。
具体实现如下:- 将进程按照到达时间排序,形成就绪队列。
- 遍历就绪队列,依次执行进程,直到进程完成或被阻塞。
(2)时间片轮转(RR)算法RR算法将CPU时间划分为时间片,每个进程运行一个时间片后,让出CPU,等待下一个时间片。
具体实现如下:- 设置一个时间片大小。
- 将进程按照到达时间排序,形成就绪队列。
- 遍历就绪队列,每个进程执行一个时间片,如果进程未完成,则将其加入就绪队列队尾。
(3)动态优先级调度(DP)算法DP算法根据进程的优先级进行调度,优先级高的进程优先执行。
具体实现如下:- 设置一个优先级阈值,当进程的优先级高于阈值时,将其加入就绪队列。
- 遍历就绪队列,选择优先级最高的进程执行,直到进程完成或被阻塞。
进程调度模拟设计——先来先服务最高响应比优先调度算法
进程调度模拟设计——先来先服务最高响应比优先调度算法进程调度是操作系统中非常重要的一部分,它负责根据一定的调度算法从就绪态的进程队列中选择下一个运行的进程。
在这篇文章中,我将介绍两种常见的进程调度算法:先来先服务调度(FCFS)和最高响应比优先调度(HRRN)。
1.先来先服务调度(FCFS):先来先服务调度算法是一种非抢占式调度算法,按照进程到达的顺序依次进行调度。
即当一个进程到达后,它将被插入到就绪队列的末尾。
当前运行的进程执行完毕后,将选择队列中的第一个进程来执行。
先来先服务调度算法的优点是简单、公平,不会发生饥饿现象。
然而,它有一个显著的缺点,即无法考虑进程的执行时间和优先级。
如果一个长时间运行的进程到达了队列,所有其他进程都要等待它完成,这可能导致其他进程的等待时间较长。
2.最高响应比优先调度(HRRN):最高响应比优先调度算法是一种动态优先级调度算法,它考虑了进程的等待时间和执行时间。
响应比定义为(等待时间+服务时间)/服务时间。
当一个进程等待的时间越长,它的响应比越高,优先级越高。
最高响应比优先调度算法会选择具有最高响应比的进程来执行。
如果两个进程的响应比相同,则按照先来先服务的原则进行选择。
当一个进程到达后,它将被插入到就绪队列中,并根据响应比进行排序。
最高响应比优先调度算法的优点是可以避免长时间运行的进程造成其他进程的饥饿现象,提高了系统的响应性。
然而,它的实现相对复杂,需要计算每个进程的响应比。
下面是两种调度算法的模拟设计:先来先服务调度模拟设计:1.定义一个就绪队列,用来保存到达的进程。
2.当一个新的进程到达时,将其加入到就绪队列的末尾。
3.当前运行的进程执行完毕后,从就绪队列中选择队列的第一个进程来执行。
4.执行进程,更新进程的状态和执行时间,直到所有进程执行完毕。
最高响应比优先调度模拟设计:1.定义一个就绪队列,用来保存到达的进程。
2.当一个新的进程到达时,将其加入到就绪队列中,并计算每个进程的响应比。
进程调度算法模拟程序设计
进程调度算法模拟程序设计引言进程调度算法是操作系统中的重要组成部分,它决定了进程在系统中的执行顺序和分配时间片的策略。
为了更好地理解和研究不同的进程调度算法,我们可以设计一个模拟程序来模拟进程的调度过程。
本文将介绍进程调度算法的基本概念和常见的调度算法,并详细讨论如何设计一个进程调度算法模拟程序。
什么是进程调度算法进程调度算法是操作系统中的一种策略,用于决定在多个进程同时请求执行时,系统按照什么样的顺序来选择并分配CPU资源。
进程调度算法的目标是尽可能地提高系统的吞吐量、响应时间和公平性。
常见的进程调度算法先来先服务(FCFS)先来先服务是最简单的进程调度算法,它按照进程到达的先后顺序进行调度。
当一个进程到达系统后,它会被放入就绪队列中,然后按照先后顺序执行。
这种算法的优点是简单易懂,但是存在”饥饿”问题,即长作业会占用CPU资源,导致其他短作业等待时间过长。
短作业优先(SJF)短作业优先算法是根据进程的执行时间来进行调度的。
当一个进程到达系统后,系统会根据其执行时间将其放入适当的位置,执行时间短的进程优先执行。
这种算法可以最大限度地减少平均等待时间,但是对于长作业来说可能会饥饿。
时间片轮转(RR)时间片轮转算法是一种分时调度算法,它将CPU的执行时间划分为多个时间片,每个进程在一个时间片内执行一定的时间,然后切换到下一个进程。
这种算法可以保证所有进程都有机会执行,并且对于响应时间要求较高的任务比较合适。
多级反馈队列(MFQ)多级反馈队列算法是一种综合了FCFS和RR的调度算法。
系统将进程根据优先级划分为多个队列,每个队列都有不同的时间片大小。
当一个进程到达系统后,它被放入第一个队列中,如果在时间片内没有执行完,则被移到下一个队列中。
这种算法可以根据进程的优先级和执行时间动态调整调度策略,提高系统的响应性能。
进程调度算法模拟程序设计程序结构为了设计一个进程调度算法模拟程序,我们需要考虑以下几个方面的内容:1.进程的数据结构:我们可以使用一个进程控制块(PCB)来表示一个进程,PCB包含了进程的状态、优先级、执行时间等信息。
采用短进程优先算法模拟实现进程调度
采用短进程优先算法模拟实现进程调度短进程优先(SJF)是一种基于优先级的调度算法,其中短的进程优先
被调度。
在这种算法中,短暂的进程拥有优先级,因此优先调度。
SJF的工作原理是:在进程结束之前,它会检查新到达的进程,把它
们按照任务的执行时间排序,并把时间最短的进程调度到CPU中去执行。
这种算法的目的是让整个调度过程更有效率,减少CPU的空闲时间,由于
短进程可以被快速地完成,CPU在等待长进程完成的时间就可以更有效地
被利用。
短进程优先算法可以使用多种方法来实现,最常用的是基于优先级的
算法,即让较短的进程具有较高的优先级,让长进程具有较低的优先级。
在这种方法中,到达进程被排序,然后CPU根据优先级调度拥有最高优先
级的进程。
有的时候短进程优先算法也可以使用时间片轮转(Round Robin)的方法,即把每个进程分配一个时间片,时间片的大小取决于任务的执行时间。
在这种方法中,每个时间片之间调度一个进程,直到每个进程的时间片都
被使用完,然后重新调度下一个时间片。
SJF调度算法的优点是可以有效地减少CPU的空闲时间,可以提高整
个系统的性能,而且它可以运行时间较短的程序。
进程调度模拟程序实验实验报告
进程调度模拟程序实验实验报告一、实验目的进程调度是操作系统的核心功能之一,它负责合理地分配 CPU 资源给各个进程,以提高系统的性能和效率。
本次实验的目的是通过编写和模拟进程调度程序,深入理解不同的进程调度算法的原理和特点,并比较它们在不同情况下的性能表现。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
操作系统为 Windows 10。
三、实验原理1、先来先服务(FCFS)调度算法先来先服务调度算法按照进程到达的先后顺序进行调度,先到达的进程先获得 CPU 资源。
2、短作业优先(SJF)调度算法短作业优先调度算法优先调度执行时间短的进程。
3、时间片轮转(RR)调度算法时间片轮转调度算法将 CPU 时间划分为固定大小的时间片,每个进程轮流获得一个时间片的 CPU 资源。
四、实验设计1、进程类的设计创建一个进程类,包含进程 ID、到达时间、服务时间、剩余服务时间等属性,以及用于更新剩余服务时间和判断进程是否完成的方法。
2、调度算法实现分别实现先来先服务、短作业优先和时间片轮转三种调度算法。
3、模拟流程(1)初始化进程列表。
(2)按照选定的调度算法进行进程调度。
(3)计算每个进程的等待时间、周转时间等性能指标。
五、实验步骤1、定义进程类```pythonclass Process:def __init__(self, pid, arrival_time, service_time):selfpid = pidselfarrival_time = arrival_timeselfservice_time = service_timeselfremaining_service_time = service_time```2、先来先服务调度算法实现```pythondef fcfs_scheduling(process_list):current_time = 0total_waiting_time = 0total_turnaround_time = 0for process in process_list:if current_time < processarrival_time:current_time = processarrival_timewaiting_time = current_time processarrival_timetotal_waiting_time += waiting_timecurrent_time += processservice_timeturnaround_time = current_time processarrival_timetotal_turnaround_time += turnaround_timeaverage_waiting_time = total_waiting_time / len(process_list)average_turnaround_time = total_turnaround_time / len(process_list) print("先来先服务调度算法的平均等待时间:",average_waiting_time)print("先来先服务调度算法的平均周转时间:",average_turnaround_time)```3、短作业优先调度算法实现```pythondef sjf_scheduling(process_list):current_time = 0total_waiting_time = 0total_turnaround_time = 0sorted_process_list = sorted(process_list, key=lambda x: xservice_time) for process in sorted_process_list:if current_time < processarrival_time:current_time = processarrival_timewaiting_time = current_time processarrival_timetotal_waiting_time += waiting_timecurrent_time += processservice_timeturnaround_time = current_time processarrival_timetotal_turnaround_time += turnaround_timeaverage_waiting_time = total_waiting_time / len(process_list)average_turnaround_time = total_turnaround_time / len(process_list) print("短作业优先调度算法的平均等待时间:",average_waiting_time)print("短作业优先调度算法的平均周转时间:",average_turnaround_time)```4、时间片轮转调度算法实现```pythondef rr_scheduling(process_list, time_slice):current_time = 0total_waiting_time = 0total_turnaround_time = 0ready_queue =while len(process_list) > 0 or len(ready_queue) > 0:for process in process_list:if processarrival_time <= current_time:ready_queueappend(process)process_listremove(process)if len(ready_queue) == 0:current_time += 1continueprocess = ready_queuepop(0)if processremaining_service_time <= time_slice: waiting_time = current_time processarrival_time total_waiting_time += waiting_timecurrent_time += processremaining_service_time turnaround_time = current_time processarrival_time total_turnaround_time += turnaround_time processremaining_service_time = 0else:waiting_time = current_time processarrival_time total_waiting_time += waiting_timecurrent_time += time_sliceprocessremaining_service_time = time_sliceready_queueappend(process)average_waiting_time = total_waiting_time / len(process_list)average_turnaround_time = total_turnaround_time / len(process_list) print("时间片轮转调度算法(时间片大小为", time_slice, ")的平均等待时间:", average_waiting_time)print("时间片轮转调度算法(时间片大小为", time_slice, ")的平均周转时间:", average_turnaround_time)```5、主函数```pythonif __name__ =="__main__":process_list =Process(1, 0, 5),Process(2, 1, 3),Process(3, 2, 8),Process(4, 3, 6)print("先来先服务调度算法:")fcfs_scheduling(process_list)print("短作业优先调度算法:")sjf_scheduling(process_list)time_slice = 2print("时间片轮转调度算法(时间片大小为",time_slice, "):")rr_scheduling(process_list, time_slice)```六、实验结果与分析1、先来先服务调度算法平均等待时间为 575,平均周转时间为 1275。
实验 短作业优先进程调度算法模拟
1.写出你对给出的程序的理解,可以包括学到了那些程序设计的语法或方法,以及算法的设计思想。
2.写出实验指导中要求部分是如何实现的,
3.上述部分不能只是抄写代码,要有说明。
附录: 先来先服务进程调度模拟程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
printf("----------------------------------------------------------------------------------------------\n");
for(int i=0;i<N;i++)
{
printf(" %s %d %d %d %d \n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time);
#include <conio.h>
#define N 5
struct PCB
{
char name[8];
int arrive_time;
int run_time;
int finish_time;
int zhouzhuan_time;
};
int total=0;
struct PCB pcb[N],temp;
output();
//运行第一个到达的进程得到它的完成时间、周转时间等,并设置为已访问
pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time;
操作系统实验报告-进程调度法的实现
操作系统实验报告进程调度算法的实现1.实验目的进程是操作系统最重要的概念之一,本实验通过对进程调度模拟程序的运行,学习运用时间片轮转法进行进程调度,加深对进程的基本调度状态以及进程调度算法的理解。
2.算法思想进程调度算法:采用多级反馈队列调度算法。
其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。
4.算法。
5.程序代码程序的主要代码如下:#include<iostream.h>#include<stdlib.h>#include<time.h>#include<stdio.h>#include<string.h>const int MAXCOMMANDLEN =50;///////////////////////////////////////////////////////////////////////////////////////// PROCESS///////////////////////////////////////////////////////////////////////////////////////class Process{friend class CPU; //友元类protected:static int init_ID; //静态初始IDint ID; //进程IDchar runText[MAXCOMMANDLEN]; //进程指令数组int IP; //进程指令指针,保存进程指令执行到的具体位置bool ISuseSource; //进程是否使用资源(是或者否)bool ISblocked; //进程是否被阻塞(是或者否)int unitTime; //进程被cpu执行单位时间, 默认 1int blockTime; //进程被阻塞时间public:static void RandID(); //静态随机生成进程ID的函数Process(); //进程类的构造函数int getID(); //得到进程IDint getIP(); //获取进程指令指针IPvoid setIP(int); //设置IPvoid Runed(); //进程被执行int getUnittime(); //得到进程的单位执行时间2int getBlcoktime(); //得到进程被阻塞的时间void setBlocktime(int); //设置进程被阻塞的时间void setUnittime(int); //设置进程的单位执行时间char getResult(int); //得到进程被执行的结果char* getRuntext(); //得到进程执行的指令void setBlockstate(bool); //设置进程阻塞状态bool getBlockstate(); //得到进程阻塞状态bool getISusesource(); //得到资源的使用状态void setISusesource(bool); //设置资源的使用状态};int Process::init_ID; //初始化静态变量void Process::RandID() //随机产生一个进程ID{srand((unsigned)time(NULL)); //调用srand随机生成函数init_ID=rand();}Process::Process() //进程的构造函数{ID=init_ID++; //进程ID的初值为静态初始ID的值int commandLen; //命令行长度IP=0;cout<<"Please input the text which process runed by CPU [#command#] :>\\ ";cin>>runText; //输入命令if( (commandLen=strlen(runText) ) > MAXCOMMANDLEN )exit(0); //输入长度超出最大长度时退出,特殊情况处理3runText[commandLen]='#'; //初始指令结束标志 '#' runText[commandLen+1]='\0'; //字符串结束标志ISuseSource=false; //设置资源的使用状态为未使用ISblocked=false; //进程的初始状态-》未被阻塞unitTime=1; //进程被执行的单位时间为1 blockTime=0; //阻塞时间为0}void Process::Runed() //进程被CPU执行{cout<<getResult(IP++); //输出得到的进程执行结果}int Process::getID() //得到进程ID {return ID;}int Process::getIP() //得到进行IP {return IP;}void Process::setIP(int ip) //设置进程IP {IP=ip;}bool Process::getISusesource() //得到资源的使用状态{return ISuseSource;4}void Process::setISusesource(bool s) //设置资源的使用状态{ISuseSource=s;}char* Process::getRuntext() //得到进程执行的指令{return runText;}int Process::getUnittime() //得到进程的单位执行时间{return unitTime;}int Process::getBlcoktime() //得到进程阻塞状态{return blockTime;}void Process::setBlocktime(int BT) //设置进程阻塞时间{blockTime=BT;}void Process::setUnittime(int UT) //设置进程的单位执行时间{unitTime=UT;}5void Process::setBlockstate(bool state) //设置进程阻塞状态{ISblocked=state;}bool Process::getBlockstate() //得到进程阻塞状态{return ISblocked;}char Process::getResult(int k) //得到程序的运行结果{return runText[k];}///////////////////////////////////////////////////////////////////////////////////////// SOURCE///////////////////////////////////////////////////////////////////////////////////////class Source //资源类{protected:int ID; //资源 IDbool state; //资源是否被占用状态int pro_ID; //使用资源的进程id Process *pro; //使用资源的进程指针int time; //进程使用资源的时间6public:Source(int); //资源类构造函数bool getState(); //得到资源被使用状态void setState(bool); //设置资源被使用状态void setTime(int); //设置进程使用资源的时间void setPro(Process *); //设置使用该资源的进程int getID(); //得到资源idint getPorID(); //得到使用资源的进程id void setProID(int); //设置使用资源的进程id void runned(); //资源被cpu调用};Source::Source(int id) //资源类构造函数{ID=id; //资源ID初值为idpro=NULL; //指针赋为空值state=true; //状态为被使用状态}void Source::setProID(int id) //设置使用资源的进程id{pro_ID=id;}void Source::setTime(int t) //设置进程使用资源的时间{time=t;}void Source::setState(bool s) //设置资源使用状态{7state=s;}bool Source::getState() //得到资源使用状态{return state;}void Source::setPro(Process *p) //设置使用该资源的进程{pro=p;}void Source::runned() //资源被CPU调用{if(time>0) //时间充足继续运行输出资源信息并使时间减一{cout<<"( Source :"<<ID<<")";time--;}if(time<=0) //时间用完{pro->setISusesource(false); //资源的使用状态为未使用int ip=pro->getIP(); //得到进程的IPpro->setIP(++ip); //设置到下一个ipSource::setState(true); //设置资源的使用状态为正在使用cout<<endl<<"The process "<<pro->getID()<<" relase the source!"<<endl;pro=NULL; //输出资源被释放指针值赋值为空值}8}//////////////////////////////////////////////////////////// ///////////////////////////// CPU////////////////////////////////////////////////////////////// /////////////////////////typedef struct Block //阻塞队列结构{Process *p_BlockProcess; //被阻塞的进程队列int index; //被阻塞的进程在就绪队列中的位置}Block;class CPU{protected:Process *p_Process; //进程队列Process **pp_Process; //进程就绪队列Block *blockQueue ; //进程阻塞队列Source *p_Source; //资源指针int numOfprocess; //进程数量int numOfblock; //被阻塞的进程数int PC; //程序计数器int allTime; //cpu运行的总时间public :CPU(int); //cpu构造函数void Run(); //cpu运行进程bool _IC(Process&); //虚拟IC,进行进程指令翻译void useSource(Process&); //进程申请资源9void blockProcess(Process&); //阻塞进程void releaseBlockPro(); //释放阻塞进程int getAlltime(); //得到进程运行的总时间void displayPro(); //显示进程的基本信息,id,指令,运行时间等void blockTimeADD(); //阻塞时间加1 };CPU::CPU(int num){p_Source=new Source(379857);//创建一个id号为379857的资源numOfprocess=num; //进程数numOfblock=0; //阻塞数allTime=0; //cpu运行的总时间初始化为0p_Process=new Process[numOfprocess];//进程队列申请空间pp_Process=new Process*[numOfprocess];//进程就绪队列申请空间blockQueue=new Block[numOfprocess]; //阻塞队列申请空间for(int i=0;i<numOfprocess;i++){pp_Process[i]=&p_Process[i]; //用二维数组存放进程指针数组头指针blockQueue->p_BlockProcess=NULL; //阻塞队列的阻塞进程赋值为空blockQueue->index=-1; //阻塞队列的索引值置为1 }}int CPU::getAlltime() //得到进程运行的总时间{return allTime;}10void CPU::displayPro() //显示进程的基本信息{for(int i=0;i<numOfprocess;i++)//循环输出被执行的进程的信息{cout<<"\tProcess ID : "<<p_Process[i].getID()<<endl;cout<<" text of runned :"<<p_Process[i].getRuntext()<<endl;}}void CPU::Run() //cpu运行进程{int numPro=numOfprocess; //记录未被运行的进程个数do{for(int num=0;num < numOfprocess;num++){if(!pp_Process[num]) //就绪队列不空继续执行continue;for(int t=0;t<p_Process[num].getUnittime();t++){PC=p_Process[num].getIP();//得到进程Ipif(_IC(p_Process[num]))//判断进程的状态TURE进入{if(t==0) //时间为0运行完输出进程信息cout<<"the process ["<<p_Process[num].getID()<<"] runed : ";if(!p_Process[num].getISusesource())//如果该进程未被运行过,则调用run运行{p_Process[num].Runed();//}else{p_Source->runned(); //if( p_Source->getState() && numOfblock>0 ){releaseBlockPro();////如果进程运行过,现在但未运行,说明为阻塞。
操作系统实验进程调度
实验三进程调度一. 实验目的加深理解并模拟实现进程(作业)调度算法。
1)熟悉常用的进程调度算法, 如FCFS、SPF、FPF、高响应比优先、时间片轮转;2)结合所学的数据结构及编程知识, 选择三种进程调度算法予以实现。
二. 实验属性该实验为设计性实验。
三. 实验仪器设备及器材普通PC386以上微机四. 实验要求本实验要求2学时完成。
1)本实验要求完成如下任务:2)编程实现单处理机系统中的进程调度, 要求从FCFS、SPF、FPF、高响应比优先、时间片轮转算法中至少选择三个;3)最后编写主函数对所做工作进行测试。
实验前应复习实验中所涉及的理论知识和算法, 针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。
实验后认真书写符合规范格式的实验报告(参见附录A), 并要求用正规的实验报告纸和封面装订整齐, 按时上交。
五: 实验具体设计此程序模拟了两种调度算法, FCFS和SPF, 首先FCFS就是按照进程的创建顺序依次顺序进行, 流程图为:进程顺序执行SPF:每次都进行循环, 选出在该时间刻运行时间最短的进程优先执行。
1.程序代码具体详解:2.创建一结构体作为进程控制器typedef struct PCB{int ID;char state;int arrivetime;int starttime;int finishtime;int servicetime;struct PCB *next;}pcb;定义全局变量作为计时器int time;//计时器创建进程链表:从txt文件中读取数据, 构造一条不含头结点的单链表void Create_process(){ifstream inFile;inFile.open("test.txt");inFile>>n;inFile.get();int i=0;for (;i<n;i++){p=(pcb *)malloc(sizeof(pcb));inFile>>p->ID;inFile>>p->arrivetime;inFile>>p->servicetime;p->starttime=0;p->finishtime=0;p->state='F';p->next=NULL;if(head==NULL){head=p;q=p;time=p->arrivetime;}if(p->arrivetime < time)time=p->arrivetime;q->next=p;q=p;}若执行FCFS算法, 按顺序遍历链表void fcfs1(){int i;p=head;for(i=0;i<n;i++){if(p->state=='F')q=p;run_fcfs1(q);}p=p->next;}}void run_fcfs1(pcb *p1){time = p1->arrivetime > time? p1->arrivetime:time;p1->starttime=time;printf("\n现在时间: %d,开始运行作业%d\n",time,p1->ID);time+=p1->servicetime;p1->state='T';p1->finishtime=time;printf("ID号到达时间开始运行时间服务时间完成时间\n");printf("%d%10d%12d%12d%12d\n",p1->ID,p1->arrivetime,p1->starttime,p1->servicetime,p 1->finishtime);}若执行SPF算法, 每次都从链表头开始遍历链表, 找出arrivetime<=time并且运行时间最短的节点, 执行该节点进程, 最后再删除该节点。
进程调度算法模拟实验报告
竭诚为您提供优质文档/双击可除进程调度算法模拟实验报告篇一:操作系统进程调度算法模拟实验报告进程调度算法模拟专业:xxxxx学号:xxxxx姓名:xxx实验日期:20xx年xx月xx日一、实验目的通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。
二、实验要求编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法分别进行模拟调度。
三、实验方法内容1.算法设计思路将每个进程抽象成一个控制块pcb,pcb用一个结构体构建一个进程调度类。
将进程调度的各种算法分装在一个类中。
类中存在三个容器,一个保存正在或未进入就绪队列的进程,一个保存就绪的进程,另一个保存已完成的进程。
还有一个pcb实例。
主要保存正在运行的进程。
类中其他方法都是围绕这三个容器可以这个运行中的pcb展开。
主要用到的技术是sTL中的vector以维护和保存进程容器、就绪容器、完成容器。
当程序启动时,用户可以选择不同的调度算法。
然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。
进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。
判断进程容器中是否有新的进程可以加入就绪队列。
2.算法流程图主程序的框架:();//先来先服务();//最短进程优先调度//简单时间片轮转//最高优先数优先//输入进程信息();.m_waitQueue.empty()||.m_processQueue.empt() ();进程调度过程:;3.算法中用到的数据结构structfcfs{//先来先服务算法从这里开始charname[10];floatarrivetime;floatservicetime;float starttime;floatfinishtime;floatzztime;floatdqzztime;};//定义一个结构体,里面包含的有一个进程相关的信息4.主要的常量变量vector m_processQueue;//进程输入队列vector m_waitQueue;//进程就绪队列vectorm_FinishQueue;//完成队列vect(:进程调度算法模拟实验报告)or ::iteratorm_iter;//迭代器pcbm_runprocess;//运行中的进程intm_processcount;//进程数floatm_RunTime;//运行时间intm_tagIsRun;//是否在运行标志。
基于动态优先权的进程调度算法的模拟实现
在多道程序环境下, 进程的数目往往多于处理机数 目。这就要求 系统能按照某种算法, 动态的把处理机分配给就绪队列中 的进程, 使 之执行。因此, 处理机调度是操作系统设计的中心问题之一。进程调度 问 题 的 核 心 就 是采 用 什 么 样 的 算 法 把 处 理 机 分 配 给 进 程 。进 程 调 度 算 法 也 是 在 任 何 操作 系 统 中 必 须 配 置 的 一 级 调 度 。好 的 进 程 调 度 算 法 将 有效的提高系统中 各种资源利用 率, 减少处理机 的空闲时间, 避 免部 分 作 业 长 期 得不 到 处 理 机 响 应 等 情 况 的 发 生 。
1 . 动 态 优 先 权 调度 算 法 介 绍 动态优先权调度算法, 以就绪队列中各个进程的优 先权作为进程 调度的依据。各个进程的优先权在创建进程时所赋予, 随着进程的推 进 或 其 等 待 时间 的 增 加 而 改 变 。进 程 的 优 先 权 利 用 某 一 范 围 内 的 整 数 来表示。有的系统数值越小优先权越高, 如 Uni x 系统, 有的系统则反 之。采用该算法时, 每次总是在就绪队列中选择一个优 先权最高的进 程进行调度, 并将处理机分配给该进程。动态优先权调 度算法又分为 抢占式和非抢占式两种。本文采用 C 语言对非抢占式动态优先权调度 算 法 进 行 了 设 计和 实 现 。 2 . 算 法 的 设 计 思路 (1 ) 在算法的设计中各项原则。 首 先 规 定优 先 数 改 变 的 原 则 : ● 进程在就绪队列中呆一个时间片, 优先数增加 1 。 ● 进程每运行一个时间片, 优先数减 3。 其次, 算法的数据结构及操作采 用数组方式, 将输入的 N个 进程 的 PCB 信息保存到一个数组中。用 PCB 数组的插入和 删除动态地模 拟 进 程 调 度 过程 。 (2 ) 系统初始条件。 系统中设有 5 个进程, 每个进程产生时间, 优先级各不相同。利用 进程控制块 PCB 来 描述各个进程。进程控制块 PCB 包括以下字段: ● 进程标识数 ID; ● 进程优先数 PRIORITY, 并规定优先数越大的进程, 其优先权越 高; ● 进程已占用的 CPU 时间 CPUTIME; ● 进 程还 需占 用的 CPU 时间 ALLTIME。 当进 程 运行 完毕 时 , ALLTIME 变为 0 ; ● 进 程 的 阻 塞 时 间 STARTBLOCK, 表 示 当 进 程 再 运 行 STARTBLOCK 个时间片后, 进程将进入阻塞状态; ● 进程 被阻塞 的时间 BLOCKTIME, 表示已 阻塞 的进程 再等 待 BLOCKTIME 个时间片后, 进程将转换成就绪状态; ● 进程状态 STATE, 包括三种状态, 就绪态、阻塞态、完成态; CPU 处理进 程是从就绪队 列中选择当前各 进程中优先权最 大的 进程开始的。由于采用的是非抢占式调度算法, 则当前 进程执行完一 个 时 间 片 之 后有 以 下 几 种 情 况 : ① 当前进程结束则退出系统, 否则排到就绪队列尾 或根据阻塞时
操作系统进程调度模拟程序实验报告
操作系统进程调度模拟程序实验报告一、实验目的本次实验旨在通过编写一个模拟操作系统进程调度的程序,以加深对进程调度算法的理解。
二、实验内容1. 实现进程相关的数据结构:进程PCB(Process Control Block)。
2.实现进程的创建、撤销以及调度等操作函数。
3. 实现常见的进程调度算法:先来先服务(FCFS)、最短作业优先(SJF)、轮转调度(RR)、优先级调度(Priority)。
4.编写测试程序,验证实现的进程调度算法在不同场景下的表现。
三、实验过程及结果1.进程PCB的设计与实现进程PCB是进程的核心数据结构,用于存储和管理进程相关的信息,包括进程状态(就绪、运行、阻塞)、优先级、执行时间等。
2.进程的创建、撤销及调度函数的实现(1)进程创建函数:实现进程的创建,包括为其分配空间、初始化进程PCB等。
可以根据实际需求,设定进程的优先级、执行时间等属性。
(2)进程撤销函数:实现进程的撤销,包括释放其占用的资源、回收其使用的空间等。
(3)进程调度函数:根据不同的调度算法,实现进程的调度。
可以通过设置时间片大小、优先级设定等方式,实现不同调度算法的效果。
3.进程调度算法的设计与实现(1)先来先服务(FCFS)调度算法:按照进程到达的先后顺序,依次进行调度。
(2)最短作业优先(SJF)调度算法:根据进程的执行时间,选择执行时间最短的进程进行调度。
(3)轮转调度(RR)算法:按照时间片的大小进行调度,每个进程在一个时间片内执行,超过时间片后,暂停并进入等待队列,让其他进程执行。
(4)优先级调度(Priority)算法:根据进程的优先级,选择优先级最高的进程进行调度。
4.测试程序编写测试程序,模拟不同的进程到达顺序、执行时间和优先级等场景,验证不同调度算法的表现。
四、实验结果与分析通过测试程序的运行结果,观察不同调度算法的特点和效果。
可以得出以下结论:1.FCFS算法适用于进程到达时间差异较大的场景,保证了先到先服务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("该算法的平均带权周转时间为:%-.2f\t\n",avdqzztime);
getchar();
}
4.最高响应比优先算法
按照优先级从高到低依次执行程序。
算法:
int HRN(int pre)
{
int current=1,i,j;/* 优先权 =(等待时间+服务时间)/服务时间*/
3 详细设计与编码
3.1 模块设计
(1) 进入系统模块,进入登陆界面。
(3) 菜单选择模块。选择相应的进程调度方式,选择相应的数字,进入相应的功能。
(4) 算法模块。选择相应的进程调度算法。
(5) 显现输出模块。显示每种进程调度算法情况。
(6) 平均周转时间与平均带权周转时间的计算结果。
(7) 退出系统模块。
(3) 测试方案(三)结果。
输入测试进程数5,测试用例分别为(A 0 4),(B 1 3),(C 2 5),(D 3 2),(E 4 4),测试结果见图(图4-3.1,4-3.2,4-3.3时间片轮转调度算法)
图4-3.1 时间片轮转调度算法
图4-3.2 时间片轮转调度算法
图4-3.3 时间片轮转调度算法
Print(p,arrivetime,servicetime,starttime,finishtime,N1);
for(int k=0;k<=N1-1;k++)
{
sumzztime=sumzztime+p[k].zztime;
sumdqzztime=sumdqzztime+ p[k].dqzztime;
for(int k=0;k<=N-1;k++)
{
sumzztime=sumzztime+p[k].zztime;
sumdqzztime=sumdqzztime+ p[k].dqzztime;
}
avzztime=sumzztime/N;
printf("\n该算法的平均周转时间为:%-.2f\t",avzztime);
2.3短作业优先(SJF)算法
短作业优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
2.4最高优先权优先(HRRN)算法
优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
4.2 测试结果
(1) 测试方案(一)结果。
输入测试进程数5,测试用例分别为(A 0 4),(B 1 3),(C 2 5),(D 3 2),(E 4 4),测试结果见图(图4-1 先来先服务调度算法)
图4-1 先来先服务调度算法
由运行结果可以看出,短作业D的服务时间最短,但带权周转时间高达5.5,而长作业C的服务时间为5,带权周转时间仅为2,因此先来先服务算法比较有利于长作业,而不利于短作业
current=j; /* 找出比较早到达的一个*/
if(JCB[j].arrTime==JCB[current].arrTime) /* 如果同时到达*/
if(JCB[j].priority>JCB[current].priority)
current=j; /*找出服务时间比较短的一个*/
}
}
}
return current;/*返回当前作业*/
}
4 结果与分析
4.1 测试方案
(1) 测试方案(一)
在主界面输入1,选择先来先服务调度算法,然后输入进程数目5,然后输入各个进程信息,观察测试结果。
(2) 测试方案(二)
在主界面输入2,选择最短进程优先调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一。
2 设计原理
2.1先来先服务(FCFS)算法
每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列
2.2 时间片轮转法(RR)算法
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
{
if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )
current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/
}
else /* 如果作业是在上一个作业完成之后到达*/
{
if(JCB[j].arrTime<JCB[current].arrTime)
sort(p,N);
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
算法:
void tt(rr *p,int N2)
{ float sumzztime=0, sumdqzztime=0,avzztime=0,avdqzztime=0;int timeprice=0;
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0,lefttime=0;
操作系统课程设计报告
题目:进程调度算法的模拟实现_
专业
计算机科学与技术
学生姓名
班级
学号
指导教师
发放日期
2015.1.30
信 息 工 程 学 院
进程调度算法的模拟实现
1
选择一个调度算法,实现处理机调度,进程调度算法包括:先来先服务算法,短进程优先算法,时间片轮转算法,动态优先级算法。可选择进程数量,本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。
(3) 测试方案(三)
在主界面输入3,选择时间片轮转调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一和二。
(4) 测试方案(四)
在主界面输入4,选择时间片轮转调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一和二和三。
avdqzztime= sumdqzztime/N;
printf("该算法的平均带权周转时间为:%-.2f\t\n\n",avdqzztime);
}
2.短进程优先算法
先找到运行时间最短的程序,然后执行,再从剩余的程序中找到运行时间最短的在执行,依次每次都执行运行时间最短的,直到程序执行完毕。
算法:
void sjff(sjf *p,int N1)
ptt(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,avzztime,avdqzztime,lefttime,timeprice,N2);
printf("\n 综合信息为:\n");
Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N2);
}
for(i=0; i<N4; i++)
{
if(!JCB[i].finish)
{
current=i; /*找到第一个还没完成的作业*/
break;
}
}
for( j=i; j<N4; j++) /*和后面的作业比较*/
{
if( !JCB[j].finish) /* 还没完成(运行)*/
{
if(JCB[current].arrTime<=JCB[pre].finTime) /*如果作业在上一个作业完成之前到达*/
3.3 系统详细设计
(1) 系统主界面设计(包含登陆模块设计)
首先将各种进程调度算法放入不同的头文件,在主函数引用,是系统结构更加清晰。设置一个mean()方法,让用户选择不同的进程调度算法,mean()方法返回一个char类型字符,以便在主函数的switch语句中选择调用不同的进程调度方法。
(2) 系统模块
1.先来先服务算法
对于先到达的进程优先分配CPU,按照先来先服务的原则依次执行各进程。
算法:
void FCFS(fcfs *p,int N)
{ float sumzztime=0, sumdqzztime=0,avzztime,avdqzztime;
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;
for(int k=0;k<=N2-1;k++)
{
sumzztime=sumzztime+p[k].zztime;