五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

这篇具有很好参考价值的文章主要介绍了五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明:

1、假设有只两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。

2、每次运行所设计的处理器调度程序调度进程之前,为每个进程随机生成它的要求运行时间。

3、模拟处理器调度,被选中的进程并不实际启动运行,而是执行已运行时间+1来模拟进程的一次

运行,表示进程已经运行过一个单位时间

主要算法的流程图。

1、非抢占式(包括FCFS,SJF,Priority):

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

2、抢占式(包括SRTF):

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

3、轮转调度(包括Round_Robin):

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

1、数据结构:

class Process_Control_Block//进程控制单元类,用于存储进程信息

class PCB_LIST//循环链表类,用于存储和处理事件队列

enum PCB_State {READY, FINISH}; //进程的两种状态,就绪状态和结束状态

2、符号说明:

using PCB = Process_Control_Block//将PCB定义为Pross_Control_Block的别名

2、头文件:

#include <iostream>
#include<string>
#include <cstdlib>
#include<ctime> //srand()要用
#include <iomanip> //setw()要用
using namespace std;

具体声明:

//进程控制单元类

class Process_Control_Block {

public:

    string name;  //进程名

    int arriveTime;  //到达时间

    int needTime; //要求运行时间

    int remainTime; //剩余运行时间

    int runTime; //已运行时间

    int beginTime; //开始时间

    bool isFirstExe; //判断是否第一次执行

    int endTime; //结束时间

    int priority;  //作业优先级

    int turnaroundTime; //轮转时间

    PCB_State state;  //进程状态类型

    Process_Control_Block* next; //指向下一个的指针

    Process_Control_Block();//无参构造

    Process_Control_Block(string pcb_name, int pcb_atime, int pcb_priority);//带参构造

    Process_Control_Block(const PCB* sour);//拷贝构造

    void showPCB(); //打印PCB信息

};

//用于存储进程队列的循环链表类

class PCB_LIST

public:

    PCB* head;  //表头结点

    PCB_LIST() {

        head = new PCB();

        head->next = head;  //初始时头结点的下一个还是头结点

    }

    void InsertByArriveTime(PCB* pcb); //按到达时间插入

    void InsertByNeedTime(PCB* pcb);  //按进程所需时间插入

    void InsertByEndTime(PCB* pcb);  //按进程结束时间插入

    void InsertByPriority(PCB* pcb);  //按进程优先级插入

    void InsertByRemainTime(PCB* pcb);  //按进程剩余时间插入

    void InsertAtTail(PCB* pcb);  //插入到队列最后

    bool deleteByName(string pcb_name); //根据进程名删除进程

    bool updata(PCB* pcb);//更新某进程的状态

    void showAll(); //打印全部进程状态

    bool isEmpty();  //判断链表中所有进程任务都已完成

    int getSize(); //获得队列长度

    PCB* getTail();//获得队列中最后一个PCB

    double getAverTurnTime(); //获得平均轮转时间

    double getAverWaitTime();//计算平均等待时间

double getThroughput();//获得吞吐量

double getResponseTime(); //获得平均响应时间

    void clear_list();//清空队列

    PCB* FetchFirstPCB(); //获取队列中第一个PCB

};

(其中函数具体实现代码见附录)

3、程序清单及注释:

函数声明:

//打印进程信息表头                             

void print_header();

//计算并打印进程总体信息(如吞吐量,CPU利用率等)

void showInfo(PCB_LIST* finishQueue);

//输入作业信息,按发生时间插入队列

void wirite_list(PCB_LIST* pcb_list);

//PCB的拷贝方法(不改变指针指向,只改变内容)

void CopyPCB(PCB* dest, const PCB* sour);

//最短作业时间优先

void SJF(PCB_LIST* pcb_list);

//先来先服务

void FCFS(PCB_LIST* pcb_list);

//最短剩余时间优先

void SRTF(PCB_LIST* pcb_list);

//按优先级,运行一个时间片后下调优先级别(时间片长度为2)

void Priority(PCB_LIST* pcb_list);

//时间片轮转(时间片大小为2)

void Round_Robin(PCB_LIST* pcb_list);

具体实现:

//最短作业时间优先

