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