算法描述:
短作業(yè)(進程)優(yōu)先調(diào)度算法(SJF)蒜埋,是指對短作業(yè)或短進程優(yōu)先調(diào)度的算法。它們可以分 別用于作業(yè)調(diào)度和進程調(diào)度膛壹。短作業(yè)優(yōu)先(SJF)的調(diào)度算法是從后備隊列中選擇一個或若干個 估計運行時間最短的作業(yè)轩拨,將它們調(diào)入內(nèi)存運行。而短進程優(yōu)先(SPF)調(diào)度算法則是從就緒隊 列中選出一個估計運行時間最短的進程耕驰,將處理機分配給它,使它立即執(zhí)行并一直執(zhí)行到完 成录豺,或發(fā)生某事件而被阻塞放棄處理機時再重新調(diào)度
代碼:
#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<<"已結(jié)束 ";
cout<<"周轉(zhuǎn)時間:"<<finishTime-currentProcess.arrivalTime;
cout<<"帶權(quán)周轉(zhuǎn)時間:"<<(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++;
//最后所有進程結(jié)束,退出
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)<<"服務(wù)時間"<<setw(15)<<"周轉(zhuǎn)時間"<<setw(15)<<"帶權(quán)周轉(zhuǎn)時間\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的類存儲厚骗,接近操作系統(tǒng)工作原理
2.程序?qū)懙谋容^順,但是對基本的語法有些不熟兢哭,比如stl中的priority_queue领舰,list。優(yōu)先隊列是從大到小排列迟螺,要從小到大排列故重載<運算符冲秽,用erase函數(shù),故重載==運算符
3.#include<iomanip> setw \n不一樣