void SJF(PCB_LIST* pcb_list) {

    int currentTime = 0;            //当前时间

    bool isCPU_Busy = false;        //CPU忙碌状态

    PCB_LIST* readyQueue = new PCB_LIST(); //就绪队列

    PCB_LIST* finishQueue = new PCB_LIST(); //结束队列

    PCB* run_pcb = pcb_list->FetchFirstPCB(); //正在运行的pcb

    PCB* arrived_pcb = run_pcb; //当前已经到达的pcb

    while (!pcb_list->isEmpty()) {  //判断事件队列是否为空

        while (arrived_pcb != pcb_list->head && currentTime >= arrived_pcb->arriveTime) {

            if (isCPU_Busy) { //如CPU忙碌,则按作业时间插入就绪队列

                readyQueue->InsertByNeedTime(arrived_pcb);

            }

            else {

                run_pcb = arrived_pcb;   //如CPU空闲,将到达的pcb设为正在运行的pcb

            }

            arrived_pcb = arrived_pcb->next;

        }

        if (run_pcb->state == PCB_State::READY) {

            isCPU_Busy = true;

            if (run_pcb->isFirstExe) { //第一次执行记录开始时间

                run_pcb->beginTime = currentTime;  //进程发生时间为当前时间

                run_pcb->isFirstExe = false;

            }

            run_pcb->runTime = currentTime - run_pcb->beginTime;  //已运行时间

            run_pcb->remainTime = run_pcb->needTime - run_pcb->runTime; //剩余运行时间

            if (run_pcb->runTime == run_pcb->needTime) {

                run_pcb->endTime = currentTime; //设定结束时间

                run_pcb->turnaroundTime = run_pcb->endTime - run_pcb->arriveTime;

                run_pcb->state = PCB_State::FINISH; //状态改为结束

                finishQueue->InsertByEndTime(run_pcb);  //按结束时间插入结束队列

            }

            currentTime++;

        }

        if (run_pcb->state == PCB_State::FINISH) {

            cout << "时间:" << currentTime - 1 << endl;

            cout << "此时运行的进程:" << endl;

            print_header();

            run_pcb->showPCB();

            cout << "结束的进程:" << endl;

            print_header();

            finishQueue->showAll();

           

            string finish_name = run_pcb->name; //已结束进程的名字

            isCPU_Busy = false;

            readyQueue->deleteByName(finish_name);

            if (!readyQueue->isEmpty()) {

                run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个

            }

            pcb_list->deleteByName(finish_name);

            cout << "就绪队列状态:" << endl;

            print_header();

            readyQueue->showAll();

            cout << endl;

        }

    }

    showInfo(finishQueue);  //打印总体信息

}

//先来先服务

void FCFS(PCB_LIST* pcb_list) {

    int currentTime = 0;            //当前时间

    bool isCPU_Busy = false;        //CPU忙碌状态

    PCB_LIST* readyQueue = new PCB_LIST(); //就绪队列

    PCB_LIST* finishQueue = new PCB_LIST(); //结束队列

    PCB* run_pcb = pcb_list->FetchFirstPCB(); //取最先到达的进程运行

    PCB* arrived_pcb = run_pcb; //当前已经到达的pcb

    while (!pcb_list->isEmpty()) {  //判断事件队列是否为空

        while (arrived_pcb != pcb_list->head) {

            readyQueue->InsertByArriveTime(arrived_pcb);

            arrived_pcb = arrived_pcb->next;

        }

        if (run_pcb->state == PCB_State::READY) {

            isCPU_Busy = true;

            if (run_pcb->arriveTime > currentTime) {

                currentTime = run_pcb->arriveTime;

            }

            run_pcb->beginTime = currentTime;

            run_pcb->endTime = run_pcb->beginTime + run_pcb->needTime;

            run_pcb->runTime = run_pcb->needTime;

            currentTime = run_pcb->endTime;

            run_pcb->remainTime = 0;

            run_pcb->turnaroundTime = run_pcb->endTime - run_pcb->arriveTime;

            run_pcb->state = PCB_State::FINISH;

            finishQueue->InsertByEndTime(run_pcb);

        }

        if (run_pcb->state == PCB_State::FINISH) {

            cout << "时间:" << currentTime - 1 << endl;

            cout << "在运行的进程:" << endl;

            print_header();

            run_pcb->showPCB();

            cout << "已完成的线程:" << endl;

            print_header();

            finishQueue->showAll();

            string finish_name = run_pcb->name; //已结束进程的名字

            isCPU_Busy = false;

            readyQueue->deleteByName(finish_name);

            if (!readyQueue->isEmpty()) {

                run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个开始运行

            }

            pcb_list->deleteByName(finish_name);

            cout << "就绪队列状态:" << endl;

            print_header();

            readyQueue->showAll();

            cout << endl;

        }

    }

    showInfo(finishQueue);  //打印总体信息

}

//按优先级(每次运行后优先级不变)

void Priority(PCB_LIST* pcb_list)

