生活随笔
收集整理的這篇文章主要介紹了
操作系统--时间片轮转调度算法(RR算法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
操作系統–時間片輪轉調度算法(RR算法)
實驗內容:
模擬實現時間片輪轉調度算法,具體如下:
設置進程體:進程名,進程的到達時間,服務時間,,進程狀態(W——等待,R——運行,F——完成),進程間的鏈接指針
進程初始化:由用戶輸入進程名、服務時間進行初始化,同時,初始化進程的狀態為W。
顯示函數:在進程調度前、調度中和調度后進行顯示。
排序函數:對就緒狀態的進程按照進入就緒隊列的時間排序,新到達的進行應優先于剛剛執行過的進程進入就緒隊列的隊尾。注意考慮到達時間
調度函數:每次從就緒隊列隊首調度優一個進程執行,狀態變化。并在執行一個時間片后化,服務時間變化,狀態變化。當服務時間為0時,狀態變為F。
刪除函數:撤銷狀態為F的進行。
只寫了時間片為1的情況大致的思想有點像模擬一個隊列。
代碼:
#include <bits/stdc++.h>using namespace std
;
const int MAX
= 109;#define W "waitting"
#define R "running"
#define F "finish"class WORK
{
public:string work_name
; int serve_time
; int r_serve_time
; int arrive_time
; string work_state
; int end_time
; int turnover_time
; WORK
& operator=(const WORK
&wo
) {work_name
= wo
.work_name
;serve_time
= wo
.serve_time
;r_serve_time
= wo
.r_serve_time
;arrive_time
= wo
.arrive_time
;work_state
= wo
.work_state
;end_time
= wo
.end_time
;turnover_time
= wo
.turnover_time
;return *this;}
};WORK work
[MAX
];
int n
;
int q
; bool cmp_SJF(WORK x
, WORK y
)
{if(x
.serve_time
!= y
.serve_time
) return x
.serve_time
< y
.serve_time
;else return x
.arrive_time
< y
.arrive_time
;
}bool cmp_arr_time(WORK x
, WORK y
)
{return x
.arrive_time
< y
.arrive_time
;
}int count_work(int t
)
{int cnt
= 0;for(int i
= 1; i
<= n
; i
++){if(work
[i
].arrive_time
<= t
)cnt
++;}return cnt
;
}void insert_work(int num
)
{if(num
> 2){int t_num
= num
- 1;WORK t_work
[MAX
];t_work
[1] = work
[t_num
];t_work
[2] = work
[num
];for(int i
= 1; i
<= num
- 2; i
++){t_work
[i
+ 2] = work
[i
];}for(int i
= 1; i
<= num
; i
++)work
[i
] = t_work
[i
];}
}void cir_work(int num
)
{WORK t_work
;t_work
= work
[num
];for(int i
= num
- 1; i
>= 1; i
--)work
[i
+ 1] = work
[i
];work
[1] = t_work
;
}void update_work(int num
, int c_time
, bool is_new
)
{if(is_new
) insert_work(num
);else cir_work(num
);int t
= 0;bool is_ok
= false;int cnt
= 0;while(!is_ok
){if(work
[num
].serve_time
> 0) {work
[num
].serve_time
--;work
[num
].work_state
= R
;t
= num
;is_ok
= true;break;}if(work
[num
].serve_time
<= 0) {work
[num
].serve_time
= 0;work
[num
].work_state
= F
;cir_work(num
);cnt
++;}if(cnt
== n
)break;}for(int i
= 1; i
<= n
; i
++) {if(i
!= t
){if(work
[i
].work_state
!= F
)work
[i
].work_state
= W
;if(work
[i
].serve_time
<= 0)work
[i
].work_state
= F
;}if(work
[i
].work_state
== F
&& work
[i
].end_time
== -1)work
[i
].end_time
= c_time
;}
}bool judge_over()
{for(int i
= 1; i
<= n
; i
++)if(work
[i
].work_state
!= F
)return false;return true;
}int main()
{cout
<< "請輸入要調度的作業:" << endl
;cout
<< "要調度的作業的數量:" ;cin
>> n
;for(int i
= 1; i
<= n
; i
++){cout
<< "作業名: " << endl
;cin
>> work
[i
].work_name
;cout
<< "作業服務時間: " << endl
;cin
>> work
[i
].serve_time
;cout
<< "作業到達時間: " << endl
;cin
>> work
[i
].arrive_time
;work
[i
].work_state
= W
;work
[i
].end_time
= -1;work
[i
].r_serve_time
= work
[i
].serve_time
;}sort(work
+ 1, work
+ 1 + n
, cmp_arr_time
); cout
<< "作業初始狀態:" << endl
;cout
<< " 作業名 " << " 到達時間 " << " 服務時間 " << " 當前狀態 " << endl
;for(int i
= 1; i
<= n
; i
++){cout
<< setw(8) << work
[i
].work_name
<< setw(16) << work
[i
].arrive_time
<< setw(13)<< work
[i
].serve_time
<< setw(21) << work
[i
].work_state
<< endl
;}cout
<< endl
;int arrive_num
= 0; int current_time
= 0; cout
<< "作業調度情況如下:" << endl
;bool is_over
= false;int current_work_num
= 0;while(!is_over
){cout
<< " 時刻 " << " 作業名 " << " 到達時間 " << " 剩余服務時間 " << " 當前狀態 " << endl
;arrive_num
= count_work(current_time
);update_work(arrive_num
, current_time
, current_work_num
< arrive_num
);current_work_num
= arrive_num
;int cou
= 0;for(int i
= 1; i
<= arrive_num
; i
++){if(work
[i
].work_state
!= F
){cou
++;cout
<< setw(6) << current_time
<< setw(13) << work
[i
].work_name
<< setw(15) << work
[i
].arrive_time
<< setw(15)<< work
[i
].serve_time
<< setw(24) << work
[i
].work_state
<< endl
;}}if(cou
== 0)cout
<< setw(6) << current_time
<< setw(30) << "所有作業均執行完畢!" << endl
<< endl
;current_time
++;is_over
= judge_over();if(current_time
== 14)break;cout
<< endl
;}cout
<< "各作業的周轉時間和帶權周轉時間如下:" << endl
;cout
<< " 作業名 " << " 周轉時間 " << " 帶權周轉時間 " << endl
;for(int i
= 1; i
<= n
; i
++){work
[i
].turnover_time
= work
[i
].end_time
- work
[i
].arrive_time
; double wight_time
= 1.0 * work
[i
].turnover_time
/ work
[i
].r_serve_time
; cout
<< setw(6) << work
[i
].work_name
<< setw(15) << work
[i
].turnover_time
<< setw(18);cout
.precision(4);cout
<< wight_time
<< endl
;}return 0;
}
運行結果:
根據提示輸入數據如圖:
顯示各個作業的初始狀態:
各個時刻作業的調度情況如下:
各個作業的周轉時間和帶權周轉時間如下:
根據輸入樣例手動畫出時間片輪轉算法的調度時間圖如下:
與運行結果相比,發現運行正確(我只測試了這一個樣例,是我們慕課作業上面的),如有問題,歡迎指正~~
總結
以上是生活随笔為你收集整理的操作系统--时间片轮转调度算法(RR算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。