按优先数调度算法实现处理器调度的模拟设计与实现
基于-优先数时间片轮转调度算法调度处理器

题目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;// 指向进程的长指针,模拟的,所以没用到。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
五、运行结果。