{

    int currentTime = 0;            //当前时间

    bool isCPU_Busy = false;        //CPU忙碌状态

    PCB_LIST* readyQueue = new PCB_LIST(); //就绪队列

    PCB_LIST* finishQueue = new PCB_LIST(); //结束队列

    PCB* run_pcb = pcb_list->FetchFirstPCB(); //正在运行的pcb

    PCB* arrived_pcb = run_pcb; //当前已经到达的pcb

    while (!pcb_list->isEmpty()) { //判断事件队列是否为空

        while (arrived_pcb != pcb_list->head && currentTime >= arrived_pcb->arriveTime) {

            if (isCPU_Busy) { //如CPU忙碌,则按作业优先级插入就绪队列

                readyQueue->InsertByPriority(arrived_pcb);

            }

            else {

                run_pcb = arrived_pcb;   //如CPU空闲,将到达的pcb设为正在运行的pcb

            }

            arrived_pcb = arrived_pcb->next;

        }

        if (run_pcb->state == PCB_State::READY) {

            isCPU_Busy = true;

            if (run_pcb->isFirstExe) { //第一次执行记录开始时间

                run_pcb->beginTime = currentTime;  //进程发生时间为当前时间

                run_pcb->isFirstExe = false;

            }

            run_pcb->runTime = currentTime - run_pcb->beginTime;  //已运行时间

            run_pcb->remainTime = run_pcb->needTime - run_pcb->runTime; //剩余运行时间

            if (run_pcb->runTime == run_pcb->needTime) {

                run_pcb->endTime = currentTime; //设定结束时间

                run_pcb->turnaroundTime = run_pcb->endTime - run_pcb->arriveTime; //计算轮转时间

                run_pcb->state = PCB_State::FINISH; //状态改为结束

                finishQueue->InsertByEndTime(run_pcb);  //按结束时间插入结束队列

            }

            currentTime++;

        }

        if (run_pcb->state == PCB_State::FINISH) {

            cout << "时间:" << currentTime - 1 << endl;

            cout << "在运行的进程:" << endl;

            print_header();

            run_pcb->showPCB();

            cout << "已完成的进程:" << endl;

            print_header();

            finishQueue->showAll();

            string finish_name = run_pcb->name; //已结束进程的名字

            isCPU_Busy = false;

            readyQueue->deleteByName(finish_name);

            if (!readyQueue->isEmpty()) {

                run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个

            }

            pcb_list->deleteByName(finish_name);

            cout << "就绪队列状态:" << endl;

            print_header();

            readyQueue->showAll();

            cout << endl;

        }

    }

    showInfo(finishQueue);  //打印总体信息

}

//按优先级,运行一个时间片后下调优先级别(时间片长度为2)

void Priority_2(PCB_LIST* pcb_list) {

    int currentTime = 0;            //当前时间

    bool isCPU_Busy = false;        //CPU忙碌状态

    PCB_LIST* readyQueue = new PCB_LIST(); //就绪队列

    PCB_LIST* finishQueue = new PCB_LIST(); //结束队列

    int timeSlice = 2; //时间片大小为2

    PCB* run_pcb = pcb_list->FetchFirstPCB(); //正在运行的pcb(最先到达的进程)

    PCB* arrived_pcb = run_pcb; //当前已经到达的pcb

    while (!pcb_list->isEmpty()) {//判断事件队列是否为空

        while (arrived_pcb != pcb_list->head && currentTime >= arrived_pcb->arriveTime) { //如当前时间已超过到达时间,则插入就绪队列

            if (isCPU_Busy) { //如CPU忙碌,则按到达时间插入就绪队列末尾

                cout << "就绪队列状态:" << endl;

                readyQueue->showAll();

                run_pcb = readyQueue->FetchFirstPCB();

            }

            else {

                run_pcb = arrived_pcb;   //如CPU空闲,将到达的pcb设为正在运行的pcb

            }

            arrived_pcb = arrived_pcb->next; //到达的pcb指向下一个

        }

        if (!readyQueue->isEmpty())

            run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个

        else//如就绪队列为空,就直接取事件队列第一个,并将当前时间设为它的到达时间

            run_pcb = pcb_list->FetchFirstPCB();

        }

        if (run_pcb->state == PCB_State::READY) {

            isCPU_Busy = true;

            if (run_pcb->isFirstExe) {

                run_pcb->beginTime = currentTime;  //进程发生时间为当前时间

                run_pcb->isFirstExe = false;

            }

            currentTime += timeSlice;  //每次加时间片的长度

            run_pcb->runTime += timeSlice; //已运行时间+时间片长度

            run_pcb->remainTime = run_pcb->needTime - run_pcb->runTime; //计算剩余时间

            run_pcb->priority += 2;

           

            if (run_pcb->remainTime <= 0) {

                run_pcb->endTime = currentTime + run_pcb->remainTime; //设定结束时间(减去小于0的部分)

                run_pcb->turnaroundTime = run_pcb->endTime - run_pcb->arriveTime;  //计算轮转时间

                run_pcb->state = PCB_State::FINISH; //状态改为结束

                run_pcb->remainTime = 0; //保证剩余时间不是负数

                finishQueue->InsertByEndTime(run_pcb);  //按结束时间插入结束队列

            }

            pcb_list->updata(run_pcb);    //更新事件队列中的信息

            PCB* temp = new PCB(run_pcb);

            readyQueue->deleteByName(run_pcb->name); //删除原队列中正在运行的进程

            if (temp->state == PCB_State::READY)//如没有结束

                readyQueue->InsertByPriority(temp);  //重新插入就绪队列尾部

            while (arrived_pcb != pcb_list->head && arrived_pcb->arriveTime <= currentTime) { //查看此时有无到达的队列

                readyQueue->InsertByPriority(arrived_pcb); //插入到达的进程

                arrived_pcb = arrived_pcb->next; //到达的pcb指向下一个

            }

            if (temp->state != PCB_State::READY) { //如进程结束了就打印信息

                cout << "时间:" << currentTime << endl;

                cout << "在该时间片运行进程:" << endl;

                print_header();

                temp->showPCB();

                cout << "结束的进程:" << endl;

                print_header();

                finishQueue->showAll();

                cout << "运行结束后就绪队列状态:" << endl;

                print_header();

                readyQueue->showAll();

                cout << endl;

            }

        }

        if (run_pcb->state == PCB_State::FINISH) {

            string finish_name = run_pcb->name; //已结束进程的名字

            isCPU_Busy = false;

            readyQueue->deleteByName(finish_name);

            if (!readyQueue->isEmpty()) {

                run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个

            }

            pcb_list->deleteByName(finish_name);

        }

    }

    showInfo(finishQueue);  //打印总体信息

}

