设计、编写一个模拟的进程调度程序,采用“最高优先数优先”调度算法对N个并发进程进行调度,“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
其实用数组也可以解决,只是比较麻烦一点。此文使用的是STL模板的list容器。由于博主对于STL还不了解,所以可能有的用法刻板或者不严谨,欢迎评论区指出,相互交流。
代码如下:
#include<iostream>
#include<string.h>
#include<list>
#include<algorithm>
#include<windows.h>
using namespace std;
typedef struct Ppriority{
string Pname;
int priority;
int TotalTime;
int RunTime;
string Pstate;
bool operator > (const Ppriority& c) const //重载大于运算符
{
return(priority > c.priority);
}
}pcb;
typedef list<pcb> pcblist;
/*
*注:由于list.sort()函数使用操作符 < 按照升序排序,
*所以重写了排序规则
*/
bool GreaterSort (pcb a,pcb b) { return (b.priority<a.priority); }
void pcbInput(pcb& Pcb) ///结构体输入
{
cout<<"输入进程名\n";cin>>Pcb.Pname;
cout<<"输入优先级\n";cin>>Pcb.priority;
cout<<"输入总运行时间\n";cin>>Pcb.TotalTime;
Pcb.Pstate = "W";
Pcb.RunTime = 0;
}
void pcblistInput(pcblist& PcbList,int num)///链表输入
{
pcb Pcb;
for(int i =0;i<num;i++)
{
pcbInput(Pcb);
PcbList.push_back(Pcb);
}
}
void pcbOutput(pcb Pcb) ///进程输出
{
cout<<"qname "<<"state "<<"super "<<"ndtime "<<"runtime\n";
cout<<Pcb.Pname<<" "<<Pcb.Pstate<<" "
<<Pcb.priority<<" "<<Pcb.TotalTime<<" "
<<Pcb.RunTime<<endl;
}
void pcblistUpdate(list<pcb>& PcbList,const pcb& LatestPcb)///运行一个进程后更新就绪队列
{
list<pcb>::iterator i;
i = PcbList.begin();
if(i->RunTime == i->TotalTime)//上一次运行过的进程结束
{
cout<<"\n进程"<<i->Pname<<"运行完毕\n";
PcbList.erase(i); //删除已结束进程
}
else //上一次运行进程未结束
{
int num = 0;
for(i = PcbList.begin();i!=PcbList.end();++i)
{
num++; //记录链表中已经遍历了的元素个数
///按优先级规则,将刚才运行过的进程插入就绪队列
if(LatestPcb.priority>i->priority)
{
PcbList.insert(i,LatestPcb);
/*
*注意:上述list.insert()参数:i为插入的位置,LatestPcb是插入内容,
*可以理解为前向插入
*/
PcbList.erase(PcbList.begin());
break;
}
//如果遍历结束也没有优先级更小的进程
if(num==PcbList.size())
{
//cout<<"\njfasdjgpoiashga\n";
PcbList.insert(PcbList.end(),LatestPcb); //插在链表结尾
/*
*注意:上述list.end()返回值是最后一的元素的下一个位置
*/
PcbList.erase(PcbList.begin());
}
}
}
}
void runPcb(list<pcb>& PcbList) ///为进程队列分配时间片
{
pcb LatestPcb;
list<pcb>::iterator i;
i = PcbList.begin();
i->Pstate = "R";
LatestPcb = *i;
cout<<"****当前运行的进程是:"<<LatestPcb.Pname<<endl;
pcbOutput(LatestPcb);
i->priority -= 1;
i->RunTime += 1;
cout<<"\n****当前就绪队列为\n";
++i;
for(;i!=PcbList.end();++i)
{
LatestPcb = *i;
pcbOutput(LatestPcb);
}
cout<<"按 Enter 键继续"<<endl;
cin.get();
i = PcbList.begin();
i->Pstate = "W";
/*for(i=PcbList.begin();i!=PcbList.end();)
{
if(i->RunTime == i->TotalTime)
PcbList.erase(i);
else
++i; //避免eraser方法最终导致 i 变成野指针
}*/
}
int main()
{
list<pcb> PcbList;
int num;cout<<"shurugshu";cin>>num;
pcblistInput(PcbList,num);
PcbList.sort(GreaterSort);
int k = 1;
while(!PcbList.empty())
{
cout<<"\n\n第"<<k++<<"次运行:\n";
runPcb(PcbList);
list<pcb>::iterator it = PcbList.begin();
pcb LatestPcb;
LatestPcb = *it;
pcblistUpdate(PcbList,LatestPcb);
}
}