操作系统实验一 处理器调度
一、实验目的与要求
本实验目的是模拟在单处理器情况下处理器调度,加深了解处理器调度的工作。
要求是从优先级调度和时间片轮转法调度算法中选取一个进行实验。
- 程序中使用的数据结构及符号说明
使用的数据结构:链式循环队列
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 <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
#include "PCB.h"
#include "LinkQueue.h"
#define N 5//进程数量
using namespace std;
static PCB *head;
int cnt = N;
PCB *runningprocess;
PCB P[N];
LinkQueue<PCB> *PcbQueue = new LinkQueue<PCB>();
bool cmprank(PCB a, PCB b);
void print(const PCB &pcb);
void sort(LinkQueue<PCB> *PcbQueue) //队列排序
{
for (int i = 0; i < cnt; i++)
{
PcbQueue->DelQueue(P[i]);
}
sort(P, P + cnt, cmprank);
for (int i = 0; i < cnt; i++)
{
PcbQueue->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 << endl;
}
bool cmpreqtime(PCB a, PCB b)
{
return a.reqtime > b.reqtime;
}
int run()
{
runningprocess = &(PcbQueue->GetFront()->next->data);
cout << "n##########进程" << runningprocess->name << "正在运行##########n";
runningprocess->reqtime--; //剩余运行时间-1
runningprocess->rank--; //优先级-1
if (runningprocess->reqtime == 0)
{ //某个进程运行结束,打印提示信息
PCB temp;
cout << "-----------------进程" << runningprocess->name << "运行结束------------------";
runningprocess->state = 'E'; //赋予结束状态E
print(*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 << "个进程名 :n";
cin >> P[i].name;
cout << "n请输入当前队列的优先级 :n";
cin >> P[i].rank;
cout << "n请输入队列需要运行的时间 :n";
cin >> P[i].inittime;
P[i].reqtime = P[i].inittime;
P[i].state = 'R'; //初始赋予就绪状态Running
}
for (int i = 0; i < cnt; i++)
{
print(P[i]);
PcbQueue->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 ElemType>
class LinkQueue
{
protected:
Node<ElemType> *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<ElemType> * GetFront();//获取队列头指针
};
template <class ElemType>
Node<ElemType> * LinkQueue<ElemType>::GetFront(){
return front;
}
template <class ElemType>
void LinkQueue<ElemType>::Traverse(void(Visit)(const ElemType &)) const
{
Node<ElemType> *p;
for (p = front->next; p != NULL; p = p->next)
(Visit)(p->data);
}
template <class ElemType>
Status LinkQueue<ElemType>::DelQueue(ElemType &e)
{
if (!IsEmpty())
{
Node<ElemType> *p = front->next;
e = p->data;
front->next = p->next;
if (rear == p)
rear = front; //队列中只有一个元素
delete p;
return SUCCESS;
}
else
return OVER_FLOW;
}
template <class ElemType>
Status LinkQueue<ElemType>::EnQueue(const ElemType e)
{
Node<ElemType> *p;
p = new Node<ElemType>(e);
if (p)
{
rear->next = p;
rear = rear->next;
return SUCCESS;
}
else
return OVER_FLOW;
}
template <class ElemType>
Status LinkQueue<ElemType>::GetHead(ElemType &e) const
{
if (!IsEmpty())
{
e = front->next->data;
return SUCCESS;
}
else
return OVER_FLOW;
}
template <class ElemType>
void LinkQueue<ElemType>::Clear()
{
Node<ElemType> *p = front->next;
while (p != NULL)
{
front->next = p->next;
delete p;
p = front->next;
}
rear = front;
}
template <class ElemType>
LinkQueue<ElemType>::~LinkQueue()
{
Clear();
delete front;
}
//判断链式队列是否为空
template <class ElemType>
bool LinkQueue<ElemType>::IsEmpty() const
{
return rear == front;
}
template <class ElemType>
LinkQueue<ElemType>::LinkQueue()
{
rear = front = new Node<ElemType>();
//rear = front = NULL;
}
Node.h
#pragma once
template<class ElemType>
struct Node{
ElemType data;
Node<ElemType>* next;
Node();
Node(ElemType e,Node<ElemType>* link = NULL);
};
template<class ElemType>
Node<ElemType>::Node()
{
next = NULL;
//data = 0;
}
template<class ElemType>
Node<ElemType>::Node(ElemType e,Node<ElemType> *link)
{
data = e;
next = link;
}
PCB.h
#pragma once
#include <string>
using namespace std;
class PCB
{ //进程块
public:
string name; //进程名
int reqtime; //时间
int inittime; //要求运行时间
int rank; //优先级
char state; //状态,R running E end
PCB *next; //指向下一个进程
};
status.h
#pragma once
typedef enum{NOT_PRESENT,ENTRY_FOUND,RANGE_ERROR,SUCCESS,OVER_FLOW} Status ;