按优先数调度算法实现处理器调度的模拟设计与实现

合集下载

基于-优先数时间片轮转调度算法调度处理器

基于-优先数时间片轮转调度算法调度处理器

题目4 基于优先数的时间片轮转调度算法调度处理器一、实验目的在采用多道程序设计的系统中,同时处于就绪态的进程往往有多个,当就绪态的进程数大于处理器的个数时,就需按照某种策略进行分配处理器。

本次设计模拟在单处理器情况下采用基于优先数的时间片轮转调度算法进行处理器调度,加深了解处理器调度工作过程。

二、实验容及要求1、设计一个程序实现基于优先数的时间片轮转调度算法调度处理器。

2、假定系统有5个进程,每个进程用一个进程控制块PCB开代表,进程控制块的结构如下图1.2所示:图1其中:进程名:作为进程的标识。

指针:进程按顺序排成循环链表,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址。

要求运行时间:假设进程需要运行的单位时间数。

已运行时间:假设进程已经运行的单位时间数,初值为0。

状态:可假设有两种状态,就绪状态和结束状态。

进程的初始状态都为就绪状态。

3、每次运行所设计的处理器调度程序调度进程之前,为每个进程任意确定它的要求运行时间。

4、此程序是模拟处理器调度,因此,被选中的进程并不实际启动运行,而是执行已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位时间。

.5、在所设计的程序中应有显示或打印语句,能显示或打印每次被选中的进程名以及运行一次后进程队列的变化。

6、为进程任意确定要求运行时间,运行所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。

7、设有一个就绪队列,就绪进程按优先数(优先数围0-100)由小到大排列(优先数越小,级别越高)。

当某一进程运行完一个时间片后,其优先级应下调(如优先数加2或3)。

8、例如一组进程如下表:三、实验报告1、程序中使用的数据结构及符号说明。

2、给出主要算法的流程图3、给出程序清单并附上注释4、打印程序运行时的初值和运行结果。

(运行一个进程输出一次结果)三、实验代码#include<stdio.h>#include<stdlib.h>#include<conio.h>#define getpch(type) (type*)malloc(sizeof(type)) //为进程创建一个空间struct worktime{float Tb; //作业运行时刻float Tc; //作业完成时刻float Ti; //周转时间float Wi; //带权周转时间};struct jcb {char name[10]; //作业名float subtime; //作业到达时间float runtime; //作业所需的运行时间char resource; //所需资源float Rp; //后备作业响应比char state; //作业状态int worked_time; //已运行时间struct worktime wt;int need_time; //要求运行时间int flag; //进程结束标志struct jcb* link; //链指针}*ready=NULL,*p;typedefstruct jcb JCB;float T=0;int N;JCB *front,*rear; //时间轮转法变量void sort(){JCB *first, *second;int insert=0; //插入数if((ready==NULL)||((p->subtime)<(ready->subtime))) {p->link=ready;ready=p;T=p->subtime;p->Rp=1;}else{first=ready;second=first->link;while(second!=NULL){if((p->subtime)<(second->subtime)){p->link=second;first->link=p;second=NULL;insert=1;}else{first=first->link;second=second->link;}}if (insert==0) first->link=p;}}void SJFget(){JCB *front,*mintime,*rear;int ipmove=0;mintime=ready;rear=mintime->link;while(rear!=NULL){if ((rear!=NULL)&&(T>=rear->subtime)&&(mintime->runtime)>(rear->runtime)) {front=mintime;mintime=rear;rear=rear->link;ipmove=1;}elserear=rear->link;}if (ipmove==1){front->link=mintime->link;mintime->link=ready;}ready=mintime;}void HRNget(){JCB *front,*mintime,*rear;int ipmove=0;mintime=ready;rear=mintime->link;while(rear!=NULL)if ((rear!=NULL)&&(T>=rear->subtime)&&(mintime->Rp)<(rear->Rp)) {front=mintime;mintime=rear;rear=rear->link;ipmove=1;}elserear=rear->link;if (ipmove==1){front->link=mintime->link;mintime->link=ready;}ready=mintime;}void creatJCB() //为每个作业创建一个JCB并初始化形成一个循环链队列{JCB *p,*l;int i=0;l = (JCB *)malloc(sizeof(JCB));printf("\n 请输入作业的个数:");scanf("%d",&N);printf("\n 作业号No.%d:\n",i);printf("\n请输入作业的名字:");scanf("%s",l->name);printf("\n请输入作业的时间:");scanf("%d",&l->need_time);l->state = 'r'; //作业初始状态为就绪l->worked_time = 0;l->link=NULL;l->flag=0;front=l;for(i =1;i<N;i++){p = (JCB *)malloc(sizeof(JCB));printf("\n 作业号No.%d:\n",i);printf("\n请输入作业的名字:");scanf("%s",p->name);printf("\n请输入作业的时间:");scanf("%d",&p->need_time);p->state='r';p->worked_time=0;p->flag=0;l->link=p;l=l->link;}rear=l;rear->link=front;}void output()//进程输出函数{int j;printf("name runtime needtime state\n");for(j=1;j<=N;j++){ printf(" %-4s\t%-4d\t%-4d\t%-c\n",front->name,front->worked_time,front->need_time,front->state);front=front->link;}printf("\n");}int judge(JCB *p) //判断所有进程运行结束{int flag=1,i;for(i=0;i<N;i++){if(p->state!='e'){flag = 0;break;}p=p->link;}return flag;}void RRget()//时间片轮转算法{JCB *s;int flag1=0;s=(JCB *)malloc(sizeof(JCB));s=front;printf("\n--------------------------------------------\n");output();printf("请输入任意一键继续\n");getch(); //按任意键继续s=front;while(flag1 != 1){if(s->state=='r'){s->worked_time++;s->need_time--;if(s->need_time==0)s->state='e';output();printf("请输入任意一键继续...\n");getch();}if(s->state=='e'&&s->flag==0){printf("进程%s已经运行完成!\n\n",s->name);s->flag=1;}s=s->link;flag1=judge(s);}printf("--------------------------------------------\n");}void input(){int i,num;printf("\n 请输入作业的个数:");scanf("%d",&num);for(i=0;i<num;i++){printf("\n 作业号No.%d:\n",i);p=getpch(JCB);printf("\n 输入作业名:");scanf("%s",p->name);printf("\n 输入作业到达时刻:");scanf("%f",&p->subtime);printf("\n 输入作业运行时间:");scanf("%f",&p->runtime);printf("\n");p->state='w';p->link=NULL;sort();}}int space(){int l=0; JCB* jr=ready;while(jr!=NULL){l++;jr=jr->link;}return(l);}void disp(JCB* jr,int select){if (select==3) printf("\n 作业到达时间服务时间响应比运行时刻完成时刻周转时间带权周转时间\n");else printf("\n 作业到达时间服务时间运行时刻完成时刻周转时间带权周转时间\n");printf(" |%s\t",jr->name);printf(" |%.2f\t ",jr->subtime);printf(" |%.2f\t",jr->runtime);if (select==3&&p==jr) printf("|%.2f ",jr->Rp);if (p==jr){printf("|%.2f\t ",jr->wt.Tb);printf(" |%.2f ",jr->wt.Tc);printf(" |%.2f\t",jr->wt.Ti);printf(" |%.2f",jr->wt.Wi);}printf("\n");}int destroy(){printf("\n 作业[%s] 已完成.\n",p->name);free(p);return(1);}void check(int select){JCB* jr;printf("\n **** 当前正在运行的作业是:%s",p->name);disp(p,select);jr=ready;printf("\n ****当前就绪队列状态为:\n");while(jr!=NULL){jr->Rp=(jr->runtime+T-jr->subtime)/jr->runtime;disp(jr,select);jr=jr->link;}destroy();}void running(JCB* jr){if (T>=jr->subtime) jr->wt.Tb=T;else jr->wt.Tb=jr->subtime;jr->wt.Tc=jr->wt.Tb+jr->runtime;jr->wt.Ti=jr->wt.Tc-jr->subtime;jr->wt.Wi=jr->wt.Ti/jr->runtime;T=jr->wt.Tc;}int main(){int select=0,len,h=0;float sumTi=0,sumWi=0;printf("\t---*****************---\n");printf("请选择作业调度算法的方式:\n");printf("\t1.FCFS 2.SJF 3.HRN 4.RR\n\n");printf("\t---*****************---\n");printf("请输入作业调度算法序号(1-4):");scanf("%d",&select);if (select==4){ creatJCB();RRget();}else{input();len=space();while((len!=0)&&(ready!=NULL)){h++;printf("\n 执行第%d个作业\n",h);p=ready;ready=p->link;p->link=NULL;p->state='R';running(p);sumTi+=p->wt.Ti;sumWi+=p->wt.Wi;check(select);if (select==2&&h<len-1) SJFget();if (select==3&&h<len-1) HRNget();printf("\n 按任意一键继续......");getchar();getchar();}printf("\n\n 作业已经完成.\n");printf("\t 此组作业的平均周转时间:%.2f\n",sumTi/h);printf("\t 此组作业的带权平均周转时间:%.2f\n",sumWi/h);getchar();}}四、运行结果截图。