//最短剩余时间优先

void SRTF(PCB_LIST* pcb_list) {

    int currentTime = 0;            //当前时间

    bool isCPU_Busy = false;        //CPU忙碌状态

    PCB_LIST* readyQueue = new PCB_LIST(); //就绪队列

    PCB_LIST* finishQueue = new PCB_LIST(); //结束队列

    PCB* run_pcb = pcb_list->FetchFirstPCB(); //正在运行的pcb

    PCB* arrived_pcb = run_pcb; //当前已经到达的pcb

    while (!pcb_list->isEmpty()) {//判断事件队列是否为空

        while (arrived_pcb != pcb_list->head && currentTime >= arrived_pcb->arriveTime) { //如当前时间已超过到达时间,则插入就绪队列

            if (isCPU_Busy) { //如CPU忙碌,则按作业剩余时间插入就绪队列

                readyQueue->InsertByRemainTime(arrived_pcb);  //将新进入的进程插入就绪队列

                if (arrived_pcb->remainTime <= run_pcb->remainTime) {  //新进入的进程剩余时间小于正在运行的进程,则终止正在运行的进程,重新插入就绪队列

                    PCB* re_run = new PCB(run_pcb);

                    readyQueue->deleteByName(run_pcb->name); //删除原队列中的数据

                    readyQueue->InsertByRemainTime(re_run);  //重新插入队列中

                    run_pcb = readyQueue->FetchFirstPCB(); //新的运行进程为就绪队列最前的进程

                }

            }

            else {

                run_pcb = arrived_pcb;   //如CPU空闲,将到达的pcb设为正在运行的pcb

            }

            arrived_pcb = arrived_pcb->next;

       }

        if (run_pcb->state == PCB_State::READY) {

            isCPU_Busy = true;

            if (run_pcb->isFirstExe) {

                run_pcb->beginTime = currentTime;  //进程发生时间为当前时间

                run_pcb->isFirstExe = false;

            }

            run_pcb->runTime++; //已运行时间+1

            run_pcb->remainTime = run_pcb->needTime - run_pcb->runTime; //计算剩余时间

            if (run_pcb->remainTime == 0) {

                run_pcb->endTime = currentTime; //设定结束时间

                run_pcb->turnaroundTime = run_pcb->endTime - run_pcb->arriveTime;  //计算轮转时间

                run_pcb->state = PCB_State::FINISH; //状态改为结束

                finishQueue->InsertByEndTime(run_pcb);  //按结束时间插入结束队列

            }

            currentTime++;

           

       }

        if (run_pcb->state == PCB_State::FINISH) {

            cout << "时间:" << currentTime - 1 << endl;

            cout << "此时运行的进程:" << endl;

            print_header();

            run_pcb->showPCB();

            cout << "结束的进程:" << endl;

            print_header();

            finishQueue->showAll();

            string finish_name = run_pcb->name; //已结束进程的名字

            isCPU_Busy = false;

            readyQueue->deleteByName(finish_name);

            if (!readyQueue->isEmpty()) {

                run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个

                isCPU_Busy = true;

            }

            pcb_list->deleteByName(finish_name);

            cout << "就绪队列状态:" << endl;

            print_header();

            readyQueue->showAll();

            cout << endl;

        }

    }

    showInfo(finishQueue);  //打印总体信息

}

//时间片轮转(时间片大小为2)

