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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

#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;//到達時間int leaving_time;//結束時間int service_time;//服務時間int remaining_time;//剩余時間int cycling_time;//周轉時間vector<pair<int,int>> start_end;//進程占用cpu運行的時間段,可能有多段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簡單依照到達時間從小到大對進程進行排序即可int t=p[0].arriving_time;//t為當前的時間,初始化為進程的最早到達時間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);//先按到達時間排個序int t=p[0].arriving_time;//t為當前的時間,初始化為進程的最早到達時間bool isOver[1010];//記錄進程是否已運行結束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++)//該循環找出到達時間小于t并且服務時間最短的那個進程,用x記錄其下標。{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,這證明我們找到了符合條件的進程,根據SJF的原則,該進程就是在t時刻開始運行的進程。{p[x].start_end.push_back( make_pair( t,t+p[x].service_time));t+=p[x].service_time;isOver[x]=true;}else //我們沒有找到符合條件的進程,說明t太小了,沒有合適進程的到達時間早于t{t=INF;//將t賦值為正無窮(實際上是一個大于1e9的int類型整數)for( int j=0;j<n;j++){if( !isOver[j]){t=( t<p[j].arriving_time)? t:p[j].arriving_time;//找到剩余進程的最早到達時間,并將值賦給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為當前的時間,初始化為進程的最早到達時間int cnt=0;//cnt為已運行結束進程的數量while ( cnt<n){int minr=INF;int x;for( int i=0;i<n;i++)//該循環找到到達時間小于等于t且剩余時間最短的進程,將其下標賦給為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){//沒有找到符合條件的進程,處理方法跟SJF里面類似(SJF函數里面不小心將一個變量命名為min,所以不能直接使用min函數 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//找到了符合條件的進程{int nextArriving=INF;//nextArriving為在t之后第一個新到達的進程的到達時間,初始化為正無窮for( int i=x+1;i<n;i++)//該循環作用是找到這個到達時間,并賦給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){//如果下一個進程的到達時間減去當前的時間>=現在這個進程的剩余時間,那么現在這個進程可以直接運行至結束。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//否則,現在這個進程只能運行到下一個進程到達,然后進入下一次循環,根據所有已到達進程的剩余時長,重新判斷要執行哪一個進程。{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為就緒隊列for( int i=0;i<n;i++)q.push(p[i]);int t=p[0].arriving_time;//t為當前的時間,初始化為進程的最早到達時間int t0=t;int cnt=0;while (!q.empty())//隊列為空,即所有進程運行完畢{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為當前時間片剩余時間if(q.front().remaining_time<=time&&q.front().arriving_time<=t)//如果剩余時間大于該進程剩余時間,則該進程運行結束,{ //更新t值,并將該進程從隊列中移出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)//如果剩余時間大于該進程剩余時間,則該進程運行結束,{ //更新t值,更新進程剩余運行時間,然后進行下一次循環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); }

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。