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

本文介绍了一种基于STL模板的list容器实现的最高优先级进程调度算法。通过重载运算符和自定义排序规则,实现了对多个并发进程的高效调度。代码详细展示了进程的输入、输出、更新和运行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

 

(1)用C语言来实现对N个进程采用动态优先优先算法的进程调度。 (2)每个用来标识进程进程控制块PCB用结构来描述,包括以下字段: •••• 进程标识数 ID。 •••• 进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高。 •••• 进程已占用的CPU时间CPUTIME。 •••• 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。•••• 进程的阻塞时间STARTBLOCK,表示当进程运行STARTBLOCK个时间片后,将进入阻塞状态。 •••• 进程被阻塞的时间BLOCKTIME,表示已足赛的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 •••• 进程状态START。 •••• 队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: •••进程在就绪队列中呆一个时间片,优先数加1。 •••进程运行一个时间片,优先数减3。 (4)假设在调度前,系统中有5个进程,它们的初始状态如下: ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 CPUTIME 0 0 0 0 0 ALLTIME 3 3 6 3 4 STARTBLOCK 2 -1 -1 -1 -1 BLOCKTIME 3 0 0 0 0 STATE READY READY READY READY READY (5)为了清楚的观察各进程调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下: RUNNING PROG:i READY-QUEUE:->id1->id2 BLOCK-QUEUE:->id3->id4 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ID 0 1 2 3 4 PRIORITY P0 P1 P2 P3 P4 CUPTIME C0 C1 C2 C3 C4 ALLTIME A0 A1 A2 A3 A4 STARTBLOCK T0 T1 T2 T3 T4 BLOCKTIME B0 B1 B2 B3 B4 STATE S0 S1 S2 S3 S4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值