进程调度算法的模拟实现
进程调度算法模拟以及代码实现原创
进程调度算法模拟以及代码实现原创实验一进程调度算法模拟,1.内容:设计一个简单的进程调度算法,模拟OS 中的进程调度过程;2.要求:① 进程数不少于5个;② 进程调度算法任选;可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3;③ 用C 语言编程;④ 程序运行时显示进程调度过程。
3.步骤:① 设计PCB 及其数据结构:进程标识数:ID进程优先数:PRIORITY (优先数越大,优先级越高)进程已占用时间片:CPUTIME ,每得到一次调度,值加1;进程还需占用时间片:ALLTIME ,每得到一次调度,该值减1,一旦运行完毕,ALLTIME 为0)进程队列指针:NEXT ,用来将PCB 排成队列进程状态:STATE (一般为就绪,可以不用)② 设计进程就绪队列及数据结构;③ 设计进程调度算法,并画出程序流程图;④ 设计输入数据和输出格式;结构格式:当前正运行的进程:0当前就绪队列:2,1,3,4⑤ 编程上机,验证结果。
4.提示:假设调度前,系统中有5个进程,其初始状态如下:ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 可否考虑用数组或链表去实现 CPUTIME 0 0 0 0 0 ALLTIME 3 2 6 3 4 STA TE ready Ready ready ready ready ① 以时间片为单位调度运行;② 每次调度ALLTIME 不为0,且PRIORITY 最大的进程运行一个时间片;③ 上述进程运行后其优先数减3,再修改其CPUTIME 和ALLTIME ,重复②,③ ④ 直到所有进程的ALLTIME 均变为0。
5.书写实验报告① 实验题目;② 程序中所用数据结构及说明;③ 清单程序及描述;④ 执行结果。
#include#include#include#include#include#define MINSIZE 5typedef enum STATE{ready,running,stop,}STA TE;typedef struct PCB{int pid;int priority;// 进程优先级int cputime;int alltime;STA TE state;struct PCB *prev;struct PCB *next;}PCB;typedef PCB Node;void init_process(Node *&head){head= (PCB *)malloc(sizeof(PCB));head->next = head;head->prev = head;}void push(Node *head,Node *pnode){if(head == NULL||pnode == NULL)return;Node * p = head->next;while(p!=head && pnode->priority < p->priority) {p= p->next;}pnode->next=p->prev->next;pnode->prev=p->prev;p->prev->next=pnode;p->prev = pnode;}void show_process(Node *head){if(head==NULL)return;Node *p = head->next;cout<<"当前的就绪队列有:"<<endl;< p="">cout<<"****************************进程调度表**************************"<<endl;< p="">while(p != head){cout<<endl;< p="">cout<<"进程号为"<pid<<" ";cout<<"优先级为"<priority<<" ";cout<<"剩余ALLTIME为"<alltime<<" ";cout<<"运行时间cputime为"<cputime<<" ";cout<<endl;< p="">cout<<endl;< p="">p = p->next;}cout<<"****************************************************** **********"<<="" p="">}Node * pop_front(Node *head){if(head==NULL||head->next == head)return NULL;Node * p = head->next;p->prev->next = p->next;p->next->prev = p->prev;return p;}PCB * create_process(int id,int priority,int cputime,int alltime,STATE state){PCB *p = (PCB *)malloc(sizeof(PCB));p->pid = id;p->cputime = cputime;p->alltime = alltime;p->priority = priority;p->state = state;p->next = NULL;p->prev = NULL;return p;}void destroy_head(Node *head){if(head==NULL)return;free(head);}void destroy(Node *pnode){if(pnode == NULL)return;Node *p = pnode;p->prev->next=p->next;p->next->prev=p->prev;cout<<"进程"<pid<<"已经销毁!"<<endl;< p=""> free(p);}void process_running(Node *head){if(head == NULL||head->next == head)return; Node *p = NULL;while(head->next!=head){p = head->next;p = pop_front(head);p->cputime += 1;p->alltime -= 1;p->priority -= 3;p->state = running;cout<<endl;< p="">cout<<"当前正在执行的进程为:"<pid<<endl;< p=""> if(p->priority<=0){p->priority =0;}cout<<endl;< p="">cout<<"进程号为"<pid<<" ";cout<<"优先级为"<priority<<" ";cout<<"剩余ALLTIME为"<alltime<<" ";cout<<"运行时间cputime为"<cputime<<" ";cout<<endl;< p="">cout<<endl;< p="">cout<<endl;< p="">cout<<endl;< p="">if(p->alltime<=0){p->state = stop;destroy(p);p = NULL;}if(p!=NULL){p->state = ready;push(head,p);}show_process(head);char c = getchar();}destroy_head(head);}int main(){PCB * head=NULL;init_process(head);PCB *p =NULL;int PRIORITY = 1;int CPUTIME = 0;int ALLTIME = 0;STA TE state = ready;int count = 0;int num = 0;cout<<"请输入当前运行的进程数,至少5个"<<endl;< p=""> cin>>num;for(int i = 0;i<num;++i)< p="">{count+=1;cout<<"请输入第"<<count<<"个进程的优先级和总运行时间alltime"<<endl;< p="">cin>>PRIORITY>>ALLTIME;p=create_process(count,PRIORITY,CPUTIME,ALLTIME,state);push(head,p);}show_process(head);process_running(head);return 0;}</count<<"个进程的优先级和总运行时间alltime"<<endl;<> </num;++i)<></endl;<></endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<>。
操作系统进程调度算法模拟实验报告
操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。
二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。
常见的调度算法有先来先服务(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)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。
操作系统-进程调度模拟算法附源码)
进程调度模拟算法课程名称:计算机操作系统班级:信1501-2实验者姓名:李琛实验日期:2018年5月1日评分:教师签名:一、实验目的进程调度是处理机管理的核心内容。
本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具体实施办法。
二、实验要求1.设计进程控制块PCB 的结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用的CPU 时间、进程到完成还需要的时间、进程的状态、当前队列指针等。
2.编写两种调度算法程序:优先数调度算法程序循环轮转调度算法程序3.按要求输出结果。
三、实验过程分别用两种调度算法对伍个进程进行调度。
每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。
(一)进程控制块结构如下:NAME——进程标示符PRIO/ROUND——进程优先数/进程每次轮转的时间片数(设为常数 2)CPUTIME——进程累计占用 CPU 的时间片数NEEDTIME——进程到完成还需要的时间片数STATE——进程状态NEXT——链指针注:1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;2.各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时给定。
(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:RUN——当前运行进程指针READY——就需队列头指针TAIL——就需队列尾指针FINISH——完成队列头指针(三)程序说明1. 在优先数算法中,进程优先数的初值设为:50-NEEDTIME每执行一次,优先数减 1,CPU 时间片数加 1,进程还需要的时间片数减 1。
在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加 2,进程还需要的时间片数减 2,并退出 CPU,排到就绪队列尾,等待下一次调度。
操作系统进程调度算法的模拟
操作系统进程调度算法的模拟其次,我们来介绍短作业优先(Shortest Job Next,SJN)算法。
SJN算法按照任务的运行时间来决定运行顺序,即先运行运行时间最短的进程。
该算法能够最大程度地减少平均等待时间,但对于长任务可能导致长时间的等待。
接下来,我们介绍轮转(Round Robin,RR)算法。
RR算法是一种基于时间片的调度算法,将CPU分为若干个时间片,并依次分配给各个进程。
当一个进程的时间片用完后,将其放入队列尾部,继续运行下一个进程。
该算法具有公平性和响应性较高的特点,但对于长时间运行的进程,可能会导致较大的上下文切换开销。
此外,还有最高响应比优先(Highest Response Ratio Next,HRRN)算法。
HRRN算法通过计算等待时间和服务时间的比例来决定运行顺序,即选取响应比最高的进程先执行。
该算法能够尽可能减少平均响应时间,但对于长任务可能存在运行时间过长的问题。
最后,我们介绍最短剩余时间优先(Shortest Remaining Time First,SRTF)算法。
SRTF算法是SJN算法的抢占版本,当有新进程到达时,会比较其剩余运行时间与当前运行进程的时间,如果新进程的剩余时间较短,则立即进行进程切换。
该算法能够最大程度地减少平均等待时间和响应时间,但对于切换开销较大。
针对这几种进程调度算法,我们可以通过编写模拟程序来验证其性能和特点。
首先,我们需要定义进程的数据结构,包括进程ID、到达时间、服务时间等属性。
然后,我们可以编写一个模拟函数来按照不同的算法进行调度,并统计平均等待时间、平均响应时间、吞吐量等指标。
通过对比不同算法在不同场景下的表现,可以评估其优劣。
总结起来,不同的进程调度算法有着各自的优缺点,根据实际需求选择合适的算法能够提高系统的性能和用户体验。
通过模拟和评估这些算法,我们可以更好地理解其原理和适用范围,并为实际系统的设计和优化提供参考。
希望这篇文章能够帮助你更好地理解和应用进程调度算法。
操作系统五种进程调度算法的代码
进程调度算法的模拟实现⏹实验目的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资源,而优先级低的进程无法得到执行,造成资源浪费。
其次,该算法没有考虑进程的等待时间和执行时间,容易导致饥饿现象的发生,即一些进程无法得到执行。
五、实验总结通过本实验,我们了解了动态优先权调度算法的工作原理和模拟方法。
进程调度算法模拟实验报告
进程调度算法模拟实验报告
进程调度是指控制多个进程按照一定的规则进行调度的过程,决定着进程在多道程序环境下的并发执行方式。
本次实验使用wiki提供的进程调度算法(短进程优先)来模拟实验,以下是实验的具体事项:
(1)模拟测试环境:Windows 10;
(2)运行环境:采用python 3.8+模拟。
(3)实验条件:三个进程:P1、P2、P3,它们的运行时间分别为12、6、10;
(4)实验步骤:
(a)首先显示所有进程的初始状态:
进程运行时间到达时间优先级进程状态
P1 12 0 1 就绪
P2 6 0 2 就绪
P3 10 0 3 就绪
(b)根据进程调度算法,模拟测试、实现进程的按时间片轮转:
(c)模拟运行完最后一个进程(P3),然后实现短进程优先:
2.实验结论
通过本实验,我们发现使用短进程优先进程调度算法能够高效地实现多个进程的并发执行,满足实际应用中对低延迟、高响应性的要求,其中最短进程最先执行,而最长进程最后执行,真正实现了“短进程优先”的思想。
操作系统进程调度算法模拟实验
操作系统进程调度算法模拟实验进程调度是操作系统中一个重要的功能,它决定了哪些进程能够获得处理器资源以及如何按照一定的策略来分配这些资源。
为了更好地理解进程调度算法的工作原理,我们可以进行一个模拟实验来观察不同算法的表现效果。
实验设想:我们设想有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`时,所有进程执行完毕。
使用动态优先权的进程调度算法的模拟实验
使用动态优先权的进程调度算法的模拟实验进程调度算法是操作系统中对进程进行调度的一种策略,动态优先权调度算法是其中一种常用的调度算法。
下面将对动态优先权调度算法进行模拟实验,并对实验结果进行分析。
首先,我们定义进程的属性包括进程编号、到达时间、服务时间、优先权和完成时间等。
动态优先权调度算法的基本思想是根据进程的优先权决定下一个被调度的进程,优先权越高,被调度的机会越大。
实验过程如下:1.创建一个进程队列,用来存放待调度的进程。
2.输入进程的个数,并依次输入每个进程的到达时间、服务时间和优先权。
3.将所有进程按照到达时间进行排序。
4.从排好序的进程队列中选择优先权最高的进程,即优先权最大的进程。
5.通过执行该进程进行模拟,更新进程队列中的进程信息。
6.根据更新后的进程信息,重新选择下一个被调度的进程。
7.重复步骤5和6,直到所有进程执行完毕。
对于每个进程,我们可以记录其等待时间、周转时间和带权周转时间。
等待时间即为该进程在就绪队列中等待的时间,周转时间是指从进程提交到完成的时间,即完成时间减去到达时间,带权周转时间是指每个进程的周转时间除以服务时间,用来评估进程的调度效果。
下面是一个动态优先权调度算法的模拟实验示例:```pythonclass Process:self.id = idself.priority = prioritydef __lt__(self, other):return self.priority < other.prioritydef dynamic_priority_scheduling(processes):queue = []while processes or queue:for process in processes:queue.append(process)processes.remove(process)queue.sort(reverse=True) # 根据进程的优先权进行排序if queue:process = queue.pop(0)for p in queue:if __name__ == '__main__':n = int(input("Enter the number of processes: "))processes = []for i in range(n):priority = int(input("Enter priority for process {}:".format(i+1)))dynamic_priority_scheduling(processes)```以上代码定义了一个Process类来表示进程,并使用动态优先权调度算法对进程进行调度。
实验一 进程调度模拟算法
实验一进程调度模拟算法
进程调度模拟算法是操作系统中的重要概念,它是指操作系统如何安排进程的执行顺序,以达到最优的系统性能。
常见的进程调度算法包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。
下面将分别介绍这些算法的原理和特点。
1. 先来先服务(FCFS)
先来先服务是最简单的进程调度算法,它按照进程到达的先后顺序进行调度,即先到达的进程先执行。
这种算法的优点是实现简单,适用于长作业,但是它存在一个致命的缺陷,即无法处理短作业的情况,因为长作业可能会占用大量的CPU 时间,导致短作业等待时间过长。
2. 短作业优先(SJF)
短作业优先是一种非抢占式的调度算法,它按照进程的执行时间长短进行调度,即执行时间短的进程先执行。
这种算法的优点是可以减少平均等待时间,但是它存在一个问题,即可能会导致长作业一直等待,因为短作业总是可以插队执行。
3. 时间片轮转(RR)
时间片轮转是一种抢占式的调度算法,它将CPU时间划分为若干个时间片,每个进程在一个时间片内执行一定的时间,然后被挂起,让其他进程执行,直到所有进程都执行完毕。
这种算法的优点是可以保证所有进程都能得到执行,但是它存在一个问题,即时间片的长度会影响系统性能,如果时间片太短,会增加上下文切换的开销,如果时间片太长,会导致长作业等待时间过长。
实验一介绍了三种常见的进程调度算法,它们各有优缺点,需要根据具体的应用场景选择合适的算法。
采用短进程优先算法模拟实现进程调度
采用短进程优先算法模拟实现进程调度短进程优先(SJF)是一种基于优先级的调度算法,其中短的进程优先
被调度。
在这种算法中,短暂的进程拥有优先级,因此优先调度。
SJF的工作原理是:在进程结束之前,它会检查新到达的进程,把它
们按照任务的执行时间排序,并把时间最短的进程调度到CPU中去执行。
这种算法的目的是让整个调度过程更有效率,减少CPU的空闲时间,由于
短进程可以被快速地完成,CPU在等待长进程完成的时间就可以更有效地
被利用。
短进程优先算法可以使用多种方法来实现,最常用的是基于优先级的
算法,即让较短的进程具有较高的优先级,让长进程具有较低的优先级。
在这种方法中,到达进程被排序,然后CPU根据优先级调度拥有最高优先
级的进程。
有的时候短进程优先算法也可以使用时间片轮转(Round Robin)的方法,即把每个进程分配一个时间片,时间片的大小取决于任务的执行时间。
在这种方法中,每个时间片之间调度一个进程,直到每个进程的时间片都
被使用完,然后重新调度下一个时间片。
SJF调度算法的优点是可以有效地减少CPU的空闲时间,可以提高整
个系统的性能,而且它可以运行时间较短的程序。
操作系统进程调度算法模拟
实验一进程调度算法模拟一.实验题目:设计一个简单的进程调度算法,模拟OS中的进程调度过程二.要求:①进程数不少于5个;②进程调度算法任选;可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3;③用C语言编程;④程序运行时显示进程调度过程。
三.程序中所用数据结构及说明:进程控制块结构体:typedef struct node1{int ID;//进程标识数int PRIORITY;//进程优先数int CPUTIME;//进程已占用时间片int ALLTIME;//进程还需占用时间片}Block,pcb;就绪进程链表节点:typedef struct node2{pcb data;struct node2 *next;}process;四.清单程序及描述:Procelink.h:typedef struct node1{int ID;//进程标识数int PRIORITY;//进程优先数int CPUTIME;//进程已占用时间片int ALLTIME;//进程还需占用时间片//char STATE;//进程状态//struct node *next;//进程队列指针}Block,pcb;typedef struct node2{pcb data;struct node2 *next;}process;void Initlink(process **PQ){/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/if((*PQ = (process *)malloc(sizeof(process))) == NULL) exit(1);(*PQ)->next = NULL; /*置链尾标记NULL */}int IsEmpty(process *PQ){if(PQ->next == NULL)return 1;else return 0;}void EnInitlink(process *PQ,pcb p){while(PQ->next!=NULL) PQ=PQ->next;process *temp=(process *)malloc(sizeof(Block));temp->data.PRIORITY=p.PRIORITY;temp->data.ID=p.ID;temp->data.CPUTIME=p.CPUTIME;temp->data.ALLTIME=p.ALLTIME;temp->next=PQ->next;PQ->next=temp;}//插入pcb DeInitlink(process *PQ) //选择优先数最小的出列{if(IsEmpty(PQ)){printf("所有进程已运行完!\n");exit(0);//退出}process *temp=(process *)malloc(sizeof(Block));temp = PQ->next;process *te=(process *)malloc(sizeof(Block));process *t=(process *)malloc(sizeof(Block));te= PQ->next;//优先数最小的进程while(temp->next != NULL){if(te->data.PRIORITY<temp->next->data.PRIORITY){te=temp->next;t=temp->next->next;PQ=temp;}temp=temp->next;}PQ->next=PQ->next->next;pcb pp=te->data;// free(temp);// free(t);//free(te);return pp;}//出队列void outid(process *PQ)//输出就绪队列函数{ printf("当前就绪队列为: ");while(!IsEmpty(PQ)){printf("%d ",PQ->next->data.ID);PQ=PQ->next;}printf("\n");}void dispatch(pcb p,process *PQ)//进程运行函数{if((p.ALLTIME)!=0){p.PRIORITY-=3;p.CPUTIME+=1;p.ALLTIME-=1;printf("进程%d运行\n",p.ID);//printf("进程优先数:%d 进程已占用时间片:%d 进程还需占用时间片:%d\n",p.PRIORITY,p.CPUTIME,p.ALLTIME);outid(PQ);//输出就绪队列}if((p.ALLTIME)==0){printf("进程%d 运行完成!\n",p.ID);return;//完成则不加入链表}EnInitlink(PQ,p); return;//运行之后再加入链表}os_1.cpp:#include<stdio.h>#include<stdlib.h>#include"procelink.h"void main(){process * PQ;int n;//n为进程数pcb pro1;Initlink(& PQ);printf("请输入进程个数:");scanf("%d",&n);printf("请输入各个进程的进程标识数ID,进程优先数,进程已占用时间片,进程还需占用时间片\n");for(int i=1;i<=n;i++){printf("第%d进程: ",i);scanf("%d %d %d %d",&pro1.ID,&pro1.PRIORITY,&pro1.CPUTIME,&pro1.ALLTIME);EnInitlink(PQ,pro1);}while(!IsEmpty(PQ)){dispatch(DeInitlink(PQ),PQ);//进程运行函数调用}if(IsEmpty(PQ))printf("所有进程已运行完!\n");free(PQ);//释放内存空间}五.执行结果:六.实验总结:通过这次操作系统中进程调度算法的模拟,使我对操作系统中的进程调度有了更清晰的认识和了解,程序中也有不足之处,该程序是顺序进链,出链时再选择优先数最大的进程。
操作系统实验报告-进程调度法的实现
操作系统实验报告进程调度算法的实现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();////如果进程运行过,现在但未运行,说明为阻塞。
操作系统实验一进程调度模拟算法
操作系统实验一进程调度模拟算法进程调度是操作系统中的一个重要功能,它负责为计算机系统中的各个进程分配CPU时间,使得所有进程都能够得到公平的执行机会。
进程调度算法的选择对于系统的性能和响应时间有着重要影响。
本文将介绍几种常见的进程调度算法,并进行模拟实验,分析它们的优缺点。
FCFS算法是最简单的调度算法之一,在该算法中,按照进程到达的先后顺序分配CPU时间。
FCFS算法的优点是简单易懂,公平性高,但其缺点是无法有效处理短作业和长作业混合的情况。
长作业会导致其他短作业等待时间过长,从而影响系统的响应时间。
2. 最短作业优先调度算法(Shortest Job First,SJF)SJF算法是一种非抢占式的调度算法,它会根据每个进程的执行时间来选择下一个执行的进程。
该算法的优点是可以最小化平均等待时间,但其缺点是无法预测进程的执行时间,如果估计不准确,会导致长作业等待时间过长。
3. 最高响应比优先调度算法(Highest Response Ratio Next,HRRN)HRRN算法是一种动态优先级调度算法,它根据每个进程的等待时间和服务时间的比值来选择最优的进程。
该算法考虑了进程的等待时间和服务时间的关系,能够相对公平地分配CPU时间,并且能够避免长作业的垄断。
4. 时间片轮转调度算法(Round Robin,RR)RR算法是一种抢占式的调度算法,它将所有进程按照到达顺序分配一个时间片,每个进程得到执行的时间是固定的。
当一个进程的时间片用完后,它会被放到就绪队列的末尾,等待下一次调度。
RR算法的优点是实现简单,能够保证所有进程能够得到公平的执行机会,但其缺点是当进程数量较大时,调度开销会增加。
在进程调度的模拟实验中,首先需要定义进程的数据结构,包括进程ID、到达时间、优先级、执行时间等属性。
然后,模拟进程的到达过程,可以使用随机数生成器模拟进程的到达时间和执行时间。
接下来,根据选择的调度算法,模拟进程的执行过程。
进程调度算法的模拟实现
课程设计报告课程名称:操作系统信息工程学院题目:进程调度算法的模拟实现一、设计目的本课程设计是学习完“计算机操作系统”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
本课程设计是在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个,也就是说能运行的进程数大于处理机个数。
为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。
要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。
二、设计内容(1)概述选择一个调度算法,实现处理机调度。
设计要求:1)进程调度算法包括:先来先服务算法,时间片轮转算法,短进程优先算法,动态优先级算法。
2)可选择进程数量3)本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。
(2)设计原理(1)先来先服务算法 FCFS每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列。
(2)时间片轮转法 RR系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
时间片的大小从几ms到几百ms。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
(3) 短进程优先算法 SPF短进程优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
(4A)动态优先级算法优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。
进程调度算法模拟实验报告
竭诚为您提供优质文档/双击可除进程调度算法模拟实验报告篇一:操作系统进程调度算法模拟实验报告进程调度算法模拟专业: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、基于Event-Driven(事件驱动)实现模拟进程调度,包括最短⼯作优先(SJF);最短剩余时间优先(SRTF);最⾼响应⽐优先(HRRF);优先级调度(Priority);轮转调度(RR)。
其中,SJF、SRTF为⾮抢占式调度,其余为抢占式调度。
2、要求⽤C语⾔实现这五种调度算法。
(⽅便起见,引⼊了C++头⽂件使⽤cout进⾏输出)基础知识⼀、进程1.1 进程的含义⼴义地说,进程是⼀个具有独⽴功能的程序关于某个数据集合的⼀次运⾏活动。
进程是⼀种抽象的概念,是对程序的抽象。
程序是⼀连串的代码或指令,是静态的东西,就像⼀本书放在那⾥。
那什么时候,程序会“动”起来呢?当然是我们执⾏了它。
⽐如⽤⿏标双击Word的快捷⽅式,那么过⼀会⼉,Word程序就会呈现在你眼前。
究其过程,不是“你”执⾏了程序,⽽是你让计算机执⾏了程序。
那计算机是怎么执⾏程序的呢?众所周知,这就要涉及到它的内部,甚⾄是它的⼤脑——中央处理器(CPU)了。
CPU是⼲什么的呢?CPU就是⽤来执⾏特定指令的。
上⾯说道程序就如同⼀本书,那么CPU的⾓⾊就相当于读者,书上的⽂字相当于指令,CPU“读”了“书”之后,有所感悟,就去做相当的事情,完成相当的任务。
打个⽐⽅,要以书来⽐喻指令,那么⽤菜谱来说就再贴切不过了。
以菜谱为例,⽐如现在要做⼀道菜,按照菜谱上的10个步骤来。
这⾥,做菜的时候,⾸先要准备⾷材、调料等,这都不是指令是什么回事?其实,计算机中的程序⽂件(可执⾏⽂件)除了包含代码之外,还包含数据,例如应⽤程序的图标等。
接下来,“你”——CPU,就要按照步骤做菜了。
做菜途中要等,就得等。
⼀系列步骤下来,最终,⼀道上好的菜摆在你眼前,⾊⾹味俱全。
这印证着定义中“具有独⽴功能”的含义,做⼀道特⾊的菜,就是独⽴完成⼀种任务。
1.2 进程的状态最简单的概括(三态模型)是:进程的状态分为——等待态、就绪态、运⾏态。
操作系统进程调度模拟程序实验报告
操作系统进程调度模拟程序实验报告一、实验目的本次实验旨在通过编写一个模拟操作系统进程调度的程序,以加深对进程调度算法的理解。
二、实验内容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)。
float sumzztime=0, sumdqzztime=0,avzztime,avdqzztime;
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N1);
首先将各种进程调度算法放入不同的头文件,在主函数引用,是系统结构更加清晰。设置一个mean()方法,让用户选择不同的进程调度算法,mean()方法返回一个char类型字符,以便在主函数的switch语句中选择调用不同的进程调度方法。
(2)系统模块
1.先来先服务算法
对于先到达的进程优先分配CPU,按照先来先服务的原则依次执行各进程。
current=j; /*找出比较早到达的一个*/
if(JCB[j].arrTime==JCB[current].arrTime) /*如果同时到达*/
if(JCB[j].priority>JCB[current].priority)
current=j; /*找出服务时间比较短的一个*/
}
}
}
return current;/*返回当前作业*/
3
3.1
(1)进入系统模块,进入登陆界面。
(3)菜单选择模块。选择相应的进程调度方式,选择相应的数字,进入相应的功能。
(4)算法模块。选择相应的进程调度算法。
(5)显现输出模块。显示每种进程调度算法情况。
(6)平均周转时间与平均带权周转时间的计算结果。
(7)退出系统模块。
3.3
(1)系统主界面设计(包含登陆模块设计)
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,因此先来先服务算法比较有利于长作业,而不利于短作业
在主界面输入3,选择时间片轮转调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一和二。
(4)测试方案(四)
在主界面输入4,选择时间片轮转调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一和二和三。
for(i=0; i<N4; i++)
{
JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; /*等待时间=上一个作业的完成时间-到达时间*/
JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
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);
操作系统课程设计报告
题目:进程调度算法的模拟实现_
专业
计算机科学与技术
学生姓名
班级
学号
指导教师
发放日期
2015.1.30
信息工程学院
进程调度算法的模拟实现
1
选择一个调度算法,实现处理机调度,进程调度算法包括:先来先服务算法,短进程优先算法,时间片轮转算法,动态优先级算法。可选择进程数量,本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。
avdqzztime= sumdqzztime/N2;
printf("该算法的平均带权周转时间为:%-.2f\t\n",avdqzztime);
getchar();
}
4.最高响应比优先算法
按照优先级从高到低依次执行程序。
算法:
int HRN(int pre)
{
int current=1,i,j;/*优先权=(等待时间+服务时间)/服务时间*/
(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时间片轮转调度算法
从多次运行结果来看,时间片轮转调度算法不同的时间片对结果有很大的影响。
}
4
4.1
(1)测试方案(一)
在主界面输入1,选择先来先服务调度算法,然后输入进程数目5,然后输入各个进程信息,观察测试结果。
(2)测试方案(二)
在主界面输入2,选择最短进程优先调度算法,然后输入进程数目5,然后输入各个进程信息,进程信息与测试方案(一)保持一致,观察测试结果,对比方案一。
(3)测试方案(三)
(4)测试方案(四)结果。
输入测试进程数5,测试用例分别为(A 0 4),(B 1 3),(C 2 5),(D 3 2),(E 4 4),测试结果见图(图4-4最高响应比优先调度算法)
图4-4最高响应比优先调度算法
由运行结果可以看出,该算法既照顾了短作业,有考虑了作业到达的先后次序,不会使长作业长期得不到服务。因此,该算法是一个很好的折衷
}
avzztime=sumzztime/N1;
printf("\n该算法的平均周转时间为:%-.2f\t",avzztime);
avdqzztime= sumdqzztime/N1;
printf("该算法的平均带权周转时间为:%-.2f\t\n\n",avdqzztime);
}
3.时间片轮转算法
按照轮转的次序分配给每个程序一定的时间执行,执行完成后执行后面的进程,依次循环执行直到所有进程执行完成。
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);
算法:
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;
sumdqzztime=sumdqzztime+ p[k].dqzztime;
}
avzztime=sumzztime/N2;
printf("\n该算法的平均周转时间为:%-.2f\t",avzztime);
{
if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )
current=j;/*找出到达时间在上一个作业完成之前,优先权高的作业*/
}
else /*如果作业是在上一个作业完成之后到达*/
{
if(JCB[j].arrTime<JCB[current].arrTime)
avdqzztime= sumdqzztime/N;
printf("该算法的平均带权周转时间为:%-.2f\t\n\n",avdqzztime);
}
2.短进程优先算法
先找到运行时间最短的程序,然后执行,再从剩余的程序中找到运行时间最短的在执行,依次每次都执行运行时间最短的,直到程序执行完毕。
算法:
void sjff(sjf *p,int N1)
算法:
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;
4.3
四种调度算法各有优劣。先来先服务算法比较有利于长进程,而不利于短进程,有利于CPU繁忙的进程,而不利于I/O繁忙的进程。短作业优先调度算法相比FCFS算法,该算法可改善平均周转时间和平均带权周转时间,缩短进程的等待时间,提高系统的吞吐量。缺点是对长进程非常不利,可能长时间得不到执行,且未能依据进程的紧迫程度来划分执行的优先级,以及难以准确估计进程的执行时间,从而影响调度性能。时间片轮转调度算法的特点是简单易行、平均响应时间短,但不利于处理紧急作业。在时间片轮转算法中,时间片的大小对系统性能的影响很大,因此时间片的大小应选择恰当。高响应比优先调度策略是对FCFS方式和SJF方式的一种综合平衡,同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。