os 优先级算法处理器调度

1 处理器调度

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

(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为:

  • 进程名——如P1~P5。
  • 指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的地址。
  • 要求运行时间——假设进程需要运行的单位时间数。
  • 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
  • 状态——假设两种状态:就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态。

(2) 开始运行之前,为每个进程确定它的“优先数”和“要求运行时间”。通过键盘输入这些参数。

(3) 处理器总是选择队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。

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

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

要求能接受键盘输入的进程优先数及要求运行时间,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪,就绪进程的排列情况。

#include"pch.h"
#include <iostream>
#include<string>
using namespace std;

struct PCB
{
	string name;
	int priority;
	int time;
	//char state = 'R';    // 我觉得不需要这个 直接拿time是否等于零判断进程状态
	PCB *next;
};

PCB* CreatePCB(string n) {
	PCB* p = new PCB;
	p->name=n;
	cout << "输入"<<p->name<<"的优先级:";
	cin >> p->priority;
	cout << "输入预计运行时间:";
	cin >> p->time;
	return p;
}

//需要传入首结点和要插入的结点,插入的时候按优先级排好
void AddToQueue(PCB* L,PCB* p) {
	//如果只有首结点,直接放在首结点后面
	if (L->next == NULL) {
		L->next = p;
		p->next = NULL;
		return;
	}
	else {
		PCB* r=L; //工作结点r
		//扫描整条链
		while (r->next != NULL) {
			//如果工作结点r优先级小于要插入的结点p 就把p插入在r前面
			if (r->next->priority < p->priority) {
				p->next = r->next;
				r->next = p;
				return;
			}
			else {
				r = r->next;
			}
		}
		//到链尾还比p大,p插在最后
		r->next = p;
		p->next = NULL;
		return;
	}
}

void PrintPCB(PCB* L) {
	cout << "当前队列中的进程:" << endl;
	PCB* w = L->next;
	if (w != NULL) {
		cout << "进程名   优先级   预计运行时间" << endl;
		while (w != NULL) {
			cout << w->name << "\t   " << w->priority << "\t   " << w->time << endl;
			w = w->next;
		}
	}
	else {
		cout << "队列空!" << endl;
	}
}

void Run(PCB* L) {
	PCB* r=L->next;
	while(r!=NULL) {
		cout << "------进程" << r->name << "运行一次------" << endl;
		r->priority--;
		r->time--;
		//时间为0了退出队列不重新加入队列
		if (r->time == 0) {
			//L->next->state = 'E';
			L->next = r->next;
		}
		//时间不为0先退出队列再重新加入队列
		else {
			L->next = r->next;
			r->next = NULL;
			AddToQueue(L, r);
		}
		PrintPCB(L);
		r = L->next;
	}
	cout << "-----系统运行结束-----" << endl;
}

int main() {
	PCB *L;
	L = new PCB;//初始化头结点
	L->next = NULL;
	AddToQueue(L,CreatePCB("p1"));
	AddToQueue(L,CreatePCB("p2"));
	AddToQueue(L,CreatePCB("p3"));
	AddToQueue(L, CreatePCB("p4"));
	AddToQueue(L, CreatePCB("p5"));
	Run(L);
}

这个程序没显示状态。显示的进程都是就绪进程,运行完直接退出队列了没有打印。
系统可以有的进程数量不固定。数据结构就是单向链表,每次插入都要全部遍历一遍。而且每运行一次都要重新插入。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值