基于优先级的时间片轮转调度算法
一、概述
1.系统有n个进程,每个进程用一个进程控制块PCB来代表,进程控制块的结构如下图1.1所示:
进程名(作为进程的标识,例:A B C) |
优先级 |
要求运行时间(假设进程需要运行的单位时间数) |
已运行时间(假设进程已经运行的单位时间数,初值为0) |
进程状态(假设有两种状态,就绪状态('1')和结束状态('0')。进程的初始状态都为就绪状态('1')) |
指针(进程按顺序排成单链表,用指针指出下一个进程的进程控制块首地址) |
图1.1
2.每次运行所设计的处理器调度程序调度进程之前,为每个进程确定它的要求运行时间和优先级(数值越大,优先级越高)。
3、进程调度依据优先级进行,优先级随着时间动态增加,每经过一个时间片,在该时间片内运行的进程优先级不变,未运行的进程,优先级加一。直到所有进程全部运行结束。
二、程序设计
基本设计思想:
1.设计一个结构体用来标识每一个进程;
typedef struct PCB{}PCB;//结构体
2.将n个进程初始化,并链成一个单链表;
void creatPCB(PCB *&c)//初始化链表
3.每运行一个时间片,需选择优先级最高的一个进程,并修改以运行时间,其它进程优先级加一;
void Delete(PCB *&c)//删除已运行完(con=0)的进程
4.一个时间片过后,若发现运行结束的进程,将其在单链表中删除,更新链表,回到3的操作,直至单链表中无进程存在。
void select(PCB *c) //选择优先级最高的进程
void update(PCB *&c) //更新链表
void output(PCB *c) //输出链表各结点信息
代码(C++):
#include<iostream>
using namespace std;
#define N 99 //最大进程数
char finish[N];int top=0; //依次记录运行结束进程
int n; //进程数
typedef struct PCB
{
char name; //进程名
int per; //优先级
int time; //要求运行时间
int altime; //已运行时间
int con; //进程状态('1'未运行完,'0'已运行完)
struct PCB *next;
}PCB;
void creatPCB(PCB *&c){ //创建链表
PCB *l,*s;
c=(PCB *)malloc(sizeof(PCB));
c->next=NULL;
l=c;
cout<<"进程数:";
cin>>n;
cout<<"初始化进程(进程名 优先级 要求运行时间)"<<endl;
for(int i=1;i<n+1;i++)
{
s=(PCB*)malloc(sizeof(PCB));
cin>>s->name;
cin>>s->per;
cin>>s->time;
s->altime=0;
s->con=1;
l->next=s;
l=l->next;
}
l->next=NULL;
}
PCB *sel=NULL; //记录优先级最高的进程
void output(PCB *c) //输出链表
{
PCB *l;
l=c->next;
cout<<"名字"<<" "<<"优先级"<<" "<<"要求运行时间"<<" "<<"已用时间"<<" "<<"状态"<<endl;
while(l){
cout<<l->name<<" ";
cout<<l->per<<" ";
cout<<l->time<<" ";
cout<<l->altime<<" ";
cout<<l->con<<endl;
l=l->next;
}
}
void Delete(PCB *&c) //删除已运行完(con=0)的进程
{
PCB *l,*p;
l=c;
while(l->next){
if(l->next->con!=0)
l=l->next;
else
{
p=l->next;
l->next=l->next->next;
free(p);
}
}
}
void select(PCB *c) //选择优先级最高的进程
{
Delete(c);
if(c->next){
PCB *l,*p;
l=c->next;
p=l->next;
while(l->next&&p){
if((l->per)>(p->per))
p=p->next;
else
{
l=p;
p=p->next;
}
}
sel=l;
}
}
void update(PCB *&c) //更新链表
{
if(c->next){
PCB *l;
l=c->next;
while(l)
{
if(l->name==sel->name)
{
l->altime++;
if(l->altime==l->time)
{
l->con=0;
finish[top]=l->name;
++top;
}
}
else
{
l->per++;
}
l=l->next;
}
}
}
int main()
{
PCB *c;
creatPCB(c);
output(c);
while(c->next)
{
select(c);
update(c);
//output(c);
}
cout<<"进程调度完成顺序为:"<<endl;
for(int i=0;i<n;i++)
cout<<finish[i]<<" ";
cout<<endl;
return 0;
}