生活随笔
收集整理的這篇文章主要介紹了
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
;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
);int t
=p
[0].arriving_time
;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
;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
++){if(!isOver
[j
] && p
[j
].arriving_time
<=t
&& min
>p
[j
].service_time
){x
=j
;min
=p
[j
].service_time
;} }if( min
!=INF
){p
[x
].start_end
.push_back( make_pair( t
,t
+p
[x
].service_time
));t
+=p
[x
].service_time
;isOver
[x
]=true;}else {t
=INF
;for( int j
=0;j
<n
;j
++){if( !isOver
[j
]){t
=( t
<p
[j
].arriving_time
)? t
:p
[j
].arriving_time
;}}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
;int cnt
=0;while ( cnt
<n
){int minr
=INF
;int x
;for( int i
=0;i
<n
;i
++){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
){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
;for( int i
=x
+1;i
<n
;i
++){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
;for( int i
=0;i
<n
;i
++)q
.push(p
[i
]);int t
=p
[0].arriving_time
;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
);if(q
.front().remaining_time
<=time
&&q
.front().arriving_time
<=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
){ 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进程调度算法的代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。