一、实验目的与要求

本实验目的是模拟在单处理器情况下处理器调度,加深了解处理器调度的工作。

要求是从优先级调度和时间片轮转法调度算法中选取一个进行实验。

  • 程序中使用的数据结构及符号说明

使用的数据结构:链式循环队列

PCB类:

三、流程图

四、实验测试结果及结果分析

输入五个进程,进程名,优先级,需要运行的时间分别是P1 1 1;P2 2 2;P3 3 3;P4 4 4;P5 5 5

输入后进行打印输出

开始运行:

进程5运行两次后,优先级变为3,比P4小,所以P4进程代替P5开始运行,两次后优先级比P3小。。。一直这样运行,直到各个进程都运行了所需的时间。

  • 实验小结

做完本次实验,我对于动态优先级调度算法有了更加直观清楚的了解,我的编程能力也得到了不小的提升。我认为,本题最关键的就是优先级随着运行变化后,对于进程的排序调度,我利用数组的sort函数,对进程块队列进行了排序,解决了这个最关键的问题,剩下的就是简单的编程了。

附件:含比较详细注释说明的源程序清单

处理机调度.cpp

#include #include #include #include #include "PCB.h"#include "LinkQueue.h"#define N 5//进程数量using namespace std;static PCB *head;int cnt = N;PCB *runningprocess;PCB P[N];LinkQueue *PcbQueue = new LinkQueue();bool cmprank(PCB a, PCB b);void print(const PCB &pcb);void sort(LinkQueue *PcbQueue) //队列排序{for (int i = 0; i DelQueue(P[i]);}sort(P, P + cnt, cmprank);for (int i = 0; i EnQueue(P[i]);}}bool cmprank(PCB a, PCB b){ //优先级从大到小比较函数return a.rank > b.rank;}void print(const PCB &pcb){cout << "\n进程名: " << pcb.name << endl;cout << "时间: " << pcb.reqtime << endl;cout << "要求运行时间: " << pcb.inittime << endl;cout << "优先数: " << pcb.rank << endl;cout << "状态: " << pcb.state < b.reqtime;}int run(){runningprocess = &(PcbQueue->GetFront()->next->data);cout << "\n##########进程" <name <reqtime--; //剩余运行时间-1runningprocess->rank--; //优先级-1if (runningprocess->reqtime == 0){ //某个进程运行结束,打印提示信息PCB temp;cout << "-----------------进程" <name <state = 'E'; //赋予结束状态Eprint(*runningprocess);PcbQueue->DelQueue(temp);cnt--;cout << cnt << endl;}if (cnt == 0){cout << "\n******所有进程都已结束******\n";return 0;}sort(PcbQueue); //按照进程优先级排序run();//递归调用进程运行函数}void input(){for (int i = 0; i < N; i++) //输入各进程状态{cout << "\n请输入第 " << i + 1 <> P[i].name;cout <> P[i].rank;cout <> P[i].inittime;P[i].reqtime = P[i].inittime;P[i].state = 'R'; //初始赋予就绪状态Running}for (int i = 0; i EnQueue(P[i]);}}int main(){input(); //输入各个进程的信息sort(PcbQueue);run(); //进程运行system("pause");return 0;}

LinkQueue.h

#pragma once#include "Node.h"#include "status.h"template class LinkQueue{protected:Node *front, *rear; // 带有队头队尾指针的循环队列public:LinkQueue();virtual ~LinkQueue();int GetLength() const;bool IsEmpty() const;void Clear();Status DelQueue(ElemType &e );Status GetHead(ElemType &e) const; //获取第一个元素Status EnQueue(const ElemType e);void Traverse(void (*Visit)(const ElemType &)) const;Node * GetFront();//获取队列头指针};template Node * LinkQueue::GetFront(){return front;}template void LinkQueue::Traverse(void(Visit)(const ElemType &)) const{Node *p;for (p = front->next; p != NULL; p = p->next)(Visit)(p->data);}template Status LinkQueue::DelQueue(ElemType &e){if (!IsEmpty()){Node *p = front->next;e = p->data;front->next = p->next;if (rear == p)rear = front; //队列中只有一个元素delete p;return SUCCESS;}elsereturn OVER_FLOW;}template Status LinkQueue::EnQueue(const ElemType e){Node *p;p = new Node(e);if (p){rear->next = p;rear = rear->next;return SUCCESS;}elsereturn OVER_FLOW;}template Status LinkQueue::GetHead(ElemType &e) const{if (!IsEmpty()){e = front->next->data;return SUCCESS;}elsereturn OVER_FLOW;}template void LinkQueue::Clear(){Node *p = front->next;while (p != NULL){front->next = p->next;delete p;p = front->next;}rear = front;}template LinkQueue::~LinkQueue(){Clear();delete front;}//判断链式队列是否为空template bool LinkQueue::IsEmpty() const{return rear == front;}template LinkQueue::LinkQueue(){rear = front = new Node();//rear = front = NULL;}

Node.h

#pragma oncetemplatestruct Node{ElemType data;Node* next;Node();Node(ElemType e,Node* link = NULL);};templateNode::Node(){next = NULL;//data = 0;}templateNode::Node(ElemType e,Node *link){data = e;next = link;}

PCB.h

#pragma once#include using namespace std;class PCB{ //进程块public:string name;//进程名int reqtime;//时间int inittime; //要求运行时间int rank;//优先级char state; //状态,R running E endPCB *next; //指向下一个进程};

status.h

#pragma oncetypedef enum{NOT_PRESENT,ENTRY_FOUND,RANGE_ERROR,SUCCESS,OVER_FLOW} Status ;