`
bianku
  • 浏览: 72244 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

多优先级队列调度算法

阅读更多
一、多优先级队列调度算法的描述 

该算法有多个队列,同一个队列中的进程优先级相同,不同队列中进程优先级不同;最高优先级上的进程运行1个时间片,次高优先级上的进程运行2个时间片,再下一级运行4个时间片,依此类推;每次从队列头开始运行进程,每当一个进程在一个优先级队列中用完它的时间片后,就移到队列的尾部;只有当高优先级队列为空时才会从不为空的低优先级队列中选择进程运行;在低优先级队列中等待时间过长的进程,将移入高优先级队列。 

二、多优先级队列数据结构的定义 

多优先级队列数据结构的定义 
进程数据结构的定义 

class MultiPriorityQueueSchedule{ 

private: 

MYPROCESS MultiPriorityQueue[QUEUESIZE]; 

private: 

void MPQSFreeProcess(MYPROCESS); 

MYPROCESS MPQSSelectProcess(); 

void MPQSRunProcess(MYPROCESS); 

void MPQSGoAfter(MYPROCESS);//到队列尾 

void MPQSPriorityScheduling();//优先级调度 

public: 

MultiPriorityQueueSchedule(); 

bool MPQSAppendProcess(MYPROCESS); 

void MPQSExecute(); 

void MPQSDisplayQueue(ofstream&); 

}; 
typedef struct MyProcess 

{ 

char* MyProcessname; 

int CreateTime; 

int LastExecTime; 

int JobWeight; 

int EstimateUsedTime; 

int Priority; 

MyProcess *next; 

}* MYPROCESS; 

其他函数: 

MYPROCESS CreateMyProcess(char* name, int JW, int Prio); //创建进程 

int EstimateRunTime(int JW); //估计进程运行时间 

void BurstTime(int st); //SYSTIME增加 

void PriorityScheduling(MYPROCESS); //调整进程优先级 


三、Select方法 

1) 从高优先级队列到低优先级队列,当高优先级队列为空时才进入低优先级队列,否则跳到2)。当所有队列为空时,跳到4)。 

2) 选择此优先级队列的头一个进程运行,进程运行完它的时间片后,把此进程放到此优先级队列的尾部,跳到3)。 

3) 调整所有进程的优先级,跳到1)。 

4) 

四、编程测试 

根据上述内容进行编程,运行程序截图如下: 




图1:动态多优先级调度的过程图 




图2:静态多优先级队列和动态多优先级队列的比较 

附录中展示了程序中的类、函数和一些变量的定义。 



附录 
/*MultiPriorityQueue.h*/ 
/*Power by Keamou@CS@CITS@NKU*/ 

#include <string.h> 
#include <math.h> 
#define QUEUESIZE 32 //队列大小 
#define SLICETIME 5 //时间片 
static int SYSTIME = 0; //假设系统时间 

int EstimateRunTime(int JobWeight) 
{ 
return JobWeight; 
} /*估计进程运行时间*/ 

typedef struct MyProcess 
{ 
char* MyProcessname; 
int CreateTime; 
int LastExecTime; 
int JobWeight; 
int EstimateUsedTime; 
int Priority; 
MyProcess *next; 
}* MYPROCESS; /*进程定义*/ 

MYPROCESS CreateMyProcess(char* name, int JW, int Prio) 
{ 
MYPROCESS myproc; 
myproc = new MyProcess; 
myproc->MyProcessname = new char [10]; 
strcpy(myproc->MyProcessname,name); 
myproc->CreateTime = SYSTIME ; 
myproc->LastExecTime = SYSTIME; 
myproc->JobWeight = JW ; 
myproc->EstimateUsedTime = EstimateRunTime(JW) ; 
myproc->Priority = Prio; 
myproc->next=NULL; 
return myproc; 
} /*创建进程*/ 

void BurstTime(int st) 
{ 
SYSTIME += st ; 
} /*改变系统时间*/ 

void PriorityScheduling(MYPROCESS myproc) 
{ 
if ((SYSTIME-myproc->LastExecTime) > myproc->EstimateUsedTime) 
{ 
myproc->Priority--; 
if (myproc->Priority<0) 
{ 
myproc->Priority=0; 
} 
} 
} /*优先级调度*/ 

class MultiPriorityQueueSchedule 
{ 
private: 
MYPROCESS MultiPriorityQueue[QUEUESIZE]; 
private: 
void MPQSFreeProcess(MYPROCESS); 
MYPROCESS MPQSSelectProcess(); 
void MPQSRunProcess(MYPROCESS); 
void MPQSGoAfter(MYPROCESS); 
void MPQSPriorityScheduling(); 
public: 
MultiPriorityQueueSchedule(); 
bool MPQSAppendProcess(MYPROCESS); 
void MPQSExecute(); 
void MPQSDisplayQueue(ofstream&); 
}; /*多优先级调度队列的定义*/ 

MultiPriorityQueueSchedule::MultiPriorityQueueSchedule(){ 
for(int i=0;i<QUEUESIZE;i++) 
{ 
MultiPriorityQueue[i] = NULL; 
} 
} /*构造函数*/ 

bool MultiPriorityQueueSchedule::MPQSAppendProcess(MYPROCESS myproc) 
{ 
if (myproc->Priority >= QUEUESIZE) 
{ 
return false; 
} 
myproc->next = MultiPriorityQueue[myproc->Priority]; 
MultiPriorityQueue[myproc->Priority] = myproc; 
return true; 
} /*在多优先级队列中加入进程*/ 

void MultiPriorityQueueSchedule::MPQSFreeProcess(MYPROCESS myproc) 
{ 
MultiPriorityQueue[myproc->Priority] = myproc->next ; 
delete myproc; 
} /*释放进程*/ 

MYPROCESS MultiPriorityQueueSchedule::MPQSSelectProcess() 
{ 
int SearchNum ; 
for(SearchNum = 0; SearchNum < QUEUESIZE; SearchNum++ ) 
{ 
if (MultiPriorityQueue[SearchNum] != NULL) 
{ 
return MultiPriorityQueue[SearchNum]; 
} 
} 
return NULL; 
} /*选择运行进程*/ 

void MultiPriorityQueueSchedule::MPQSGoAfter(MYPROCESS myproc) 
{ 
int QueueNum; 
QueueNum = myproc->Priority ; 
MultiPriorityQueue[QueueNum] = myproc->next; 
MYPROCESS proctemp; 
proctemp= MultiPriorityQueue[QueueNum]; 
if (proctemp == NULL) 
{ 
MultiPriorityQueue[QueueNum] = myproc; 
return; 
} 
while (proctemp->next != NULL) 
{ 
proctemp = proctemp->next ; 
} 
proctemp->next = myproc ; 
myproc->next=NULL; 
} /*将运行后的进程放到队列尾部*/ 

void MultiPriorityQueueSchedule::MPQSPriorityScheduling() 
{ 
int PriorityNum ; 
MYPROCESS myproc; 
MYPROCESS proctemp; 
for(PriorityNum = 0; PriorityNum < QUEUESIZE; PriorityNum++ ) 
{ 
myproc = MultiPriorityQueue[PriorityNum]; 
while (myproc!=NULL) 
{ 
PriorityScheduling(myproc); 
if (myproc->Priority != PriorityNum) 
{ 
MultiPriorityQueue[PriorityNum]=myproc->next; 
MPQSAppendProcess(myproc); 
myproc=MultiPriorityQueue[PriorityNum]; 
} 
else 
break; 
} 
while (myproc!=NULL&&myproc->next!=NULL) 
{ 
PriorityScheduling(myproc->next); 
if (myproc->next->Priority!=PriorityNum) 
{ 
proctemp=myproc->next; 
myproc->next=myproc->next->next; 
MPQSAppendProcess(proctemp); 
} 
else 
myproc=myproc->next; 
} 
} 
} 

void MultiPriorityQueueSchedule::MPQSRunProcess(MYPROCESS myproc) 
{ 
if(myproc == NULL) 
return; 
int Runtime; 
Runtime = (pow(2,myproc->Priority))*SLICETIME ; 
myproc->EstimateUsedTime -= Runtime; 
if (myproc->EstimateUsedTime <= 0) 
{ 
BurstTime(Runtime+myproc->EstimateUsedTime); 
cout<<SYSTIME<<" \t"<<myproc->MyProcessname<<" \t"<<myproc->Priority<<" \tFree"<<endl; 
MPQSFreeProcess(myproc); 
} 
else 
{ 
BurstTime(Runtime); 
cout<<SYSTIME<<" \t"<<myproc->MyProcessname<<" \t"<<myproc->Priority<<" \tSwitch"<<endl; 
MPQSGoAfter(myproc); 
} 
} /*多优先级队列中的优先级调整调度*/ 

void MultiPriorityQueueSchedule::MPQSExecute() 
{ 
MYPROCESS myproc; 
do { 
myproc=MPQSSelectProcess(); 
MPQSRunProcess(myproc); 
MPQSPriorityScheduling(); 
} while(myproc!=NULL); 
} /*运行进程*/ 

void MultiPriorityQueueSchedule::MPQSDisplayQueue(ofstream& fout) 
{ 
int SearchNum ; 
MYPROCESS myproc; 
for(SearchNum = 0; SearchNum < QUEUESIZE; SearchNum++ ) 
{ 
myproc = MultiPriorityQueue[SearchNum]; 
while (myproc != NULL) 
{ 
fout<<myproc->MyProcessname<<" \t"<<myproc->Priority<<" \t"<<myproc->EstimateUsedTime<<endl; 
myproc = myproc->next ; 
} 
} 
} /*显示多优先级队列的状态*/ 

 

分享到:
评论

相关推荐

    多级反馈队列调度算法实现

    多级反馈队列调度算法的核心思想是将进程调度分为多个优先级不同的队列,新创建的进程被放入最高优先级的队列,按照时间片轮转的方式执行。如果一个进程在当前队列的时间片内未完成,就会被降级到下一个较低优先级的...

    模拟进程优先级调度算法

    通常会有一个高优先级队列和一个低优先级队列,当高优先级队列为空时,才会从低优先级队列中选取进程进行调度。 ### 算法优缺点 #### 优点 - **响应时间短**:高优先级的进程可以更快地得到处理,适合于实时系统...

    C语言实现多级反馈队列调度算法

    多级反馈队列调度算法的基本思想是将任务队列分为多个层次,每个层次具有不同的调度策略和优先级。通常,低层次的队列具有更高的优先级,新到达的任务会被放入最低级别的队列。如果一个任务在当前队列中执行超时,它...

    优先级调度算法实验报告(操作系统)

    通过这样的实验,学生能够直观地理解优先级调度算法的工作原理,包括如何根据优先级选择进程,如何管理进程状态,以及如何维护优先级队列。此外,随机生成的优先数和运行时间也增加了实验的可变性和实践性,有助于...

    多级反馈队列调度算法

    多级反馈队列调度算法(Multilevel Feedback Queue Scheduling,MLFQ)是一种在操作系统中用于进程调度的策略,其目标是优化系统的整体性能,兼顾各种类型的任务,确保响应时间和吞吐量的平衡。该算法的核心思想是将...

    操作系统课程设计报告-多级反馈队列调度算法模拟

    多级反馈队列调度算法是基于优先级的调度算法,它将就绪队列划分为多个层次,每个层次对应一个不同的优先级。新创建的进程通常会被放入最高优先级的队列中,给予较短的时间片进行执行。如果进程在分配的时间片内未能...

    多级反馈队列调度算法 C语言模拟实现

    根据提供的标题、描述、标签及部分代码内容,我们可以总结出以下关于“多级反馈队列调度算法 C语言模拟实现”的详细知识点。 ### 多级反馈队列调度算法概述 多级反馈队列(Multilevel Feedback Queue, MFQ)调度...

    JAVA-计算机操作系统 多级反馈队列调度算法

    多级反馈队列调度算法的核心思想是将进程队列分为多个级别,每个级别都有不同的优先级和调度策略。新进程被放入最高优先级的队列,如果在规定的时间片内未完成,将会被降级到下一个队列。低优先级队列的进程通常会...

    main_进程调度_操作系统优先级进程调度算法_

    本文将深入探讨“非抢占式优先级进程调度算法”,并结合`main.c`源代码进行详细阐述。 首先,我们要理解什么是进程调度。在多任务环境下,操作系统必须管理多个并发运行的进程,确保每个进程都能公平地获取计算资源...

    基于多片FPGA的双优先级动态调度算法.pdf

    为了提高数据处理效率,研究人员提出了基于多片FPGA的双优先级动态调度算法,通过合理调度算法,有效提升系统的性能。本文详细介绍了该算法的理论基础、实现方法以及实验验证结果。 首先,单片FPGA在处理海量数据时...

    多队列动态优先级的调度C实现算法

    多队列调度算法基于一个核心概念:将待处理的任务分配到多个独立的队列中,每个队列代表一种特定的优先级或任务类型。这样的设计允许系统根据任务的特性进行差异化处理,比如高优先级的任务可能被分配到一个队列,而...

    非抢占式优先级调度算法

    进程状态State (3)进程优先级改变原则 进程在就绪队列中呆一个时间片,优先级加1 进程运行一个时间片,优先级减3 (4)为了清楚的观察各进程的调度过程,程序应将每个时间片的进程的情况显示。出来

    最高优先级优先调度算法

    采用动态优先数。即进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数:在进程获得一次CPU后就将其优先数...“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。

    模拟进程调度中的高优先级优先调度算法.docx

    在高优先级优先调度算法中,我们首先将五个进程按照给定的优先数从大到小连成队列。然后,在每次运行处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。 处理器调度总是选队首进程运行。...

    多级反馈队列调度算法的实现

    多级反馈队列调度算法的基本思想是将就绪队列分为多个优先级不同的队列,并为每个队列分配不同的时间片。在本实验设计中,设置了四个级别的就绪队列,其中前三级采用时间片轮转法,时间片大小分别为2、4和8,最后一...

    进程优先级调度算法

    本文将深入探讨三种主要的进程优先级调度算法:时间片轮转调度算法、多级反馈队列调度算法和高响应比优先调度算法。 首先,我们来看**时间片轮转调度算法**。在该算法中,系统将所有就绪进程放入一个队列,每个进程...

    优先级调度算法

    在优先级调度算法中,我们使用一个插入函数 insert1,用于将新的进程插入到就绪队列中。该函数根据进程的优先级确定插入的位置,以确保高优先级的进程被优先执行。 在输出函数 prt 中,我们使用了一个 alg 参数来...

    模拟进程调度中的高优先级优先调度算法

    在操作系统设计中,进程...总的来说,高优先级优先调度算法是操作系统中用于优化处理器分配的重要策略,其设计和实现涉及到进程管理、优先级分配、上下文切换等多个方面,对于理解和设计操作系统有着至关重要的意义。

    Nachos实现id、限制线程数和按优先级调度算法 源码.rar

    线程的优先级可能与它们的状态、创建时间、等待时间等因素相关,而Nachos可能会有一个数据结构(如优先级队列)来存储待调度的线程,并根据优先级进行排序。 `thread.h`包含了线程类的定义,其中可能有设置和获取...

Global site tag (gtag.js) - Google Analytics