void Round_Robin(PCB_LIST* pcb_list) {

    int currentTime = 0;            //当前时间

    bool isCPU_Busy = false;        //CPU忙碌状态

    PCB_LIST* readyQueue = new PCB_LIST(); //就绪队列

    PCB_LIST* finishQueue = new PCB_LIST(); //结束队列

    int timeSlice = 2; //时间片大小为2

    PCB* run_pcb = pcb_list->FetchFirstPCB(); //正在运行的pcb(最先到达的进程)

    PCB* arrived_pcb = run_pcb; //当前已经到达的pcb

    while (!pcb_list->isEmpty()) {//判断事件队列是否为空

        while (arrived_pcb != pcb_list->head && currentTime >= arrived_pcb->arriveTime) { //如当前时间已超过到达时间,则插入就绪队列

            if (isCPU_Busy) { //如CPU忙碌,则按到达时间插入就绪队列末尾

                run_pcb = readyQueue->FetchFirstPCB();

            }

            else {

                run_pcb = arrived_pcb;   //如CPU空闲,将到达的pcb设为正在运行的pcb

            }

            arrived_pcb = arrived_pcb->next; //到达的pcb指向下一个

        }

        if (!readyQueue->isEmpty())

            run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个

        else//如就绪队列为空,就直接取事件队列第一个,并将当前时间设为它的到达时间

            run_pcb = pcb_list->FetchFirstPCB();

        }

        if (run_pcb->state == PCB_State::READY) {

            isCPU_Busy = true;

            if (run_pcb->isFirstExe) {

                run_pcb->beginTime = currentTime;  //进程发生时间为当前时间

                run_pcb->isFirstExe = false;

            }

            currentTime += timeSlice;  //每次加时间片的长度

            run_pcb->runTime += timeSlice; //已运行时间+时间片长度

            run_pcb->remainTime = run_pcb->needTime - run_pcb->runTime; //计算剩余时间

            if (run_pcb->remainTime <= 0) {

                run_pcb->endTime = currentTime + run_pcb->remainTime; //设定结束时间(减去小于0的部分)

                run_pcb->turnaroundTime = run_pcb->endTime - run_pcb->arriveTime; //计算轮转时间

                run_pcb->state = PCB_State::FINISH; //状态改为结束

                run_pcb->remainTime = 0; //保证剩余时间不是负数

                finishQueue->InsertByEndTime(run_pcb);  //按结束时间插入结束队列

            }

            pcb_list->updata(run_pcb);  //每次更新时间队列中的信息

            PCB* temp = new PCB(run_pcb);

            readyQueue->deleteByName(run_pcb->name); //删除原队列中正在运行的进程

            if (temp->state == PCB_State::READY)//如没有结束

                readyQueue->InsertAtTail(temp);  //重新插入就绪队列尾部

            while (arrived_pcb != pcb_list->head && arrived_pcb->arriveTime <= currentTime) { //查看此时有无到达的队列

                readyQueue->InsertAtTail(arrived_pcb); //插入到达的进程

                arrived_pcb = arrived_pcb->next; //到达的pcb指向下一个

            }

            if (temp->state != PCB_State::READY) { //如进程结束了就打信息

                cout << "时间:" << currentTime << endl;

                cout << "在该时间片运行进程:" << endl;

                print_header();

                temp->showPCB();

                cout << "结束的进程:" << endl;

                print_header();

                finishQueue->showAll();

                cout << "运行结束后就绪队列状态:" << endl;

                print_header();

                readyQueue->showAll();

                cout << endl;

            }

        }

        if (run_pcb->state == PCB_State::FINISH) {

            string finish_name = run_pcb->name; //已结束进程的名字

            isCPU_Busy = false;

            readyQueue->deleteByName(finish_name);

            if (!readyQueue->isEmpty()) {

                run_pcb = readyQueue->FetchFirstPCB();  //取就绪队列的第一个

            }

            pcb_list->deleteByName(finish_name);

        }

    }

    showInfo(finishQueue);  //打印总体信息

}

//打印表头

void print_header() { 

    cout << setw(8) << "进程名" << setw(10) << "到达时间" << setw(10) << "所需时间" << setw(10) << "开始时间" << setw(10) << "结束时间" << setw(10)<<"运行时间" << setw(10) << "剩余时间" << setw(8) << "优先级" << endl;

}

//打印进程总体信息

void showInfo(PCB_LIST* finishQueue) {

    cout << "CPU Utilization: 100%" << endl;

    cout << "Throughput: " << finishQueue->getThroughput() << endl;

    cout << "Average turnaround time: " << finishQueue->getAverTurnTime() << endl;

    cout << "Average waiting time: " << finishQueue->getAverWaitTime() << endl;

    cout << "Response time: 0" << endl;

}

//输入作业信息,按发生时间插入队列

void wirite_list(PCB_LIST* pcb_list) { 

    pcb_list->InsertByArriveTime(new PCB("B", 2, 1));

    pcb_list->InsertByArriveTime(new PCB("A", 0, 1));

    pcb_list->InsertByArriveTime(new PCB("C", 5, 2));

    pcb_list->InsertByArriveTime(new PCB("D", 5, 1));

    pcb_list->InsertByArriveTime(new PCB("E", 12, 4));

    pcb_list->InsertByArriveTime(new PCB("F", 15, 2));

}