设计一个按优先数调度算法实现处理器调度的程序改

设计一个按优先数调度算法实现处理器调度的程序改

设计一个按优先数调度算法实现处理器调度的程序改按优先数调度算法实现处理器调度的程序设计主要包括以下几个步骤:1.定义进程控制块(PCB)数据结构:PCB用于记录每个进程的相关信息,包括进程标识符(PID)、优先数、状态等。

2.定义就绪队列和等待队列:就绪队列存放处于就绪状态的进程,等待队列存放处于等待状态的进程。

3.初始化进程控制块和队列:创建所有需要执行的进程,并初始化对应的PCB和队列。

4.实现优先数调度算法:在每个时间片结束时,根据进程的优先数从就绪队列中选取优先级最高的进程执行。

如果有多个进程优先级相同,则采用先来先服务(FCFS)算法。

5. 进程调度过程:根据进程的状态和优先级进行调度。

进程可能处于以下三种状态之一:就绪状态(ready)、执行状态(running)和等待状态(waiting)。

6. 进程状态切换:在进程调度过程中,根据进程状态的改变,进行相应的状态切换操作。

例如,当一个进程执行完毕时,将其状态设置为已完成(terminated)。

下面是一个按优先数调度算法实现处理器调度的示例程序:```python#定义进程控制块(PCB)数据结构class PCB:def __init__(self, pid, priority):self.pid = pid # 进程标识符self.priority = priority # 优先数self.status = 'ready' # 进程状态,默认为就绪状态#定义就绪队列和等待队列ready_queue = []waiting_queue = []#初始化进程控制块和队列def init(:processes =PCB(1,3),PCB(2,1),PCB(3,2)for process in processes:ready_queue.append(process)#实现优先数调度算法def priority_scheduling(:while len(ready_queue) > 0:#根据优先级从就绪队列中选取优先级最高的进程selected_process = max(ready_queue, key=lambda x: x.priority) ready_queue.remove(selected_process)#执行选取的进程print(f"Process {selected_process.pid} is running...")#进程状态改变:从执行状态变为就绪状态selected_process.status = 'ready'ready_queue.append(selected_process)#模拟时间片结束if len(ready_queue) > 0:print("Time slice ends. Switching to the next process...")print("All processes have been executed.")#运行进程调度程序initpriority_scheduling```在上述示例程序中,我们首先定义了一个`PCB`类来表示进程控制块。

设计一个按优先数调度算法实现处理器调度的程序

设计一个按优先数调度算法实现处理器调度的程序

设计一个按优先数调度算法实现处理器调度的程序处理器调度是操作系统中重要的任务之一,负责决定在多个可执行任务之间如何分配处理器时间。

在处理器调度中,按优先数调度算法是一种常见的策略。

本文将介绍如何设计一个按优先数调度算法实现处理器调度的程序。

一、定义任务在实现处理器调度之前,首先需要定义可执行的任务。

一个任务可以由多个属性来描述,包括优先级、到达时间、执行时间等。

在按优先数调度算法中,每个任务都有一个优先级,优先级越高表示任务的重要性越高。

同时,每个任务还有一个到达时间,即任务进入调度器的时间点。

最后,每个任务还有一个执行时间,表示任务完成所需要的时间。

二、设计数据结构为了表示任务,我们可以使用一个Task类来封装任务的属性,例如:```class Taskint priority; // 优先级int arrivalTime; // 到达时间int executionTime; // 执行时间};```此外,为了管理所有待调度的任务,需要使用一个队列来存储任务。

我们可以使用优先队列(Priority Queue)来实现这个队列,其中任务按照优先级的顺序排列。

当一个任务到达时,将其插入到优先队列中;当处理器空闲时,从优先队列中选择优先级最高的任务进行调度。

三、实现调度算法接下来,需要实现按优先数调度算法。

按照该算法的步骤,当一个任务到达时,将其插入到优先队列中。

当处理器空闲时,从队列中取出优先级最高的任务,并执行该任务。

如果任务未完成,则将其重新插入队列中。

如果所有任务都已完成,则调度任务结束。

以下是一个示例的按优先数调度算法实现:```PriorityQueue<Task> taskQueue; // 优先队列,按优先级排序任务void schedule(int currentTime)if (taskQueue.isEmpty()System.out.println("Processor is idle.");return;}Task currentTask = taskQueue.poll(; // 取出优先级最高的任务int remainingTime = currentTask.executionTime - (currentTime - currentTask.arrivalTime);if (remainingTime > 0)currentTask.executionTime = remainingTime;taskQueue.add(currentTask); // 将未完成的任务重新插入队列中} else}```四、模拟调度过程最后,我们可以编写一个简单的模拟函数来模拟调度器的执行过程:```void simulatint currentTime = 0; // 当前时间while (!taskQueue.isEmpty()while (!taskQueue.isEmpty( && taskQueue.peek(.arrivalTime <= currentTime)Task newTask = taskQueue.poll(;System.out.println("New task with priority " +newTask.priority + " arrived at " + currentTime + ".");taskQueue.add(newTask); // 插入新到达的任务}schedule(currentTime);currentTime++;}```在模拟函数中,我们不断地增加当前时间,直到所有任务都已完成。

设计一个按优先数调度算法实现处理器调度的进程

设计一个按优先数调度算法实现处理器调度的进程

设计一个按优先数调度算法实现处理器调度的进程
一.处理器调度的简介
处理器调度是指在若干作业并发处理时,对处理器分配工作的动态过程。

它是操作系统中的一种重要技术,其主要功能是控制并发作业的执行,使他们得到公平的分配,正确的完成执行,以达到有效利用处理机资源,
提高系统的工作效率。

处理器调度技术包括:处理机调度算法、处理机调
度技术等。

处理机调度算法就是基于计算机系统的工作机制,根据不同的作业在
处理机上的执行情况,系统在不同的阶段,根据量的不同,采用不同的算法,按优先级、分时等原则进行处理机调度,使作业在不同的阶段得到公
平的分配,以达到有效利用处理机资源,提高系统工作效率的目的。

按优先数调度算法( Priority Scheduling Algorithm )是指根据作
业的优先级先后来分配处理机资源,使作业能够按照优先级依次被处理,
使得系统性能有所提高。

1.处理器调度的算法流程
按优先数调度算法的处理器调度的过程,如下:
首先,从队列中取出一个作业,检查是否具有最高优先级,如果是,
则将其分配给处理机,否则,该作业放回队列,继续下一步判断;
其次,在没有作业可以处理时,处理机将停止运转。

操作系统实验一选择一个调度算法,实现处理器调度。

操作系统实验一选择一个调度算法,实现处理器调度。

操作系统实验一报告一.实验内容选择一个调度算法,实现处理器调度。

二.实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下处理器调度,帮助学生加深了解处理器调度的工作。

三.实验要求设计一个按优先数调度算法实现处理器调度的进程。

YNY上面的过程只给出了 那个寻找以及排序的大体过程,具体的过程太多画不下。

寻找优先级最高节点是否最高优先级优先数减一 运行时间减一继续寻找节点 运行时间是否为0删除节点 按优先级重新排序四.实验程序这个实验的程序使用的visual studio 2008 的c++ win控制台写的,所以可能老师的电脑里面。

我把程序结果贴在后面,还有第二题我也做了,但只要求写一个,那么。

// 操作系统实验.cpp : 定义控制台应用程序的入口点。

