进程调度算法FCFS和RR
一、 實驗題目
本次試驗要求編寫的是進程調度中的FCFS算法和RR算法(輪轉法)。
FCFS算法:最簡單的CPU調度算法,采取先到先服務的規則,不存在進程優先級之說,也不管進程服務時間的長短,只有前面的進程完成或者阻塞后面的進程才會開始處理。這種算法不利于短進程,因為短進程要等待很久,而CPU繁忙進程則比較適合這種調度算法。
RR算法:這是一種輪詢算法,每次將時間片給隊首的進程去使用,如果該進程在時間片內結束的話,就切換到下一進程;如果時間片用完該進程仍未結束,把處理器給下一進程,該進程排到就緒隊列隊尾等待下一次被分配處理器;
當時間片被分配的特別長的話,RR會變為的FCFS算法,當時間片非常短的話,就會成為一種均等分配的算法,適用于IO繁忙型調度。
我們可以看一下示意圖
題目是:
下面是我畫的各個時間段的各種算法的執行情況,今天我們主要講述FCFS和RR兩種,其余兩種類比也可以實現
二、 數據結構及符號說明
因為這兩種算法中都有一個優先的順序,FCFS中優先級是到達的時刻,RR中優先級也是到達的時間,因此我在算法中用的是優先隊列priority_queue<proc,vector,cmp> q;
隊列中元素是一個結構體,容器為vector,優先定義方式為自己定義的cmp(見下)
?
struct cmp
{
bool operator()(proc a,proc b)
{
return a.arrive_time>b.arrive_time; //到達時間小的,優先級高
}
};
每次添加結點的時候都會自動排序將到達時間最小的進程調到隊首
三、 源代碼
FCFS:
RR:
#include <iostream> #include <iomanip> #include <queue> using namespace std; int n; int time_slice; //時間片 int current_time; //當前時間 struct proc{int arr_time; //第一次入隊的時間 int arrive_time; //每一次的到達時間 int time; //剩余需要的時間 int start_time; //開始的時間 int end_time; //結束的時間 int haoshi; //總共需要的時間 char a; //進程ID }; //重新定義隊列的優先級 struct cmp{bool operator()(proc a,proc b){return a.arrive_time>=b.arrive_time;} }; int main() {priority_queue<proc,vector<proc>,cmp> q;cin>>n>>time_slice; //輸入時間片 current_time=0; //初始化當前時間片 proc p;for(int i=0;i<n;i++){cin>>p.a>>p.arrive_time>>p.time;p.start_time=-1;p.end_time=-2;p.arr_time=p.arrive_time;p.haoshi=p.time;q.push(p);}cout<<"Process_ID Arrive_Time Start_Time Length End_Time Revolve_Time Right_Time"<<endl; while(!q.empty()) //只要隊列不為空,就說明還有進程未處理完畢{p=q.top(); //獲取隊首元素q.pop(); //將隊首元素出隊列//若是當前時間比隊首進程的到達時間還小,那么我們就讓當前時間自增while(current_time<p.arrive_time) {current_time++;}//如果start_time為-1,說明這個變量沒被賦值,我們就給他賦值,標志該進程開始處理了if(p.start_time==-1) p.start_time=current_time;if(time_slice>=p.time) //如果當前時間片大于進程p所需要的時間p.time,那么我們可以在本次時間片之內結束該進程 {current_time+=p.time; //當前時間往后加 p.end_time=current_time; //結束時間改變 cout<<setw(5)<<setfill(' ')<<p.a; //輸出相關信息 cout<<setw(11)<<p.arr_time;cout<<setw(11)<<p.start_time;cout<<setw(11)<<p.haoshi;cout<<setw(11)<<p.end_time;cout<<setw(11)<<p.end_time-p.arr_time;cout<<setw(15)<<setiosflags(ios::fixed)<<setprecision(2)<<(double)(p.end_time-p.arr_time)/p.haoshi<<endl;}else if(time_slice<p.time) //如果p進程所需時間大于時間片,那么我們本次尚不能完全結束p進程,而把他重新放到就緒隊列中 {current_time+=time_slice; //當前時間加上時間片的值 p.arrive_time=current_time; //p的到達時間(即此次到達就緒隊列的時間)改為當前時間 p.time-=time_slice; //p進程所需時間減去當前時間片的大小變為新的所需時間 q.push(p); //重新把修改過相關參數的p進程壓入隊列中 }}return 0; }四、 運行結果
輸入次序依次為進程ID,到達時間和耗費時間
FCFS
RR
五、 實驗思考
本次我們用模擬調度的辦法展現了CPU進程調度的過程,計算了相對周轉時間和帶權周轉時間,但是這并不能代表真正的CPU調度,因為在實際過程中,這個時間是非常快速的,而且我們要考慮阻塞的情況,應該有一個阻塞隊列;并且還應該有接收外部信號(比如IO或者時間)喚醒進程的過程。實際的進程調度中還包含搶占式的調度,即后來的進程會根據優先級強弱決定是否直接打斷當前進程。進程調度算法使我進一步對進程調度有了深刻的思考。
思考題:FCFS算法是非搶占式的算法,易于實現,有利于CPU繁忙型作業不利于I/O繁忙型作業;RR算法如果是非搶占式的話,其優劣程度取決于時間片的大小,如果時間片過大,那么所有進程基本能在一個時間片內完成則退化成了FCFS算法,如果時間片過小,需要頻繁的進行上下文切換,會產生額外的開銷。RR算法比較適合分時系統。其他的:短進程優先算法總是讓時間耗費短的進程優先處理,這樣子周轉時間少,但是可能會導致饑餓;優先級調度也會導致饑餓的情況發生。動態優先級調度算法的優先級會根據等待時間的延長而增加,這樣子兼顧了進程的優先級又不會出現饑餓的情況。
-----------------------------------今天也要加油鴨--------------------------------------
總結
以上是生活随笔為你收集整理的进程调度算法FCFS和RR的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【51单片机】(三)数码管(原理,静态、
- 下一篇: SystemUI Monkey测试原生代