//PCB的拷贝方法(不改变指针指向,只改变内容)

void CopyPCB(PCB* dest, const PCB* sour) { 

    dest->arriveTime = sour->arriveTime;

    dest->name = sour->name;

    dest->needTime = sour->needTime;

    dest->priority = sour->priority;

    dest->remainTime = sour->remainTime;

    dest->runTime = sour->runTime;

    dest->beginTime = sour->beginTime;

    dest->state = sour->state;

    dest->endTime = sour->endTime;

    dest->isFirstExe = sour->isFirstExe;

    dest->turnaroundTime = sour->turnaroundTime;

}

主函数:

int main()

{

    PCB_LIST* pcb_list = new PCB_LIST(); //新建事件队列

    cout << "---------------SRTF---------------" << endl;

    wirite_list(pcb_list);

    SRTF(pcb_list);

    pcb_list->clear_list();

    cout << "---------------SJF---------------" << endl;

    wirite_list(pcb_list);

    SJF(pcb_list);

    pcb_list->clear_list();

    cout << "---------------FCFS---------------" << endl;

    wirite_list(pcb_list);

    FCFS(pcb_list);

    pcb_list->clear_list();

    cout << "---------------Priority---------------" << endl;

    wirite_list(pcb_list);

    Priority(pcb_list);

    pcb_list->clear_list();

    cout << "---------------Round_Robin---------------" << endl;

    wirite_list(pcb_list);

    Round_Robin(pcb_list);

    pcb_list->clear_list();

}

附录

循环链表类PCB_LIST及进程控制块类PCB函数实现代码:

1PCB类:

void Process_Control_Block::showPCB() {

    cout<< setw(8) << name << setw(10) << arriveTime  << setw(10)<< needTime << setw(10)  << beginTime << setw(10)  << endTime << setw(10) << runTime << setw(10) << remainTime << setw(8) << priority << endl;

}

//拷贝构造

Process_Control_Block::Process_Control_Block(const PCB* sour) {

    arriveTime = sour->arriveTime;

    name = sour->name;

    needTime = sour->needTime;

    priority = sour->priority;

    remainTime = sour->remainTime;

    runTime = sour->runTime;

    beginTime = sour->beginTime;

    state = sour->state;

    endTime = sour->endTime;

    turnaroundTime = sour->turnaroundTime;

    isFirstExe = sour->isFirstExe;

    next = NULL;

}

//无参构造

Process_Control_Block::Process_Control_Block() {

    needTime = 1 + rand() % 10;

    state = PCB_State::READY//状态设为就绪

    runTime = 0;  //已运行时间设为0

    beginTime = 0; //开始时间设为0

    endTime = 0;   //结束时间设为0

    remainTime = needTime; //时间等于所需时间

    isFirstExe = true//是第一次指行

    arriveTime = 0; //到达时间设为0

    priority = 0; //优先级设为0

    turnaroundTime = 0;  //轮转时间设为0

    next = NULL//初始的下一个事件为空

}

//带参构造

Process_Control_Block::Process_Control_Block(string pcb_name, int pcb_atime, int pcb_priority) {

    name = pcb_name;

    arriveTime = pcb_atime;

    priority = pcb_priority;

    needTime = 1 + rand() % 10;  //随机生成所需时间

    state = PCB_State::READY//状态设为就绪

    runTime = 0;  //已运行时间设为0

    beginTime = 0; //发生时间设为0

    endTime = 0;   //结束时间设为0

    turnaroundTime = 0; //轮转时间设为0

    isFirstExe = true//是第一次指行

    remainTime = needTime; //时间等于所需时间

    next = NULL//初始的下一个事件为空

}

2PCB_LIST类:

//获得平均响应时间

double PCB_LIST::getResponseTime() {

    PCB* p = head->next;

    double sum = 0;

    double n = getSize();

    if (p->next == head)

        return -1;

    while (p != head) {

        sum = sum + (p->beginTime - p->arriveTime);

        p = p->next;

    }

    return sum / n;

}

void PCB_LIST::clear_list() {

    PCB* p = head->next;

    while (p != head) {

        head->next = p->next;

        delete p;

        p = head->next;

    }

}

//获得吞吐量

double PCB_LIST::getThroughput() {

    if (!isEmpty()) {

        double sum_time = getTail()->endTime;

        double n = getSize();

        return n / sum_time;

    }

    return 0;

}

//计算平均等待时间

double PCB_LIST::getAverWaitTime() {

    PCB* p = head->next;

    double sum = 0;

    double n = getSize();

    if (p->next == head)

        return -1;

    while (p != head) {

        sum = sum + (p->endTime - p->arriveTime - p->runTime);

        p = p->next;

    }

    return sum / n;

}

