操作系统:C++实现SJF(短作业优先调度算法)

算法描述:

短作业(进程)优先调度算法(SJF),是指对短作业或短进程优先调度的算法。它们可以分 别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个 估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队 列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完 成,或发生某事件而被阻塞放弃处理机时再重新调度

代码:

#include <iostream>
#include<iomanip>
#include<queue>
#include<list>
#include<algorithm>

using namespace std;

class PCB
{
public:
    int pid;
    int arrivalTime;
    int needTime;
    int leaveTime;

    PCB()
    {
    }
    PCB(int pid,int arriveTime,int needTime)
    {
        this->pid=pid;
        this->arrivalTime=arriveTime;
        this->needTime=needTime;
        leaveTime=0;
    }

    bool operator < (const PCB &a)const
    {
        return needTime>a.needTime;
    }
    bool operator == (const PCB &a)const
    {
////        if(pid==a.pid){
////            return true;
////        }
////        else
////            return false;
        return pid==a.pid?true:false;
    }
};

class SJF
{
public:
    priority_queue<PCB> pq;
    list<PCB> allNeedList;
    list<PCB> allFinishList;

    void prepareProcess(int pid,int arriveTime,int needTime);
    void schedule();
    void printFinishList();
};
void SJF::schedule()
{
    int currentTime=0,finishTime=-1;
    bool isBusy=false;
    PCB currentProcess;
    while (true)
    {

        if(currentTime==finishTime)  //这里是每秒都做。currentTime++,故==
        {
            isBusy=false;
            currentProcess.leaveTime=currentTime;
            allFinishList.push_back(currentProcess);
            cout<<"已结束 ";
            cout<<"周转时间:"<<finishTime-currentProcess.arrivalTime;
            cout<<"带权周转时间:"<<(finishTime-currentProcess.arrivalTime)/(double)currentProcess.needTime<<endl;
        }
      //从链表中把到达的进程假如有先队列
        for(list<PCB>::iterator i=allNeedList.begin(); i!=allNeedList.end();)
        {
            if((*i).arrivalTime<=currentTime)
            {
                pq.push(*i);
                allNeedList.erase(i++);
            }
            else
            {
                i++;
            }
        }
        if(!isBusy&&!pq.empty())
        {
            currentProcess=pq.top();
            pq.pop();
            finishTime=currentProcess.needTime+currentTime;
            isBusy=true;
            cout<<"进程"<<currentProcess.pid<<"开始占用处理机,到达时间:"<<currentProcess.arrivalTime<<",需要时间:"<<currentProcess.needTime<<",开始时间:"<<currentTime<<"\n";
        }

        currentTime++;
        //最后所有进程结束,退出
        if(allNeedList.empty()&&pq.empty()&&!isBusy)
            break;
    }

}

void SJF::prepareProcess(int pid,int arriveTime,int needTime)
{
    PCB newProcess(pid,arriveTime,needTime);
    allNeedList.push_back(newProcess);
}


void SJF::printFinishList()
{
    allFinishList.sort();
    setiosflags(ios::left);
    cout<<setw(15)<<"进程"<<setw(15)<<"到达时间"<<setw(15)<<"服务时间"<<setw(15)<<"周转时间"<<setw(15)<<"带权周转时间\n";
    for (list<PCB>::iterator i=allFinishList.begin(); i!=allFinishList.end(); i++)
    {
        cout<<setw(15)<<(*i).pid<<setw(15)<<(*i).arrivalTime<<setw(15)<<(*i).needTime<<setw(15)<<(*i).leaveTime-(*i).arrivalTime<<setw(15)<<((*i).leaveTime-(*i).arrivalTime)/(double)(*i).needTime<<"\n";
    }
}


int main()
{
    SJF one;
//    one.prepareProcess(1,1,4);
//    one.prepareProcess(2,2,3);
//    one.prepareProcess(3,3,7);
//    one.prepareProcess(4,4,2);
//    one.prepareProcess(5,5,1);
//    one.prepareProcess(6,6,4);
//    one.prepareProcess(7,7,2);
//    one.prepareProcess(8,8,2);

    one.prepareProcess(1,2,4);
    one.prepareProcess(2,2,3);
    one.prepareProcess(3,1,7);
    one.prepareProcess(4,4,2);
    one.prepareProcess(5,6,1);
    one.prepareProcess(6,8,4);
    one.prepareProcess(7,11,2);
    one.prepareProcess(8,13,2);

    one.schedule();
    one.printFinishList();
    return 0;
}

注意事项

1.将程序信息使用PCB的类存储,接近操作系统工作原理
2.程序写的比较顺,但是对基本的语法有些不熟,比如stl中的priority_queue,list。优先队列是从大到小排列,要从小到大排列故重载<运算符,用erase函数,故重载==运算符
3.#include<iomanip> setw \n不一样

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 处理机调度与死锁 处理机调度的层次 高级调度/作业调度/长程调度 作用:将外存后备队列中的作业调入内存 对象:作业...
    颜洛滨阅读 830评论 0 1
  • 第三部分 CPU调度 一、相关基本概念 引入多程序设计,目的是提高计算机资源利用率,尤其是CPU利用率(CPU u...
    曲谐_阅读 16,762评论 3 20
  • 一、CPU调度的相关概念 1.1 cpu调度 其任务是控制、协调进程对cpu的竞争,即按一定的调度算法从就绪队列中...
    yjaal阅读 1,141评论 4 5
  • 在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。...
    saviochen阅读 1,889评论 0 9
  • 提起就聘你,也许有很多人还没听说过,它虽是一个今年才刚刚兴起的招聘平台,但自从它成立以来,为众多的中小企业在人才招...
    就聘你阅读 161评论 0 0