日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FCFS、SJF、RR、SRT进程调度算法的代码实现

發(fā)布時(shí)間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FCFS、SJF、RR、SRT进程调度算法的代码实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在做操作系統(tǒng)的上機(jī)實(shí)驗(yàn),順便給大家分享一下自己實(shí)驗(yàn)的過程和成果。
以下是實(shí)驗(yàn)步驟∶
1、用一個(gè)結(jié)構(gòu)體來存儲(chǔ)進(jìn)程的信息,結(jié)構(gòu)體中包含以下變量。
int id;
int arriving_time;//到達(dá)時(shí)間
int leaving_time;//結(jié)束時(shí)間
int service_time;//服務(wù)時(shí)間
int remaining_time;//剩余時(shí)間
int cycling_time;//周轉(zhuǎn)時(shí)間
vector<pair<int,int>> start_end;//進(jìn)程運(yùn)行的時(shí)間段,可能有多段
2、模擬FCFS算法
FCFS算法模擬比較簡(jiǎn)單,只要按照到達(dá)時(shí)間從前到后對(duì)所有進(jìn)程排個(gè)序,排完后的順序就是進(jìn)程被執(zhí)行的順序
3、模擬SJF算法
模擬的核心操作:如果cpu空閑或者剛執(zhí)行完一個(gè)進(jìn)程,那么就從已到達(dá)的進(jìn)程中,找到一個(gè)服務(wù)時(shí)間最短的進(jìn)程,并執(zhí)行它。
重復(fù)上述操作,直至所有的進(jìn)程執(zhí)行完畢。
4、模擬RR算法
①設(shè)立一個(gè)時(shí)間片,時(shí)間片的大小由用戶輸入。
②將第一個(gè)進(jìn)程的到達(dá)時(shí)間作為第一個(gè)時(shí)間片的起始時(shí)間。
③每當(dāng)時(shí)間片耗盡,如果有進(jìn)程正在執(zhí)行,則終止當(dāng)前進(jìn)程,并將該進(jìn)程壓入就緒隊(duì)列末端,然后從就緒隊(duì)列中尋找可執(zhí)行的進(jìn)程開始執(zhí)行。
④每當(dāng)進(jìn)程執(zhí)行完畢,將該進(jìn)程從就緒隊(duì)列中移除,然后從就緒隊(duì)列中尋找可執(zhí)行的進(jìn)程開始執(zhí)行。
⑤如果所有的進(jìn)程都已完成執(zhí)行,即就緒隊(duì)列為空,則結(jié)束循環(huán),RR算法運(yùn)行結(jié)束。
5、模擬SRT算法
①設(shè)立一個(gè)cnt變量記錄已執(zhí)行完畢進(jìn)程的數(shù)量,初始值為0。
②SRT算法的核心操作:從所有已到達(dá)且未運(yùn)行完畢的進(jìn)程中選擇一個(gè)剩余時(shí)間最短的進(jìn)程,然后運(yùn)行這個(gè)進(jìn)程。
③每當(dāng)有進(jìn)程到達(dá)時(shí),進(jìn)行②中的操作。
④每當(dāng)有進(jìn)程執(zhí)行完畢時(shí),cnt++,并且執(zhí)行②中的操作。
⑤直到所有進(jìn)程執(zhí)行完畢,即cnt等于進(jìn)程總數(shù)量時(shí),退出循環(huán),SRT算法運(yùn)行結(jié)束。
運(yùn)行結(jié)果截圖:
代碼如下:

#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <queue> using namespace std; int n; const int INF=0x3f3f3f3f; struct Progress {int id;int arriving_time;//到達(dá)時(shí)間int leaving_time;//結(jié)束時(shí)間int service_time;//服務(wù)時(shí)間int remaining_time;//剩余時(shí)間int cycling_time;//周轉(zhuǎn)時(shí)間vector<pair<int,int>> start_end;//進(jìn)程占用cpu運(yùn)行的時(shí)間段,可能有多段void showInfo( ){printf( "progress:%d, arriving time:%d, leaving time:%d, service time:%d, cycling time:%d, start&ends:[ ",id,arriving_time,leaving_time,service_time,cycling_time);for( int i=0;i<start_end.size( );i++){if(i!=0) {printf(",");}printf( "(%d,%d)",start_end[i].first, start_end[i].second);}printf( " ]\n");}void showInfos( Progress p[]){for( int i=0;i<n;i++){p[i].showInfo();}} };Progress p[1010]; Progress p_fcfs[1010]; Progress p_sjf[1010]; Progress p_srt[1010]; Progress p_rr[1010];bool cmp1( Progress p1,Progress p2) {return p1.arriving_time<p2.arriving_time; } bool cmp2( Progress p1,Progress p2) {return p1.service_time<p2.service_time; } bool cmp3( Progress p1,Progress p2) {return p1.start_end[0].first<p2.start_end[0].first; } bool cmp4( Progress p1,Progress p2) {return p1.id<p2.id; } void caculate(Progress p[]) {for(int i=0;i<n;i++){p[i].leaving_time=p[i].start_end[p[i].start_end.size()-1].second;p[i].cycling_time=p[i].leaving_time-p[i].arriving_time;} } void FCFS( Progress p[]) {sort( p,p+n,cmp1);//fcfs簡(jiǎn)單依照到達(dá)時(shí)間從小到大對(duì)進(jìn)程進(jìn)行排序即可int t=p[0].arriving_time;//t為當(dāng)前的時(shí)間,初始化為進(jìn)程的最早到達(dá)時(shí)間for( int i=0;i<n;i++){p[i].start_end.push_back( make_pair( t,t+p[i].service_time) );t+=p[i].service_time;p[i].cycling_time=t-p[i].arriving_time;}sort(p,p+n,cmp4);caculate(p); }void SJF( Progress p[]) {sort( p,p+n,cmp1);//先按到達(dá)時(shí)間排個(gè)序int t=p[0].arriving_time;//t為當(dāng)前的時(shí)間,初始化為進(jìn)程的最早到達(dá)時(shí)間bool isOver[1010];//記錄進(jìn)程是否已運(yùn)行結(jié)束for( int i=0;i<n;i++)isOver[i]=false;for( int i=0;i<n;i++){int x;int min=INF;bool flag=false;for( int j=0;j<n;j++)//該循環(huán)找出到達(dá)時(shí)間小于t并且服務(wù)時(shí)間最短的那個(gè)進(jìn)程,用x記錄其下標(biāo)。{if(!isOver[j] && p[j].arriving_time<=t && min>p[j].service_time){x=j;min=p[j].service_time;} }if( min!=INF)//min不再是初始值INF,這證明我們找到了符合條件的進(jìn)程,根據(jù)SJF的原則,該進(jìn)程就是在t時(shí)刻開始運(yùn)行的進(jìn)程。{p[x].start_end.push_back( make_pair( t,t+p[x].service_time));t+=p[x].service_time;isOver[x]=true;}else //我們沒有找到符合條件的進(jìn)程,說明t太小了,沒有合適進(jìn)程的到達(dá)時(shí)間早于t{t=INF;//將t賦值為正無窮(實(shí)際上是一個(gè)大于1e9的int類型整數(shù))for( int j=0;j<n;j++){if( !isOver[j]){t=( t<p[j].arriving_time)? t:p[j].arriving_time;//找到剩余進(jìn)程的最早到達(dá)時(shí)間,并將值賦給t}}i--;}}sort(p,p+n,cmp4);caculate(p); }void SRT( Progress p[]) {sort( p,p+n,cmp1);for( int i=0;i<n;i++)p[i].remaining_time=p[i].service_time;int t=p[0].arriving_time;//t為當(dāng)前的時(shí)間,初始化為進(jìn)程的最早到達(dá)時(shí)間int cnt=0;//cnt為已運(yùn)行結(jié)束進(jìn)程的數(shù)量while ( cnt<n){int minr=INF;int x;for( int i=0;i<n;i++)//該循環(huán)找到到達(dá)時(shí)間小于等于t且剩余時(shí)間最短的進(jìn)程,將其下標(biāo)賦給為x{if( p[i].arriving_time<=t && p[i].remaining_time>0 && p[i].remaining_time<minr){ minr=p[i].remaining_time;x=i;}}if( minr==INF){//沒有找到符合條件的進(jìn)程,處理方法跟SJF里面類似(SJF函數(shù)里面不小心將一個(gè)變量命名為min,所以不能直接使用min函數(shù) w(゚Д゚)w)t=INF;for( int i=0;i<n;i++){if( p[i].remaining_time>0){t=min( t,p[i].arriving_time);}}}else//找到了符合條件的進(jìn)程{int nextArriving=INF;//nextArriving為在t之后第一個(gè)新到達(dá)的進(jìn)程的到達(dá)時(shí)間,初始化為正無窮for( int i=x+1;i<n;i++)//該循環(huán)作用是找到這個(gè)到達(dá)時(shí)間,并賦給nextArriving{if(p[i].remaining_time==p[i].service_time&&p[i].arriving_time>t){nextArriving=p[i].arriving_time;break;}}if( nextArriving-t>=p[x].remaining_time){//如果下一個(gè)進(jìn)程的到達(dá)時(shí)間減去當(dāng)前的時(shí)間>=現(xiàn)在這個(gè)進(jìn)程的剩余時(shí)間,那么現(xiàn)在這個(gè)進(jìn)程可以直接運(yùn)行至結(jié)束。if( p[x].start_end.size()==0 || p[x].start_end[ p[x].start_end.size()-1].second!=t){p[x].start_end.push_back(make_pair(t,t+p[x].remaining_time));}else {p[x].start_end[ p[x].start_end.size()-1].second=t+p[x].remaining_time;}t+=p[x].remaining_time;p[x].remaining_time=0;cnt++;}else//否則,現(xiàn)在這個(gè)進(jìn)程只能運(yùn)行到下一個(gè)進(jìn)程到達(dá),然后進(jìn)入下一次循環(huán),根據(jù)所有已到達(dá)進(jìn)程的剩余時(shí)長(zhǎng),重新判斷要執(zhí)行哪一個(gè)進(jìn)程。{if( p[x].start_end.size()==0 || p[x].start_end[ p[x].start_end.size()-1].second!=t){p[x].start_end.push_back(make_pair(t,nextArriving));}else{p[x].start_end[ p[x].start_end.size()-1].second=nextArriving;} p[x].remaining_time-=nextArriving-t;t=nextArriving;}}}sort(p,p+n,cmp4);caculate(p); }void RR(Progress p[],int timeslice) {sort( p,p+n,cmp1);for( int i=0;i<n;i++)p[i].remaining_time=p[i].service_time;queue <Progress> q;//q為就緒隊(duì)列for( int i=0;i<n;i++)q.push(p[i]);int t=p[0].arriving_time;//t為當(dāng)前的時(shí)間,初始化為進(jìn)程的最早到達(dá)時(shí)間int t0=t;int cnt=0;while (!q.empty())//隊(duì)列為空,即所有進(jìn)程運(yùn)行完畢{queue <Progress> tem=q;bool flag=true;while(!tem.empty()){if(tem.front().arriving_time<=t){flag=false;break;}tem.pop();}if(flag) t=((t-t0)/timeslice+1)*timeslice+t0;int time=((t-t0)/timeslice+1)*timeslice-(t-t0);//time為當(dāng)前時(shí)間片剩余時(shí)間if(q.front().remaining_time<=time&&q.front().arriving_time<=t)//如果剩余時(shí)間大于該進(jìn)程剩余時(shí)間,則該進(jìn)程運(yùn)行結(jié)束,{ //更新t值,并將該進(jìn)程從隊(duì)列中移出if( q.front().start_end.size()==0 || q.front().start_end[ q.front().start_end.size()-1].second!=t){q.front().start_end.push_back( make_pair(t,t+q.front().remaining_time));} else{q.front().start_end[ q.front().start_end.size()-1].second=t+q.front().remaining_time;} t+=q.front().remaining_time;q.front().remaining_time=0;p[cnt++]=q.front();q.pop();}else if(q.front().arriving_time<=t)//如果剩余時(shí)間大于該進(jìn)程剩余時(shí)間,則該進(jìn)程運(yùn)行結(jié)束,{ //更新t值,更新進(jìn)程剩余運(yùn)行時(shí)間,然后進(jìn)行下一次循環(huán)if( q.front().start_end.size()==0 || q.front().start_end[ q.front().start_end.size()-1].second!=t){q.front().start_end.push_back( make_pair(t,t+time));}else{q.front().start_end[ q.front().start_end.size()-1].second=t+time;} q.front().remaining_time-=time;q.push(q.front());q.pop();t+=time;}else{q.push(q.front());q.pop();}}sort(p,p+n,cmp4);caculate(p); }int main( ) {cout<<"please input count of progresses:"<<endl;cin>>n;for( int i=0;i<n;i++){p[i].id=i;cout<<"progress"<<i<<",please input arriving time and service time: "<<endl;cin>>p[i].arriving_time>>p[i].service_time;}for( int i=0;i<n;i++)p_rr[i]=p_sjf[i]=p_srt[i]=p_fcfs[i]=p[i];FCFS( p_fcfs);cout<<"FCFS:"<<endl;p_fcfs[0].showInfos( p_fcfs);SJF( p_sjf);cout<<"SJF:"<<endl;p_sjf[0].showInfos( p_sjf);SRT(p_srt);cout<<"SRT:"<<endl;p_srt[0].showInfos(p_srt);cout<<"please input timeslice:"<<endl;int timeslice;cin>>timeslice;RR(p_rr,timeslice);cout<<"RR:"<<endl;p_rr[0].showInfos(p_rr); }

總結(jié)

以上是生活随笔為你收集整理的FCFS、SJF、RR、SRT进程调度算法的代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。