//#include"stdafx.h"#include<iostream>#include<string>using namespace std;static int num=0;class proc{private: string procname;proc * next;int time;int priority;char state;public:proc(){proc*next=new proc();}proc(string pr,proc * ne,int ti,int pri,char st):procname(pr),next(ne),time(ti),priority(pri),state(st){}~proc(){}void setnext(proc * n){next=n;}void setprocname(string s){procname=s;}void settime(int t){time=t;}void setpriority(int s){priority=s;}void setstate(char s){state=s;}proc * getnext(){return next;}string getprocname(){return procname;}int gettime(){return time;}int getpriority(){return priority;}char getstate(){return state;}};class dui{private:proc * first;public:dui(){first=new proc();}dui(proc*f){ first=f;}int getfirst_time(){return first->gettime();}void show(proc*p){cout<<"名字"<<"下个节点的名字"<<" "<<"时间"<<"优先级"<<"状态"<<endl;while(p){cout<<p->getprocname ()<<" "<<((p->getnext()!=NULL)?p->getnext ()->getprocname ():"NU")<<" "<<p->gettime ()<<" "<<p->getpriority()<<" "<<((p->gettime ()!=0)?p->getstate():'E')<<endl;p=p->getnext ();}cout<<"..............................................................."<<endl;}void process1(){proc*pp=first;show(first);while( first->getnext ()!=NULL){proc*pp_next=pp->getnext ();int a,b;a=pp->getpriority()-1;b=pp->gettime()-1;pp->setpriority(a);pp->settime(b);if(b==0){show(pp);pp =first=first->getnext ();continue;}int prio1,prio2;prio2=first->getnext ()->getpriority();prio1=pp->getpriority();if(prio1>=prio2){show(pp); }else{while(prio1<prio2){first=first->getnext ();if(first->getnext ()==NULL){first->setnext (pp);pp->setnext (NULL);break;}else prio2=first->getnext ()->getpriority(); }if(prio1>=prio2){pp->setnext (first->getnext ());first->setnext (pp);show(pp_next);}if(pp->getnext ()==NULL){show(pp_next); }pp=pp_next;first=pp;}}if(first->getnext ()==NULL)while(first->gettime()>0){int t=first->gettime()-1;first->settime(t);show(first);cout<<"五";}}};int main(){proc * A=new proc("p1",NULL,2,1,'R');proc * B=new proc("p2",NULL,3,5,'R');proc * C=new proc("p3",NULL,1,3,'R');proc * D=new proc("p4",NULL,2,4,'R');proc * E=new proc("p5",NULL,4,2,'R');B->setnext (D);D->setnext (C);C->setnext (E);E->setnext (A);dui aaa(B);//aaa.setfirst (B);aaa.process1 ();cin.get();return 0 ;}五.实验结果六.实验总结这个说来惭愧啊,因为自己的这个程序早就做好了,就是对进程啊什么的还不是很了解,因为自己不是学习认真的那一种,这个老师的那些问题把我给郁闷了好多天啊!悲剧!以后还是要好好学习,课后不能再玩得那么狠了!通过这个程序,我体会到了些程序前先把图给画出来是都么好的习惯啊!以后要多多用!还有我的电脑因为不知道什么病毒,c盘重还原了一下,原来在桌面的那个报告比这个更详细,这次因为不能上传加上自己没有保存就丢失了那个报告,临时写的这个希望老师不要怪我!!最后希望老师弄一下,最起码我们可以在机房里上传到ftp中!!!。

设计一个按优先数调度算法实现处理器调度的程序改

设计一个按优先数调度算法实现处理器调度的程序改

设计一个按优先数调度算法实现处理器调度的程序改在设计一个基于优先数调度算法实现处理器调度的程序时,我们需要考虑以下几个方面:进程的创建与调度、进程的状态和属性、优先数的计算和更新、进程的切换和执行。

1.进程的创建与调度:-创建进程:根据用户需求或系统事件,创建新的进程。

可以为每个进程分配一个唯一的进程ID。

-进程调度:选择下一个要执行的进程,通过优先数来确定优先级最高的进程。

2.进程的状态和属性:-进程状态:每个进程可以处于就绪态、执行态或阻塞态。

就绪态表示进程已经被加载到内存中,可以随时运行;执行态表示进程正在执行;阻塞态表示进程因为等待一些事件而无法执行。

-进程属性:每个进程可能有一些属性,如进程优先级、进程类型等。

3.优先数的计算和更新:-优先数计算:根据一定的算法计算出每个进程的优先数,例如可以根据进程的类型、等待时间、进程优先级等。

-优先数更新:随着时间的推移,进程的优先数可能会发生变化,需要定期更新。

4.进程的切换和执行:-进程切换:当一个进程的执行时间片用完或者阻塞时,需要选择下一个要执行的进程。

优先数调度算法会选择优先级最高的进程作为下一个执行的进程。

-进程执行:为了模拟处理器的执行,可以将进程的执行时间限制在一个固定的时间片内,然后切换到下一个进程。

下面是一个基于优先数调度算法的处理器调度程序的代码示例:```pythonclass Process:def __init__(self, pid, priority):self.pid = pidself.priority = priorityself.state = "ready"def execute(self):print("Process", self.pid, "is executing.")def block(self):self.state = "blocked"def unblock(self):self.state = "ready"class Scheduler:def __init__(self):self.processes = []def add_process(self, process):self.processes.append(process)def remove_process(self, process):self.processes.remove(process)def calculate_priority(self, process):# calculate priority based on process attributesreturn process.prioritydef update_priorities(self):for process in self.processes:process.priority = self.calculate_priority(process)def schedule(self):self.update_prioritiessorted_processes = sorted(self.processes, key=lambda p: p.priority, reverse=True)next_process = sorted_processes[0]if next_process.state == "ready":next_process.executeelif next_process.state == "blocked":next_process.unblocknext_process.executeif __name__ == "__main__":scheduler = Scheduler# Create processesp1 = Process(1, 2)p2 = Process(2, 1)p3 = Process(3, 3)p4 = Process(4, 5)# Add processes to schedulerscheduler.add_process(p1)scheduler.add_process(p2)scheduler.add_process(p3)scheduler.add_process(p4)# Schedule processesscheduler.schedule```在上述代码示例中,我们创建了一个`Process`类来表示进程,并设置了进程的属性如进程ID、优先级和状态。

按优先数调度算法实现处理器调度

按优先数调度算法实现处理器调度

_proc pr3=Creat("p3",1,3);
Insert(&pr3);
_proc pr4=Creat("p4",2,4);
Insert(&pr4);
_proc pr5=Creat("p5",4,2);
Insert(&pr5);
三、背景材料
(一)设计一个按优先数调度算法实现处理器调度的程序
[提示]:
1、 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
指针
要求运行时间
优先数
状态
进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
3、为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例如:
队首标志
K2
K1 P1 K2 P2 K3 P3 K4 P4 K5 P5
0 K4 K5 K3 K1
2 3 1 2 4
root->next=NULL;//指向第一个进程
//创建几个进程,并插入就绪队列
_proc pr1=Creat("p1",2,1);
Insert(&pr1);
_proc pr2=Creat("p2",3,5);
Insert(&pr2);
优先数-1
要求运行时间-1
来模拟进程的一次运行。

设计一个按优先数调度算法实现处理器调度的进程

设计一个按优先数调度算法实现处理器调度的进程

实验报告2012 ~2013 学年第一学期课程操作系统原理实验名称设计一个按优先数调度算法实现处理器调度的进程小组成员阮广杰、陈智磊、高天翔、董云鹏专业班级10级计本三班指导教师屠菁2012 年11 月29号操作系统实验报告实验目的:在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下处理器调度,设计一个按优先数调度算法实现处理器调度的进程,通过运行程序,能够清楚的表述优先数调度的过程,进一步掌握优先数调度算法的实现。

实验内容:设计一个按优先数调度算法实现处理器调度的进程。

实验步骤:概要设计:(1)假定系统有5个进程,每个进程用一个PCB来代表。

PCB的格式为:进程名、指针、要求运行时间、优先数、状态。

进程名——P1~P5。

指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB 的首地址。

要求运行时间——假设进程需要运行的单位时间数。

优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。

状态——假设两种状态,就绪,用R表示,和结束,用E表示。

初始状态都为就绪状态。

(2) 每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

(3) 处理器总是选队首进程运行。

采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。

(4) 进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。

(5) 若就绪队列为空,结束,否则,重复(3)。

