操作系统进程调度

基于优先级的时间片轮转调度算法

一、概述

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;
}

测试结果:

猜你喜欢

转载自blog.csdn.net/six_god_97/article/details/80934062