網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
C/C++實(shí)現(xiàn)操作系統(tǒng)進(jìn)程調(diào)度算法,F(xiàn)CFS, RR, SPN, SRT, HRRN
作者:crazybobo1207 更新時(shí)間: 2023-10-14 編程語(yǔ)言程序?qū)崿F(xiàn)了5種進(jìn)程調(diào)度算法,分別是:FCFS、RR(分別令時(shí)間片等于1、4)、SPN、SRT、HRRN。
其中,SPN、SRT、HRRN這三種調(diào)度算法,需要對(duì)進(jìn)程列表里的進(jìn)程進(jìn)行排序,排序之后,再選擇列表里的第一個(gè)進(jìn)程執(zhí)行。不同的調(diào)度算法,sort方法的排序規(guī)則不同,可以在重載<運(yùn)算符時(shí),指定這些排序規(guī)則。
本程序的優(yōu)點(diǎn)在于,一旦實(shí)現(xiàn)了其中一個(gè)調(diào)度算法,比如實(shí)現(xiàn)了最基本的FCFS之后,只要增加一個(gè)排序邏輯,即在重載<運(yùn)算符時(shí),增加新的排序規(guī)則(一個(gè)case分支),立馬可以實(shí)現(xiàn)一種新的調(diào)度算法。
進(jìn)程信息定義在方法InitProcedureInfo中,包括:procedureID(進(jìn)程ID), arriveTime(進(jìn)程到達(dá)時(shí)間), serviceTime(服務(wù)時(shí)間), eclapsedTime(已服務(wù)時(shí)間), remainTime(剩余服務(wù)時(shí)間), accumulateTime(累計(jì)服務(wù)時(shí)間)。
#include <list>
#include <iostream>
using namespace std;
#define PROCEDURENUM 5
#define MAXTIME 30
enum scheduleFun { FCFS, RR, SPN, SRT, HRRN };
int currentTime = 0;
int timeSlice = 4;
int scheduleFun;
class Procedure
{
public:
int procedureID;
int arriveTime;
int serviceTime;
int eclapsedTime;
int remainTime;
int accumulateTime;
public:
Procedure(int _procedureID = 0, int _arriveTime = 0, int _serviceTime = 0, int _eclapsedTime = 0, int _remainTime = 0, int _accumulateTime = 0)
{
procedureID = _procedureID;
arriveTime = _arriveTime;
serviceTime = _serviceTime;
eclapsedTime = _eclapsedTime;
remainTime = _remainTime;
accumulateTime = _accumulateTime;
}
bool operator<(const Procedure& p)
{
switch (scheduleFun)
{
case SPN: //SPN:最短進(jìn)程優(yōu)先(最短作業(yè)優(yōu)先,非搶占式)
return this->remainTime - 9999 * this->eclapsedTime < p.remainTime - 9999 * p.eclapsedTime;
case SRT: //SRT:最短剩余時(shí)間優(yōu)先(最短作業(yè)優(yōu)先,搶占式)
return this->remainTime < p.remainTime; //升序排序
break;
case HRRN: //HRRN:最高響應(yīng)比優(yōu)先,R = (w + s) / s = 1 + w / s,其中R表示響應(yīng)比,w表示已經(jīng)等待的時(shí)間,s表示期待服務(wù)的時(shí)間(降序排序)
return 1 + (currentTime - this->arriveTime) / this->serviceTime > 1 + (currentTime - p.arriveTime) / p.serviceTime;
break;
}
}
};
Procedure procedure[PROCEDURENUM];
list<Procedure> procedureList;
int scheduleResult[PROCEDURENUM][MAXTIME];
Procedure departProcedure;
bool departProcedureExsit = false;
void InitProcedureInfo(); //初始化進(jìn)程信息、進(jìn)程調(diào)度結(jié)果、當(dāng)前時(shí)間
void PutArriveProcedureIntoList(); //某個(gè)進(jìn)程到達(dá),將此進(jìn)程扔進(jìn)List
void FindProcedure(); //遍歷進(jìn)程List,判斷當(dāng)前執(zhí)行哪個(gè)進(jìn)程,直接取List中的第一個(gè)進(jìn)程(因?yàn)檫M(jìn)程List已按要求排序)
void PrintScheduleResult(); //輸出進(jìn)程調(diào)度結(jié)果
void ProcedureSchedule(); //進(jìn)程調(diào)度算法
int main()
{
scheduleFun = FCFS;
ProcedureSchedule();
scheduleFun = RR;
timeSlice = 1;
ProcedureSchedule();
scheduleFun = RR;
timeSlice = 4;
ProcedureSchedule();
scheduleFun = SPN;
ProcedureSchedule();
scheduleFun = SRT;
ProcedureSchedule();
scheduleFun = HRRN;
ProcedureSchedule();
return 0;
}
//初始化:進(jìn)程信息、進(jìn)程調(diào)度結(jié)果、當(dāng)前時(shí)間
void InitProcedureInfo()
{
//procedureID, arriveTime, serviceTime, eclapsedTime, remainTime, accumulateTime
Procedure p1(1, 0, 3, 0, 3, 0);
Procedure p2(2, 2, 6, 0, 6, 0);
Procedure p3(3, 4, 4, 0, 4, 0);
Procedure p4(4, 6, 5, 0, 5, 0);
Procedure p5(5, 8, 2, 0, 2, 0);
procedure[0] = p1;
procedure[1] = p2;
procedure[2] = p3;
procedure[3] = p4;
procedure[4] = p5;
for (int i = 0; i < PROCEDURENUM; i++)
{
for (int j = 0; j < MAXTIME; j++)
{
scheduleResult[i][j] = 0;
}
}
currentTime = 0;
}
//輸出進(jìn)程調(diào)度結(jié)果
void PrintScheduleResult()
{
for (int i = 0; i < PROCEDURENUM; i++)
{
for (int j = 0; j < MAXTIME; j++)
{
if (scheduleResult[i][j] == 1)
{
cout << "■";
}
else
{
cout << " ";
}
}
cout << endl;
}
}
//某個(gè)進(jìn)程到達(dá),將此進(jìn)程扔進(jìn)List
void PutArriveProcedureIntoList()
{
for (int i = 0; i < PROCEDURENUM; i++)
{
if (procedure[i].arriveTime == currentTime)
{
procedureList.push_back(procedure[i]);
}
}
if (departProcedureExsit == true)
{
procedureList.push_back(departProcedure);
departProcedureExsit = false;
}
}
//遍歷進(jìn)程List,判斷當(dāng)前執(zhí)行哪個(gè)進(jìn)程,直接取List中的第一個(gè)進(jìn)程(因?yàn)檫M(jìn)程List已按要求排序)
void FindProcedure()
{
Procedure p;
if (!procedureList.empty())
{
p = procedureList.front();
procedureList.pop_front();
if (scheduleFun == FCFS || scheduleFun == SPN || scheduleFun == SRT || scheduleFun == HRRN)
{
p.eclapsedTime++;
p.remainTime--;
scheduleResult[p.procedureID - 1][currentTime] = 1;
if (p.remainTime != 0) //如果當(dāng)前進(jìn)程未執(zhí)行完畢,將其放回List最前面
{
procedureList.push_front(p);
}
}
if (scheduleFun == RR)
{
if (p.remainTime > 0 && p.accumulateTime < timeSlice)
{
scheduleResult[p.procedureID - 1][currentTime] = 1;
p.eclapsedTime++;
p.remainTime--;
p.accumulateTime++;
if (p.remainTime > 0 && p.accumulateTime < timeSlice)
{
procedureList.push_front(p);
}
else if (p.remainTime > 0 && p.accumulateTime == timeSlice)
{
int flag = 0;
for (int i = 0; i < PROCEDURENUM; i++)
{
if (currentTime == procedure[i].arriveTime - 1)
{
flag = 1;
}
}
if (flag == 0)
{
p.accumulateTime = 0;
procedureList.push_back(p);
}
else
{
p.accumulateTime = 0;
departProcedure = p;
departProcedureExsit = true;
}
}
}
}
}
}
void ProcedureSchedule()
{
switch (scheduleFun)
{
case FCFS:
cout << "FCFS算法" << endl << endl;
break;
case RR:
cout << "RR算法 q=" << timeSlice << endl << endl;
break;
case SPN:
cout << "SPN算法" << endl << endl;
break;
case SRT:
cout << "SRT算法" << endl << endl;
break;
case HRRN:
cout << "HRRN算法" << endl << endl;
break;
}
InitProcedureInfo();
while (currentTime < MAXTIME)
{
PutArriveProcedureIntoList();
if (scheduleFun == SPN || scheduleFun == SRT || scheduleFun == HRRN)
{
if (!procedureList.empty())
{
procedureList.sort();
}
}
FindProcedure();
currentTime++;
}
PrintScheduleResult();
}
運(yùn)行結(jié)果如下,一次性顯示結(jié)果,下次做個(gè)能動(dòng)態(tài)顯示中間過(guò)程的。
原文鏈接:https://blog.csdn.net/crazybobo1207/article/details/133500418
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-04-25 一起來(lái)看看C語(yǔ)言世界中的結(jié)構(gòu)體_C 語(yǔ)言
- 2022-05-19 C++實(shí)現(xiàn)教師管理系統(tǒng)_C 語(yǔ)言
- 2022-04-19 盤(pán)點(diǎn)分析C語(yǔ)言中少見(jiàn)卻強(qiáng)大的字符串函數(shù)_C 語(yǔ)言
- 2022-06-28 C語(yǔ)言簡(jiǎn)明清晰講解結(jié)構(gòu)體_C 語(yǔ)言
- 2022-11-17 啟動(dòng)VMware時(shí)遇到“vmx86版本不匹配問(wèn)題”的完美處理方法_VMware
- 2022-06-18 android實(shí)現(xiàn)可拖動(dòng)的浮動(dòng)view_Android
- 2022-08-21 android實(shí)現(xiàn)貝塞爾曲線(xiàn)之波浪效果_Android
- 2023-07-14 promise封裝的ajax + rem布局
- 欄目分類(lèi)
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支