详细设计:1、程序中使用的数据结构及符号说明:typedef struct PCB{char name[50];// 进程名以序号代替LPVOID lp;// 指向进程的长指针,模拟的,所以没用到。

int tm;// 需要运行的时间int prior;// 初始的优先数char state;// 状态struct PCB *next; // 指向下一个PCB块}PCB;3、源程序清单://Main.cpp// prior.cpp : Defines the entry point for the application.//#include "stdafx.h"#include "resource.h"#include "MainDlg.h"#include <COMMCTRL.H>int APIENTRY WinMain(HINSTANCE hInstance,//当前进程句柄HINSTANCE hPrevInstance,// 前次进程句柄LPSTR lpCmdLine,// 启动信息int nCmdShow)//{//Enable IPAddress、Calendar.etcInitCommonControls();//系统调用函数DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc);return 0;}//MainDlg.cpp#include "stdafx.h"#include <windows.h>#include <windowsx.h>#include "resource.h"#include "MainDlg.h"#include "cross.h"#include "time.h"int MAX_NUM;// 用户输入进程数char *pst1="------------------------------------------------------------------------------\r\n"; char *pst2="=======================================\r\n";typedef struct PCB{char name[50];// 进程名以序号代替LPVOID lp;// 指向进程的长指针,模拟的,所以没用到。

Pascal模拟实现按优先数进行处理机调度

Pascal模拟实现按优先数进行处理机调度

实习作业:设计一个实现按优先数进行处理机调度的方案一.设计时间:2001年10月2日二.功能说明:●采用静态优先数个调读策略,是不可抢占的;●数据结构说明:对每一个进程的PCD,采用记录类型。

此纪录包括进程名(name,字符串型)优先级数(priority整数型)状态(status枚举类型)进程地址(address数型)相关信息(messages数型)及指向下一进程PCB的指针(link指针类型);●进程调度的实现:①对每一个进程的就绪对列固定进程个数(此处为三个)共有若干(此处为两个)就绪对列。

就绪对列由子程序(create)自动生成,为进程调度算法作好准备;②每一个进程的优先级数是事先确定下来的(此处用随机函数产生一个1-100的整数);③当进程调度开始后,利用查寻子程序(find)找出就绪队列中优先级数最大的进程,并把其从就绪队列删除;在进程进入处理机过程中,它可以调用阻塞原语,使自己处于等待状态,同时把它插入等待对列,由waitp子程序实现,同时进程的优先级数被改变。

当然,进程也可以不用阻塞厚语,当一个就绪队列的的所有进程执行过后,把刚插入等待对列(whead)中的进程再插入的当前就绪队列,直到当前对列的所有进程全部运行结束再转入下一就绪对列的处理。

三.程序流程图:(如图1)四.设计总结:本设计只是简单的模拟了按优先数进行处理机调度的方案,不能动态的,完美的进行演示,因此还需进一步改进。

五.PASCAL源程序如下:program Zpcb(input,output);typestatus_type=(ready,wait,run);pointer=^pcb;pcb=recordname:string[10];priority:integer;address:integer;status:status_type;messages:integer;link:pointerend;varr,i,j,w,n:integer;rhead:array [1..3] of pointer;p,q,whead:pointer;function rnd(var r:integer):integer;constl=20;c=217;m=1024;beginr:=(r*l+c) mod m;rnd:=round(r/m*100)end;procedure create(var p:pointer;var r:integer;n,m:integer);varb,c:char;h:integer;beginc:=chr(n+ord('0'));b:=chr(m+ord('0'));p^.name:='PCB-'+c+'-'+b;p^.priority:=rnd(r);p^.address:=10+100*n;p^.status:=ready;h:=rnd(r);if h<50 then p^.messages:=0else p^.messages:=1;p^.link:=nilend;procedure find(var p:pointer;var rhead:pointer);varq,r,h:pointer;beginp:=rhead;q:=rhead^.link;h:=nil; r:=rhead;while (q<>nil) doif q^.priority>p^.prioritythenbeginh:=r;p:=qendelsebeginr:=q;q:=q^.linkend;if h<>nil then h^.link:=p^.linkelse rhead:=p^.linkend;procedure waitq(var p:pointer;var whead:pointer;var r:integer); vart,h:pointer;beginp^.link:=nil;p^.priority:=rnd(r);p^.messages:=0;p^.status:=wait;if whead=nil then whead:=pelsebeginh:=whead;t:=whead^.link;while (t<>nil) dobeginh:=t;t:=t^.linkend;h^.link:=pendend;procedure change(var rhead:pointer;var whead:pointer;var w:integer);var q:pointer;beginq:=whead;while (q<>nil)dobeginq^.status:=ready;q:=q^.linkend;rhead:=whead;whead:=nil;w:=0end;procedure wtime(n:integer);const h=3000;vart,j,i,x:integer;beginfor i:=1 to n dofor x:=1 to 5000 dofor j:=1 to h do t:=0end;beginr:=46;for i:=1 to 2 dobeginnew(p);rhead[i]:=p;for j:=1 to 3 dobegincreate(p,r,i,j);q:=p;new(p);q^.link:=pend;q^.link:=nilend;for i:=1 to 2 dobeginwriteln;writeln(' Queue ',i,' start......');w:=0;while (rhead[i]<>nil)or(w<>0) dobeginfind(p,rhead[i]);p^.status:=run;writeln(' ',p^.name,' is running......');if p^.messages=1 thenbeginn:=5;w:=w+1;wtime(n);waitq(p,whead,r);writeln(' ',p^.name,' is waitting......')endelsebeginn:=15;wtime(n);writeln(' ',p^.name,' is over!')end;if (rhead[i]=nil)and(w<>0) then change(rhead[i],whead,w) endend;writeln(' Over!')end.图1实习作业用某种高级程序设计语言模拟按优先数进行处理机调度(PASCAL语言实现)九九级计算机教育班张成文二○○一年十月六.执行结果如下:。

CPU调度算法的模拟实现课程设计

CPU调度算法的模拟实现课程设计

设计 1 CPU 调度算法的模拟实现一、设计目的1、深入理解CPU调度的四种算法:先到先服务算法FCFS、非抢占最短作业优先算法SJF、可抢占优先权调度算法PRIOR、时间片轮转算法RRO2、利用程序设计语言编写算法,模拟实现先到先服务算法FCFS、非抢占最短作业优先算法SJF、可抢占优先权调度算法PRIOR、时间片轮转算法RR O3、针对模拟进程,利用CPU调度算法进行调度。

4、进行算法评价,计算平均周转时间和平均等待时间。

二、设计要求1、调度所需的进程参数由输入产生:采用手工输入参数或产生随机数的方法。

2、针对各个进程模拟算法,输出进程调度结果,包括执行算法的等待时间和周转时间。

3、根据调度结果对算法进行调试分析,纠正程序错误并对算法进行优化,总结并输出算法评价指标。

三、设计说明(含系统框图和(或)主要算法的流程图)(1)优先权调度#include "stdio.h"#include "stdlib.h"#define N 10//#define M 10typedef struct{int m;//int flag;int priority;// 优先级顺序float zhixing;float zhouzhuan;float dq_zhouzhuan;}process;//int flag=0;// 标志已经执行个进程的个数//float time=0;// 当前共执行的时间void main(){//int plag=0;float time=0;int n;int i,j,temp;process fcfs[N],*p[N],*q;float time_zhouzhuan=0,wtime_zhouzhuan=0;//输入printf(" 请输入进程的个数:");scanf("%d",&n);for(i=0;i<n;i++){fcfs[i].m=i+1;//fcfs[i].linshi=0;//fcfs[i].flag=0;Printf("请输入进程%d所需的执行时间和进程的优先级:",fcfs[i].m); scanf("%f %d",&fcfs[i].zhixing,&fcfs[i].priority);}Printf("haha");for(i=0;i<n;i++){p[i]=(process*)malloc(sizeof(process));//分配空间P[i]=&fcfs[i];}//按优先级别的排序for(j=0;j<n-1;j++){printf("ok");// 有问题temp=j;for(i=j+1;i<n;i++){printf("ky");if(p[i]->priority>p[temp]->priority)temp=i;}printf("#####");q=p[j];// 交换p[j]=p[temp];p[temp]=q;}printf("he");//优先级算法for(i=0;i<n;i++){ time+=p[i]->zhixing;p[i]->zhouzhuan=time; p[i]->dq_zhouzhuan=p[i]->zhouzhuan/p[i]->zhixing; }for(i=0;i<n;i++){time_zhouzhuan+=p[i]->zhouzhuan; wtime_zhouzhuan+=p[i]->dq_zhouzhuan;} time_zhouzhuan/=n;wtime_zhouzhuan/=n;//输出结果Printf("静态优先级算法的进程的执行顺序为:∖n");for(i=0;i<n;i++){Printf("%d ",P[i]->m);}Printf("∖n 平均周转时间为%f",time_zhouzhuan);Printf("∖n 带权平均周转时间为%f",wtime_zhouzhuan);} (2) FCFS 和SJF 综合#include "stdio.h"#define getjcb(tyPe) (tyPe*)malloc(sizeof(tyPe))#define NULL 0/* 作业 名 *//* 作 业状态 *//* 提交 时间 *//* 优先权 *//* 开始运 行时间 *//* 完成 时间 */ /* 周转时间 */ /* 带权周 转时间 */ /* 作业所需 运行时间 */ char resource[10]; /* 所需 资源 */struct jcb *link; /* 结构体指 针 */ } *p,*q,*head=NULL;typedef struct jcb JCB; inital(){ int i;printf("\nInput jcb num\n"); scanf("%d",&n);printf("Input\nname\tts\tntime\tresource\n"); for(i=0;i<n;i++){p=getjcb(JCB);scanf("%s\t%d\t%d\t%s",&p->name,&p->ts,&p->ntime,&p->resource);p->state='W';p->link=NULL;if(head==NULL) head=q=p;else{q->link=p;q=p; } }}fileinput(){int n=0,time=0;floateti,ewi; struct jcb{ charname[10]; char state; int ts; float super; int tb;int tc;float ti;float wi;int ntime;FILE *fp; int i;if((fp=fopen("os2.txt","r"))==NULL) printf(" open error!") ;fscanf(fp,"%d\n",&n);for(i=0;i<n;i++){p=getjcb(JCB); scanf(fp,"%s%d%d%s",&p->name,&p->ts,&p->ntime,&p->resource); p->state='W';p->link=NULL;if(head==NULL) head=q=p;else{q->link=p; q=p;}}fclose(fp);}void print(JCB *pr,int m){JCB *p;printf("\ntime=%d",time);if(m==3){printf("\nname\tstate\tts\tntime\tsuper\tsource\ttb\ttc\tti\twi\n");printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti, pr->w i); }else { printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi); }p=head;do{ if(p->state=='W')if(m==3){ printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",p->name,p->state,p->ts,p->ntime,p->super,p->resource);}else{printf("%s\t%c\t%d\t%d\t%s\n",p->name,p->state,p->ts,p->ntime,p->resource); } p=p->link;}while(p!=NULL);p=head;do{if(p->state=='F') if(m==3){printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti,p->wi);} else{printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",p->name,p->state,p->ts,p->ntime,p->resource,p->tb,p->tc,p->ti,p->wi); }p=p->link;}while(p!=NULL);} void last(){eti/=n;ewi/=n;printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi);}super(){JCB *padv; padv=head; do{if(padv->state=='W'&&padv->ts<=time)padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime; padv=padv->link;}while(padv!=NULL);}void hrn(m){JCB *min;int i,iden;for(i=0;i<n;i++){p=min=head;iden=1;super();do{if(p->state=='W'&&p->ts<=time)if(iden){min=p;iden=0;}else if(p->super>min->super) min=p;p=p->link;}while(p!=NULL);if(iden) {i--;time++;printf("\ntime=%d:\tno JCB submib...wait...",time);if(time>1000){printf("\nruntime is toolong...error...");getch();}}else{running(min,m);}}}void sjf(int m){JCB *min;int i,iden;for(i=0;i<n;i++){p=min=head;iden=1;do{ if(p->state=='W'&&p->ts<=time)if(iden){min=p;iden=0;}else if(p->ntime<min->ntime) min=p;p=p->link;}while(p!=NULL) ;if(iden) {i--;printf("\ntime=%d:\tno JCBsubmib...wait...",time);time++;if(time>100){printf("\nruntime is too long...error");getch();}} else{running(min,m);}}}fcfs(int m){int i,iden;printf("\n\nthe jcb is runing...");for(i=0;i<n;i++){p=head;iden=1;do{ if(p->state=='W'&&p->ts<=time) iden=0;if(iden)p=p->link;}while(p!=NULL&&iden) ;if(iden) {i--;printf("\ntime=%d:\tno JCB submib...wait...",time);time++;if(time>100){printf("\nruntime is too long...error");getch();}} else{ running(p,m);}}}running(JCB *p,int m){p->tb=time;p->state='R';p->tc=p->tb+p->ntime;p->ti=(float)(p->tc-p->ts);p->wi=(float)(p->ti/p->ntime);eti+=p->ti;ewi+=p->wi;print(p,m);time+=p->ntime;p->state='F';printf("\n%s has been finished!\npress any keyto continue...\n",p->name);getch();}void runjcb(int m){printf("\n\nstart running jcb...");switch(m){case 1:fcfs(m);break;case 2:sjf(m);break;case 3:hrn(m);break;default:printf("\nrunjcb error...\n");exit();}}fileway(){printf("\nadopts the file way to input the datas...y/n:") ;if(getch()=='y') fileinput(); else inital();} start(){int m;char str[100]="\nselect algorithm\n1.FCFS\n2.SJF\n3.HRN\n" ;printf("%s",str);m=getch()-48; fileway();if(1<=m&&m<=3) runjcb(m);else {printf("\nselect error!try again...\n");start();} last();}void main(){ start();printf("\nfinished!");getch();}(3)RR 算法#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<iostream> using namespace std;#define getch(type)(type*)malloc(sizeof(type))#define null 0#define MAXN 1000int stack[MAXN];int top;StruCtPcb{∕/调用进程模块Char name[10];//进程名char State; /进/ 程状态:就绪,运行,完成int super; //进程优先级int ntime;// 需要运行的时间int rtime;// 到达时间changestruct pcb* link;// 链接指针}*ready=null,*p;typedef struct pcb PCB;void destroy();void check();VOid SOrtO//建立对进程优先级排列函数{PCB *first,*secOnd;int insert = 0;if( ( ready == null ) || ( ( p -> rtime ) < ( ready -> rtime ) ) ){// 优先级最大者,插入队首p -> link = ready;ready = p;}else {//进程比较优先级。

处理器调度算法模拟实现与比较

处理器调度算法模拟实现与比较

处理器调度算法模拟实现与比较处理器调度算法是操作系统中的一个重要组成部分,用于决定哪个进程可以分配到处理器来执行。

处理器调度算法的选择会直接影响到系统的性能和响应时间,在不同的系统和场景下,可能存在最适合的处理器调度算法。

下面介绍几种常见的处理器调度算法及其实现原理和比较。

1. 先来先服务(FCFS,First-Come, First-Serve)FCFS 算法是最简单的处理器调度算法,按照作业到达的先后顺序进行调度。

作业到达时间早的先被调度执行,直到完成或者被阻塞。

这种算法不考虑作业的长度和优先级,容易导致短作业等待时间过长的问题。

示例代码:```pythondef FCFS(scheduler, jobs):ready_queue = []current_time = 0for job in jobs:while current_time < job.arrival_time:current_time += 1ready_queue.append(job)job.waiting_time = current_time -job.arrival_timejob.turnaround_time = job.waiting_time +job.service_timecurrent_time += job.service_time```2. 最短作业优先(SJF,Shortest Job First)SJF 算法将短作业优先执行,将作业按照服务时间从小到大排序,服务时间短的作业先执行。

这种算法可以最大程度地减少平均等待时间,并且每个作业的等待时间都得到了保障,但可能会对长作业造成饥饿状态。

示例代码:```pythondef SJF(scheduler, jobs):ready_queue = []current_time = 0while jobs or ready_queue:if not ready_queue:current_time = jobs[0].arrival_timefor job in jobs:if job.arrival_time <= current_time:ready_queue.append(job)ready_queue.sort(key=lambda x: x.service_time) job = ready_queue.pop(0)job.waiting_time = current_time -job.arrival_timejob.turnaround_time = job.waiting_time + job.service_timecurrent_time += job.service_timejobs.remove(job)```3. 优先级调度(Priority Scheduling)优先级调度算法是一种将作业按照优先级进行调度的算法。

实习一处理器调度

实习一处理器调度

实习一处理器调度一.实习内容选择一个调度算法,实现处理器调度。

二.实习目的本实习模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。

三.实习题目设计一个按优先数调度算法实现处理器调度的程序。

四. 设计思想1.设计思路(1)假定系统有5个进程,每个进程用一个PCB来代表。

(2) 开始运行之前,为每个进程确定它的“优先数”和“要求运行时间”。

通过键盘输入这些参数。

(3) 按进程优先数排列进程,优先数最大的进程插入队首,否者比较进程优先数,插入适当位置。

(4) 处理器总是选择队首进程运行。

采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。

(5) 进程运行一次后,若要求运行时间不等于0,则将它加入就绪队列,否则,将状态改为“结束”,退出就绪队列。

(6) 若就绪队列为空,结束,否则转到(4)重复。

2.主要数据结构struct pcb { /* 定义进程控制块PCB */char name[10]; /*进程名*/char state; /*状态*/int super; /*优先数*/int ntime; /*要求运行时间*/int rtime; /*周转时间*/struct pcb* link; /*下一个进程pcb首地址*/}3.主要代码结构及代码段分析void input() /* 建立进程控制块函数*/{ int i,num;system("cls"); /*清屏*/for(i=1;i<=5;i++){ printf("\n projectNo.%d:\n",i);p=getpch(PCB);printf("\n please input project name:");scanf("%s",p->name);printf("\n please input project priority:");scanf("%d",&p->super);printf("\n please input project running time:");scanf("%d",&p->ntime);printf("\n");p->rtime=0;p->state='W';p->link=NULL;sort(); /* 调用sort函数*/}}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)) /*若插入进程比当前进程优先数大插入到当前进程前面*/ {p->link=second;first->link=p;second=NULL;insert=1;}else /* 插入进程优先数最低,则插入到队尾*/{first=first->link;second=second->link;}}if(insert==0) first->link=p;}}int space()/*求队列长度*/{int l=0;PCB* pr=ready;while(pr!=NULL){ l++;pr=pr->link;}return(l);}void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/{printf("\n proname\t state\t\t priority\t needtime\t remaintime\n"); printf("| %s\t\t",pr->name);printf("| %c\t\t",pr->state);printf("| %d\t\t",pr->super);printf("| %d\t\t",pr->ntime);printf("| %d\t\t",pr->rtime);printf("\n");}void check() /* 建立进程查看函数 */{PCB* pr;printf("\n **** the running project is:\n"); /*显示当前运行进程*/disp(p);pr=ready;printf("\n **** the ready project state is:\n"); /*显示就绪队列状态*/ while(pr!=NULL){disp(pr);pr=pr->link;}}void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/{ printf("\n project[%s] has finished.\n",p->name);free(p);}void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/{ (p->rtime)++;if(p->rtime==p->ntime){ p->state='E';printf("\n **** the finished project is:\n");disp(p);destroy();} /* 调用destroy函数*/else{(p->super)--;p->state='W';sort(); /*调用sort函数*/}}void main() /*主函数*/{int len,h=0;char ch;input();len=space();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf("-----------------------------------------------------"); printf("\n now is %d rounds. \n",h);p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();printf("\n press any key to continue......\n");}printf("\n\n all projects have finished.\n");getch();/*从键盘获得字符*/}五.上机实习所用平台及相关软件本程序在windows xp平台下,TC2.0编译器编译通过。

