最高优先数优先模拟进程运行 使用STL list 初级

设计、编写一个模拟的进程调度程序,采用“最高优先数优先”调度算法对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);
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值