//获得平均轮转时间

double PCB_LIST::getAverTurnTime() {

    PCB* p = head->next;

    double sum = 0;

    double n = getSize();

    if (p->next == head)

        return -1;

    while (p != head) {

        sum += p->turnaroundTime;

        p = p->next;

    }

    return sum / n;

}

//获得尾部结点

PCB* PCB_LIST::getTail() {

    PCB* p = head;

    if (p->next == head)

        return NULL;

    while (p->next != head) {

        p = p->next;

    }

    return p;

}

//获得队列长度

int PCB_LIST::getSize() {

    int cont = 0;

    PCB* p = head->next;

    while (p != head) {

        p = p->next;

        cont++;

    }

    return cont;

}

//插入到队列最后

void PCB_LIST::InsertAtTail(PCB* pcb) {

    PCB* p = head;

    PCB* new_pcb = new PCB(pcb);

    while (p->next != head) {

        p = p->next;

    }

    p->next = new_pcb;

    new_pcb->next = head;

}

//更新某进程的状态

bool PCB_LIST::updata(PCB* pcb) {

    PCB* p = head->next;

    if (p == head) {  //如为空返回

        return false;

    }

    while (p != head && p->name != pcb->name) {  //找到要删除结点的前一个

        p = p->next;

    }

    if (p == head) {  //如没找到,返回false

        return false;

    }

    CopyPCB(p, pcb);

    return true;

}

//按进程剩余时间插入

void PCB_LIST::InsertByRemainTime(PCB* pcb) {

    PCB* p = head;

    PCB* new_pcb = new PCB(pcb);

    while (p->next != head && p->next->remainTime < pcb->remainTime) {

        p = p->next;

    }

    if (p == head && head->next == head) {  //如链表中只有头结点

        head->next = new_pcb;

        new_pcb->next = head;

    }

    else if (p->next == head) {  //如果要插在最后

        p->next = new_pcb;

        new_pcb->next = head;

    }

    else//在中间插入

        PCB* q = p->next;

        p->next = new_pcb;

        new_pcb->next = q;

    }

}

//按进程优先级插入

void PCB_LIST::InsertByPriority(PCB* pcb) {

    PCB* p = head;

    PCB* new_pcb = new PCB(pcb);

    while (p->next != head && p->next->priority < pcb->priority) {

        p = p->next;

    }

    if (p == head && head->next == head) {  //如链表中只有头结点

        head->next = new_pcb;

        new_pcb->next = head;

    }

    else if (p->next == head) {  //如果要插在最后

        p->next = new_pcb;

        new_pcb->next = head;

    }

    else//在中间插入

        PCB* q = p->next;

        p->next = new_pcb;

        new_pcb->next = q;

    }

}

//按到达时间插入

void PCB_LIST::InsertByArriveTime(PCB* pcb) { 

    PCB* p = head;

    PCB* new_pcb = new PCB(pcb);

    while (p->next != head && p->next->arriveTime < pcb->arriveTime) {

        p = p->next;

    }

    if (p == head && head->next == head) {  //如链表中只有头结点

        head->next = new_pcb;

        new_pcb->next = head;

    }

    else if(p->next == head) {  //如果要插在最后

        p->next = new_pcb;

        new_pcb->next = head;

    }

    else//在中间插入

        PCB* q = p->next;

        p->next = new_pcb;

        new_pcb->next = q;

    }

}

//按进程所需时间插入

void PCB_LIST::InsertByNeedTime(PCB* pcb) { 

    PCB* p = head;

    PCB* new_pcb = new PCB(pcb);

    while (p->next != head && p->next->needTime < pcb->needTime) {

        p = p->next;

    }

    if (p == head && head->next == head) {  //如链表中只有头结点

        head->next = new_pcb;

        new_pcb->next = head;

    }

    else if (p->next == head) {  //如果要插在最后

        p->next = new_pcb;

        new_pcb->next = head;

    }

    else//在中间插入

        PCB* q = p->next;

        p->next = new_pcb;

        new_pcb->next = q;

    }

}

//按进程结束时间插入

void PCB_LIST::InsertByEndTime(PCB* pcb) {

    PCB* p = head->next;

    PCB* new_pcb = new PCB(pcb);

    while (p->next != head && p->next->endTime < pcb->endTime) {

        p = p->next;

    }

    if (p == head && head->next == head) {  //如链表中只有头结点

        head->next = new_pcb;

        new_pcb->next = head;

    }

    else if (p->next == head) {  //如果要插在最后

        p->next = new_pcb;

        new_pcb->next = head;

    }

    else//在中间插入

        PCB* q = p->next;

        p->next = new_pcb;

        new_pcb->next = q;

    }

}

//根据进程名删除进程