设计一个按优先数调度算法实现处理器调度的程序

设计一个按优先数调度算法实现处理器调度的程序

实验1 处理器调度1、实验目的:在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。

2、实验内容:用高级语言(要求C语言实验环境)编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.按进程调度算法实现处理机调度。

通过设计相应的数据结构建立进程控制块(PCB)和进程队列,采用先来先服务、优先数优先、轮转法,以及多级反馈轮转法等进程调度算法分别实现处理机调度策略。

3,实验题目:处理器调度4.流程图:(1)主程序流程图:(2)子程序init()流程图:(3) 子程序max_pri_process()流程图:(4)子程序show()流程图:(5)子程序run()流程图:5.源程序//按优先数调度算法实现处理器调度的程序#include "stdio.h"#include "string.h"#define num 5//假定系统中进程个数为5struct PCB{char ID;//进程名int runtime;//要求运行时间int pri;//优先数char state; //状态,R-就绪,F-结束};struct PCB pcblist[num];//定义进程控制块数组void init()//PCB初始化子程序{int i;for(i=0;i<num;i++){printf("PCB[%d]:ID pri runtime \n",i+1);//为每个进程任意指定pri和runtimescanf("%s%d%d",&pcblist[i].ID,&pcblist[i].pri,&pcblist[i].runtime);pcblist[i].state='R';//进程初始状态均为就绪getchar();//接收回车符}}int max_pri_process()//确定最大优先级进程子程序{int max=-100;//max为最大优先数,初始化为-100int i;int key;for(i=0;i<num;i++){if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行return -1;//返回-1elseif(max<pcblist[i].pri&&pcblist[i].state=='R')//从就绪进程中选取优先数最大的进程{max=pcblist[i].pri;//max存放每次循环中的最大优先数key=i;//将进程号赋给key}}if(pcblist[key].state=='F')//具有最大优先数的进程若已运行完毕return -1;//则返回-1else//否则return key;//将key作为返回值返回}void show()//显示子程序{int i;printf("\n ID pri runtime state\n");printf("-------------------------------------------------\n");for(i=0;i<num;i++)//依次显示每个进程的名、优先数、要求运行时间和状态{printf("%s%6d%8d %s\n",&pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&pcblist[i].state); }printf(" press any key to continue...\n");}void run()//进程运行子程序{int i,j;int t=0;//t为运行次数for(j=0;j<num;j++){t+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和printf("\nbefore run,the conditon is:\n");show(); //调用show()子程序显示运行前PCB的情况getchar();//等待输入回车符for(j=0;j<t;j++){while(max_pri_process()!=-1)//具有最大优先数的进程没有运行完,让其运行{pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行}for(i=0;i<num;i++){if(pcblist[i].state=='r'){ pcblist[i].pri-=1;//将当前运行进程的优先数减1pcblist[i].runtime--;//要求运行时间减1{if(pcblist[i].runtime==0)pcblist[i].state='F';//运行完则将该进程状态置为结束elsepcblist[i].state='R';//未运行完将其状态置为就绪}show();//显示每次运行后各PCB的情况getchar();//等待回车进入下一次运行}}}}void main()//按动态优先数调度主程序{init();//初始化各个进程PCBrun();//进程调度模拟}6,运行的初值和运行结果:初值界面:运行界面1:运行界面2:运行界面3:7.总结和心得:本实验严格按照试验要求,根据要求所涉及的知识点进行了针对性的知识点掌握和复习。

