生活随笔
收集整理的這篇文章主要介紹了
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
;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
);
}
總結(jié)
以上是生活随笔為你收集整理的FCFS、SJF、RR、SRT进程调度算法的代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。