bool PCB_LIST::deleteByName(string pcb_name) {

    PCB* p = head;

    if (p->next == head) {  //如链表为空返回

        return false;

    }

    while (p->next != head && p->next->name != pcb_name) {  //找到要删除结点的前一个

        p = p->next;

    }

    if (p->next == head) {  //如没找到,返回false

        return false;

    }

    else {

        PCB* q = p->next;  //q为要删除结点

        p->next = q->next;

        delete q;

    }

    return true;

}

//打印全部进程状态

void PCB_LIST::showAll() { 

    PCB* p = head->next;

    while (p != head) {

        p->showPCB();

        p = p->next;

    }

}

//判断是否为空表

bool PCB_LIST::isEmpty() { 

    if (head->next == head)

        return true;

    return false;

}

//获取队列中第一个PCB

PCB* PCB_LIST::FetchFirstPCB() {

    if (head->next == head) 

        return NULL;

    return head->next;

}

运行截图:

1、测试数据:

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

2、运行结果

SRTF

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

 ②SJF:

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

FCFS

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

Priority

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

Round_Robin

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)文章来源地址https://www.toymoban.com/news/detail-474715.html

到了这里,关于五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统:用C语言实现FCFS(先来先服务),SJF(短作业抢占)和RR(时间片轮转,时间片=1)

       加深对进程调度的理解,熟悉进程调度的不同算法,比较其优劣性。 假如一个系统中有5个进程,它们的到达时间内如表1所示,忽略I/O以及其他开销时间。若分别按先来先服务(FCFS)、抢占的短作业优先(SJF)、时间片轮转(RR,时间片=1)进行CPU调度,请按照上述三个

    2024年02月04日
    浏览(58)
  • 【操作系统】基于动态优先级的进程调度算法-C语言实现(有代码)

    本文章将会介绍如何编写动态优先级的进程调度算法,并使用从语言实现。 一、什么是动态优先级的调度算法        进程运行一个时间片后,如果进程已占用 CPU时间已达到所需要的运行时间,则撤消该进程;如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行

    2024年02月06日
    浏览(50)
  • 磁盘调度算法之先来先服务(FCFS),最短寻找时间优先(SSTF),扫描算法(SCAN,电梯算法),LOOK调度算法

    寻找时间(寻道时间) Ts:在读/写数据前,将磁头移动到指定磁道所花的时间。 ① 启动磁头臂 是需要时间的。假设耗时为s; ② 移动磁头 也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。 则寻道时间 T s = s + m ∗ n Ts =s + m*n T s = s + m ∗

    2024年02月08日
    浏览(47)
  • 【操作系统】磁盘调度算法(FCFS、SSTF、SCAN 和 C-LOOK 调度策略)

    实验内容:硬盘调度 编写一个 C 程序模拟实现课件 Lecture25 中的硬盘磁头调度算法,包括 FCFS、SSTF、SCAN 和 C-LOOK 调度策略。 固定一个硬盘柱面数; 输入一批随机的硬盘柱面请求序列,计算各个调度策略下的磁头移动平均总距离 (假设磁头运动是理想匀速的,可以把移动距离

    2024年02月11日
    浏览(40)
  • 用代码模拟操作系统进程调度算法(Python)

     引言 近日,在学习完操作系统的进程调度部分后,我萌生了一个有趣的想法:通过编写代码来模拟进程调度算法,以加深自己对这一知识点的理解。于是,我花了一整天的时间投入到了这个突发奇想的实践中。  背景 进程调度是操作系统中的重要概念,它决定了如何合理地

    2024年02月06日
    浏览(55)
  • 编写C程序模拟实现单处理机系统中进程调度,实现对多个进程的调度模拟,要求采用多级反馈队列调度算法进行模拟调度。(江西师范大学)

    编写C程序模拟实现单处理机系统中进程调度,实现对多个进程的调度模拟,要求采用多级反馈队列调度算法进行模拟调度。 数据结构设计:PCB:结构体;就绪队列:每个节点为进程PCB;进程状态 具体调度算法:FCFS、SJF、PR;涉及多种操作:排序、链表操作 程序输出设计:调

    2024年02月04日
    浏览(54)
  • 操作系统进程调度算法(c语言模拟实现)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(55)
  • 操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(55)
  • 实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR

    实验内容: 实现时间片轮转算法(模拟),要求如下: 1、用到的数据结构 /* PCB / struct PCB { pid_t pid;//进程 PID int state; //状态信息,1 表示正在运行,0 表示暂停,-1 表示结束 unsigned long runned_time;//已运行时间 unsigned long need_running_time;//剩余运行时间 }; / PCB集合 */ struct PCB pcb[TOT

    2024年02月04日
    浏览(55)
  • (学习笔记-调度算法)进程调度算法

    进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。 当 CPU 空闲时,操作系统就选择内存中标的某个 [就绪状态] 的进程,将其分配给 CPU。 什么时候会发生CPU调度呢?通常有以下情况: 当进程从运行状态转换到等待状态 当进程从运行状态转换到就绪状态 当进程从等待

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包