处理器调度算法实验报告

处理器调度算法实验报告

处理器调度算法实验报告一、实验目的本次实验的目的是通过模拟处理器调度算法,了解不同调度算法的优缺点,以及如何根据不同场景选择合适的算法。

二、实验环境本次实验使用C++语言编写程序,在Visual Studio 2019环境下进行开发和测试。

三、实验内容1. 实现FIFO调度算法FIFO(First In First Out)调度算法是最简单的一种调度算法,即先进先出。

在这种算法中,作业按照提交顺序排队等待执行。

当CPU空闲时,选择队列中最早提交的作业进行执行。

这种算法没有考虑作业的优先级和执行时间长短等因素,只关注作业的提交时间。

因此,在一些场景下可能会出现长作业占用CPU资源导致短作业等待时间过长等问题。

2. 实现SJF调度算法SJF(Shortest Job First)调度算法是一种非抢占式的短作业优先算法。

在这种算法中,每个作业都有一个估计运行时间,在CPU空闲时选择估计运行时间最短的作业进行执行。

如果两个作业估计运行时间相同,则按照提交顺序进行排队。

这种算法可以有效地减少平均等待时间和平均周转时间,但是可能会导致长作业等待时间过长。

3. 实现优先级调度算法优先级调度算法是一种抢占式的算法,即当高优先级作业到达时可以抢占正在执行的低优先级作业。

在这种算法中,每个作业都有一个优先级,CPU空闲时选择优先级最高的作业进行执行。

这种算法可以根据不同场景设置不同的作业优先级,但是可能会导致低优先级作业等待时间过长。

4. 实现时间片轮转调度算法时间片轮转调度算法是一种抢占式的循环调度算法。

在这种算法中,每个作业被分配一个固定长度的时间片,在该时间片内执行完毕后,如果该作业还未完成,则将其放入队尾等待下一次调度。

这种算法可以有效地保证每个作业都有机会获得CPU资源,并且能够避免长作业占用CPU资源导致短作业等待时间过长。

四、实验结果通过对以上四种调度算法进行模拟实验,得到了以下结果:1. FIFO调度算法:平均等待时间较长,平均周转时间也较长。

实验一处理器管理-优先数调度算法

实验一处理器管理-优先数调度算法

实验一处理器管理-优先数调度算法一、实验目的在多道程序或者多任务系统中,同时处于就绪态的进程有若干个。

在单处理器系统中,处于运行态的进程最多只有一个,也就是说能运行的进程数远小于就绪态进程个数,所以必须进行进程调度,按照一定的调度算法,即依照某种原则或策略从就绪态队列中选中进程占用处理器。

本实验要求学生设计一个优先数调度算法来模拟实现处理器调度过程。

二、实验要求(1)假定进程控制块中包含内容为:照进程到达进程就绪队列的时间链接进程的优先数由用户自己指定,并且优先数值越小,优先级越高,调度时,总是选择优先级高的进程占用CPU;估计运行时间可由设计者任意指定一个时间值;(2)根据需要,设计一个队首指针指向5个进程(进程名为A,B,C,D,E)组成的就绪队列中的第一个进程,再设一个当前指针指向当前正在运行的进程。

(3)进程调度时,采用静态优先调度。

(4)用非抢占式方式分配处理器。

(5)要求所设计的程序必须有输出语句,用于输出进程调度和运行一次后进程的变化。

比如:每次被选中的进程名,就绪队列中进程的排队情况,进程控制块的动态变化。

一、基本实现:1、数据结构Struct{进程名链接指针进程的优先数(设计好优先数的次序:例如5个优先级分别是0-4 假定0最高,4最低)估计运行时间进程状态}2、变量运行进程的指针就绪队列的指针估计时间3、程序:main(){初始化指针输入若干进程(对每次输入的进程依据优先数排到就绪队列)(临时变量:遍历指针)运行调度程序(函数)!处理系统结束后回收相关资源!}调度(指向运行进程的指针,就绪队列指针){while(就绪队列指针不为空){摘就绪队列头节点;用运行进程指针指向;取估计时间=》估计时间输出正在运行的进程!Timer(估计时间)进程运行结束;Free(指向运行进程的节点指针)}}二、新增阻塞(等待)态:1、数据结构Struct{进程名链接指针进程的优先数(设计好优先数的次序:例如5个优先级分别是0-4 假定0最高,4最低)估计运行时间输入输出时间链指针进程状态}struct{输入输出类型输入输出开始时间输入输出时间下一个输入输出节点指针}2、变量运行进程的指针就绪队列的指针等待队列的指针估计时间3、程序:main(){初始化指针输入若干进程(对每次输入的进程依据优先数排到就绪队列)(临时变量:遍历指针)运行调度程序(函数)!处理系统结束后回收相关资源!}调度(指向运行进程的指针,就绪队列指针,等待队列指针){ while(就绪队列指针不为空){摘就绪队列头节点;用运行进程指针指向;输出正在运行的进程!取输入输出信息,确定运行估计时间=》估计时间判断(是否执行结束){Timer(估计时间)进程运行结束;Free(指向运行进程的节点指针)}else{调用调度用等待处理函数(等待队列指针,正在运行的进程指针(要切换为等待态))}}}调度用等待处理函数(等待队列指针,正在运行的进程指针(要切换为等待态)){输出切换进入等待队列的进程将当前进程放入等待队列摘下当前输入输出节点,获得输入输出时间=》等待时间timer(等待时间)等待事件结束,将该进程切换放入就绪队列}实验二处理器管理-银行家算法一、实验目的本实验要求学生采用银行家算法有效避免资源分配中的死锁发生。

设计一个按优先数调度算法实现处理器调度的程序(可以输入进程的数量)

设计一个按优先数调度算法实现处理器调度的程序(可以输入进程的数量)

设计一个按优先数调度算法实现处理器调度的程序算法简介进程调度算法是决定进程在处理器上执行顺序的一种方法。

按照进程的优先级大小来安排每个进程在处理器上的运行顺序。

常见的有以下几种进程调度算法:•先来先服务(First Come, First Serve, FCFS)算法•短作业优先(Shortest Job First, SJF)算法•优先级调度算法•时间片轮转调度(Round Robin, RR)算法本文介绍如何设计一个按优先数调度算法实现处理器调度的程序。

优先级调度算法中,每个进程都分配有一个优先级,等待CPU资源时CPU会选择优先级最高的进程先执行。

在本次设计中,我们将使用最高优先级调度算法实现最高优先级的任务先被处理。

设计思路该程序实现的主要思路如下:1.构建进程模型。

结构体包括进程名称、进程 PID、进程优先级等成员变量。

2.生成不同优先级的进程,并将其存入队列中。

3.运用算法从队列中选择优先级最高并等待执行的进程。

4.执行选择的进程并从队列中移除。

5.循环执行步骤 3 和 4 直到所有进程都被完成。

Markdown 代码实现首先我们需要创建一个结构体 Process,结构体中包含有进程名,进程PID和进程优先级。

struct Process {string pName; // 进程名称int PID; // 进程PIDint priority; // 进程优先级};从用户输入中获取需要生成的进程数量,并构造进程队列。

```markdown int n; // 进程的数量 queue processes; // 进程队列,按优先级升序排列 cin >> n; // 获取进程数量 srand(time(NULL)); // 设定随机数发生器的起始值 for (int i = 1; i <= n; ++i) { Process process; process.pName =。

CPU调度算法的模拟实现课程设计

CPU调度算法的模拟实现课程设计

设计1 CPU调度算法的模拟实现一、设计目的1、深入理解CPU调度的四种算法:先到先服务算法FCFS、非抢占最短作业优先算法SJF、可抢占优先权调度算法PRIOR、时间片轮转算法RR。

2、利用程序设计语言编写算法,模拟实现先到先服务算法FCFS、非抢占最短作业优先算法SJF、可抢占优先权调度算法PRIOR、时间片轮转算法RR。

3、针对模拟进程,利用CPU调度算法进行调度。

4、进行算法评价,计算平均周转时间和平均等待时间。

二、设计要求1、调度所需的进程参数由输入产生:采用手工输入参数或产生随机数的方法。

2、针对各个进程模拟算法,输出进程调度结果,包括执行算法的等待时间和周转时间。

3、根据调度结果对算法进行调试分析,纠正程序错误并对算法进行优化,总结并输出算法评价指标。

三、设计说明(含系统框图和(或)主要算法的流程图)(1) 优先权调度#include "stdio.h"#include "stdlib.h"#define N 10//#define M 10typedef struct{int m;//int flag;int priority;//优先级顺序float zhixing;float zhouzhuan;float dq_zhouzhuan;}process;//int flag=0;//标志已经执行个进程的个数//float time=0;//当前共执行的时间void main(){//int plag=0;float time=0;int n;int i,j,temp;process fcfs[N],*p[N],*q;float time_zhouzhuan=0,wtime_zhouzhuan=0; //输入printf("请输入进程的个数:");scanf("%d",&n);for(i=0;i<n;i++){fcfs[i].m=i+1;//fcfs[i].linshi=0;//fcfs[i].flag=0;printf("请输入进程%d所需的执行时间和进程的优先级:",fcfs[i].m); scanf("%f %d",&fcfs[i].zhixing,&fcfs[i].priority);}printf("haha");for(i=0;i<n;i++){p[i]=(process*)malloc(sizeof(process));//分配空间p[i]=&fcfs[i];}//按优先级别的排序for(j=0;j<n-1;j++){printf("ok");//有问题temp=j;for(i=j+1;i<n;i++){printf("ky");if(p[i]->priority>p[temp]->priority)temp=i;}printf("#####");q=p[j];//交换p[j]=p[temp];p[temp]=q;}printf("he");//优先级算法for(i=0;i<n;i++){time+=p[i]->zhixing;p[i]->zhouzhuan=time;p[i]->dq_zhouzhuan=p[i]->zhouzhuan/p[i]->zhixing;}for(i=0;i<n;i++){time_zhouzhuan+=p[i]->zhouzhuan;wtime_zhouzhuan+=p[i]->dq_zhouzhuan;}time_zhouzhuan/=n;wtime_zhouzhuan/=n;//输出结果printf("静态优先级算法的进程的执行顺序为:\n");for(i=0;i<n;i++){printf("%d ",p[i]->m);}printf("\n平均周转时间为%f",time_zhouzhuan); printf("\n带权平均周转时间为%f",wtime_zhouzhuan);} (2) FCFS和SJF综合#include "stdio.h"#define getjcb(type) (type*)malloc(sizeof(type))#define NULL 0int n=0,time=0;float eti,ewi;struct jcb{ char name[10]; /* 作业名*/char state; /* 作业状态*/int ts; /* 提交时间*/float super; /* 优先权*/int tb; /* 开始运行时间*/int tc; /* 完成时间*/float ti; /* 周转时间*/float wi; /* 带权周转时间*/ int ntime; /* 作业所需运行时间*/char resource[10]; /* 所需资源*/struct jcb *link; /* 结构体指针*/ } *p,*q,*head=NULL;typedef struct jcb JCB;inital(){int i;printf("\nInput jcb num\n");scanf("%d",&n);printf("Input\nname\tts\tntime\tresource\n");for(i=0;i<n;i++){p=getjcb(JCB);scanf("%s\t%d\t%d\t%s",&p->name,&p->ts,&p->ntime,&p->resource);p->state='W';p->link=NULL;if(head==NULL) head=q=p;else{q->link=p;q=p; } }}fileinput(){FILE *fp; int i;if((fp=fopen("os2.txt","r"))==NULL) printf(" open error!") ;fscanf(fp,"%d\n",&n);for(i=0;i<n;i++){p=getjcb(JCB);scanf(fp,"%s%d%d%s",&p->name,&p->ts,&p->ntime,&p->resource);p->state='W';p->link=NULL;if(head==NULL) head=q=p;else{q->link=p; q=p;}}fclose(fp);}void print(JCB *pr,int m){JCB *p;printf("\ntime=%d",time);if(m==3){printf("\nname\tstate\tts\tntime\tsuper\tsource\ttb\ttc\tti\twi\n");printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->w i); }else {printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi); }p=head;do{ if(p->state=='W')if(m==3){ printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",p->name,p->state,p->ts,p->ntime,p->super,p->resource);} else{printf("%s\t%c\t%d\t%d\t%s\n",p->name,p->state,p->ts,p->ntime,p->resource); }p=p->link;}while(p!=NULL);p=head;do{if(p->state=='F')if(m==3){printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti,p->wi);} else{printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",p->name,p->state,p->ts,p->ntime,p->resource,p->tb,p->tc,p->ti,p->wi); }p=p->link;}while(p!=NULL);}void last(){eti/=n;ewi/=n;printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi);}super(){JCB *padv;padv=head;do{if(padv->state=='W'&&padv->ts<=time)padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime;padv=padv->link;}while(padv!=NULL);}void hrn(m){JCB *min;int i,iden;for(i=0;i<n;i++){p=min=head;iden=1;super();do{if(p->state=='W'&&p->ts<=time)if(iden){min=p;iden=0;}else if(p->super>min->super) min=p;p=p->link;}while(p!=NULL);if(iden) {i--;time++;printf("\ntime=%d:\tno JCB submib...wait...",time);if(time>1000){printf("\nruntime is too long...error...");getch();}} else{running(min,m);}}}void sjf(int m){JCB *min;int i,iden;for(i=0;i<n;i++){p=min=head;iden=1;do{ if(p->state=='W'&&p->ts<=time)if(iden){min=p;iden=0;}else if(p->ntime<min->ntime) min=p;p=p->link;}while(p!=NULL) ;if(iden) {i--;printf("\ntime=%d:\tno JCB submib...wait...",time);time++;if(time>100){printf("\nruntime is too long...error");getch();}} else{running(min,m);}}}fcfs(int m){int i,iden;printf("\n\nthe jcb is runing...");for(i=0;i<n;i++){p=head;iden=1;do{ if(p->state=='W'&&p->ts<=time) iden=0;if(iden)p=p->link;}while(p!=NULL&&iden) ;if(iden) {i--;printf("\ntime=%d:\tno JCB submib...wait...",time);time++;if(time>100){printf("\nruntime is too long...error");getch();}} else{ running(p,m);}}}running(JCB *p,int m){p->tb=time;p->state='R';p->tc=p->tb+p->ntime;p->ti=(float)(p->tc-p->ts);p->wi=(float)(p->ti/p->ntime);eti+=p->ti;ewi+=p->wi;print(p,m);time+=p->ntime;p->state='F';printf("\n%s has been finished!\npress any key to continue...\n",p->name);getch();}void runjcb(int m){printf("\n\nstart running jcb...");switch(m){case 1:fcfs(m);break;case 2:sjf(m);break;case 3:hrn(m);break;default:printf("\nrunjcb error...\n");exit();}}fileway(){printf("\nadopts the file way to input the datas...y/n:") ;if(getch()=='y') fileinput();else inital();}start(){int m;char str[100]="\nselect algorithm\n1.FCFS\n2.SJF\n3.HRN\n" ;printf("%s",str);m=getch()-48;fileway();if(1<=m&&m<=3) runjcb(m);else {printf("\nselect error!try again...\n");start();} last();}void main(){start();printf("\nfinished!");getch();}(3)RR算法#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<iostream>using namespace std;#define getch(type)(type*)malloc(sizeof(type))#define null 0#define MAXN 1000int stack[MAXN];int top;struct pcb{//调用进程模块char name[10];//进程名char state; //进程状态:就绪,运行,完成int super; //进程优先级int ntime;//需要运行的时间int rtime;//到达时间changestruct pcb* link;//链接指针}*ready=null,*p;typedef struct pcb PCB;void destroy();void check();void sort()//建立对进程优先级排列函数{PCB *first,*second;int insert = 0;if( ( ready == null ) || ( ( p -> rtime ) < ( ready -> rtime ) ) ){//优先级最大者,插入队首p -> link = ready;ready = p;}else {//进程比较优先级。

程优先级调度算法的分析及模拟实现

程优先级调度算法的分析及模拟实现

进程优先级调度算法的分析及模拟实现摘要:在操作系统中,进程调度是处理机管理的核心内容,是计算机工作的灵魂。

优先级算法是进程调度的重要算法,分为静态和动态优先级算法,它是解决多个进程无法在一个CPU环境下顺利运行的方法之一。

本论文首先详细分析了优先级调度方算法的原理,并用C++ 语言实现对多个进程采用抢占式优先级算法的进程调度,模拟动态优先级,逐一将多个进程运行,并且显示出当前时间片下的进程名、优先级运行状态。

关键词:优先级;进程控制块;进程调度;优先级调度算法;动态优先级调度算法1 .绪论在计算机系统中,中央处理机CPU是最重要的资源。

每一个提交给计算机的任务都必须使用CPU 。

处理机管理的主要任务是对其时间进行分配,也就是按照一定的策略将 CPU 运行的时间分配给各个用户以满足用户的要求,同时要考虑到充分利用CPU来提高它的效率。

在实时系统里,要使重要紧急的进程被优先调度运行,系统就必须有基于进程优先级的实时调度策略。

进程调度的功能就是按一定策略、动态地把处理机分配给处于就绪队列中的某一进程并使之执行。

根据不同的系统设计目标,可有多种选择进程的策略,每一项任务的执行都必须经过进程调度算法来执行。

进程调度在操作系统中起着非常重要的作用。

2 .进程调度2.1进程调度算法的概念进程调度算法又称调度策略,它是指在就绪状态的进程中按照什么原则选择一个进程,并把处理机分配给该进程使用。

在多道程序环境下,进程数目往往多于处理机数目,致使他们争用处理机。

这就要求系统能按照某种算法动态地把处理机分配给就绪队列中的一个进程,使之执行。

分配处理机的任务是由进程调度程序完成的。

在进程调度中采用哪种调度算法取决于系统要求达到的目标。

常用的进程调度算法有:2.1.1先来先服务(FCFS)算法先来先服务FCFS(First-Come First-Service)算法又称先进先出算法,它是最简单的进程调度算法。

其基本思想是按照各进程进入就绪队列的先后顺序来调度,并分配给处理机执行,即先进入就绪队列的进程,先分配处理机运行。

采用优先数算法模拟进程调度程序

采用优先数算法模拟进程调度程序

肇庆学院计算机科学与软件学院《操作系统》课程设计报告设计题目:采用优先数算法模拟进程调度程序完成日期:2008年6月3日采用优先数算法模拟进程调度程序分析、设计与实现一、设计理论描述进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

另有一种定义方法是“程序在处理器上的执行”。

为了模拟的方便,本设计采用这种定义。

简单地说,进程包括三种状态:运行状态、就绪状态、完成状态。

通常操作系统用一个称为进程控制块(PCB)的数据结构来记录进程的属性信息。

PCB一般应包含以下信息:进程标识信息(本进程的标志ID、父进程的标志ID、用户标识);处理机状态信息(用户使用的寄存器、控制和状态寄存器、堆栈指针);进程调度和控制信息(进程的状态、进程的调度优先级、程序和数据的地址、进程同步和通信机制、进程已等待时间、已使用的处理器时间、进程在有关队列中的链接指针、分给进程的主存大小和位置、进程使用的其他资源信息、进程得到有关服务的优先级、进程调度所需的其他信息)。

优先级调度算法:按照进程的优先级大小来调度,是高优先级进程得到优先的处理的调度策略,可使用非抢占或可抢占两种策略。

二、设计思想、设计分析及数据结构模型这个设计需要考虑两个问题:如何组织进程、如何实现进程模拟调度。

考虑如何组织进程,首先就要设置进程控制块的内容。

进程控制块PCB记录各个进程执行时的情况。

不同的操作系统,进程控制块记录的信息内容不一样。

操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。

这里的设计只使用了必不可少的信息。

一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类:(1)标识信息每个进程都要有一个唯一的标识符,用来标识进程的存在和区别于其他进程。

这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。

在后面给出的参考程序中,采用符号方式,也就是为每个进程依次分配一个不相同符号。

(2)说明信息用于记录进程的基本情况,例如,进程的状态、等待原因、进程程序存放位置、进程数据存放位置等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1 处理器调度
一、实验内容
选择一个调度算法,实现处理器调度。

二、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。

三、实验题目
按优先数调度算法实现处理器调度的模拟设计与实现。

四、源程序
#include<iostream>
#include<string>
using namespace std; //-----------------------
struct _proc {
char name[32];
struct _proc *next;
int run_time;
int priority;
int state;//就绪为
};
_proc *root;
//向就绪队列中插入进程,按照降序
void Insert(_proc* pr) {
_proc *q=root;//方便插入,记录插入位置的前面的进程
_proc *p=root->next;
if(root->state!=0) {
while(p!=NULL)//找插入位置
{
if(p->priority>pr->priority)//优先级小于时,继续遍历
{
q=p;
p=p->next;
}
else//找到插入
{
break;
}
}
}
pr->next=p;//插入
q->next=pr;
++root->state;//进程个数加一
}
//创建进程
_proc Creat(char name[],int priority,int run_time)
{
_proc pr;
strcpy(,name);
pr.priority=priority;
pr.run_time=run_time;
pr.state=0;
pr.next=NULL;
return pr;
}
//删除就绪队列中对首进程
_proc* Delete() {
_proc* pr=root->next;
root->next=root->next->next;
--root->state;
return pr;
}
//对就绪队列排序,按照降序
void Sort() {
if(root->next->run_time==0)//要执行时间为时,从就绪队列中删除该进程{
Delete();
root->next->state=1;
else//不为时,先删除,再根据变化后的优先级,插入到相应位置{
_proc *pr=Delete();
Insert(pr);
}
}
//输出执行进程号
void OutPut()
{
cout<<root->next->name<<endl;//输出,模拟进程执行
--root->next->priority;//修改进程的优先级和运行时间,状态
--root->next->run_time; }
void Solve() {
//根结点
root=new _proc;
root->state=0;//state记录就绪队列中的进程个数
root->next=NULL;//指向第一个进程
//创建几个进程,并插入就绪队列
_proc pr1=Creat("p1",2,1);
Insert(&pr1);
_proc pr2=Creat("p2",3,5);
Insert(&pr2);
_proc pr3=Creat("p3",1,3);
Insert(&pr3);
_proc pr4=Creat("p4",2,4);
Insert(&pr4);
_proc pr5=Creat("p5",4,2);
Insert(&pr5);
cout<<"调度序列:"<<endl;
while(root->state!=0)
{
OutPut();
Sort();
}
int main() {
Solve();
getchar();
getchar();
return 0;
}
五、运行结果。

相关文档
最新文档