程式排程之最短作業優先
程式排程之最短作業優先
最短作業優先
SJF(Shortest-Job-First):
- 分為搶佔式和非搶佔式:
- 非搶佔式的SJF 更確切的叫 最短下次CPU執行演算法(shortest-next-CPU-burst)
- 搶佔式的SJF 叫 最短剩餘時間優先演算法(shortest-remaining-time-first)
- 優點:
它的平均等待時間最小,是最優的排程演算法。 - 缺點:
獲取下次CPU執行長度比較困難(一般估計)。 - 用途:
經常用於長期排程。
程式碼
根據個人思路模擬的FCFS,僅供參考
非搶佔式
#include <iostream>
#include <queue>
using namespace std;
typedef double TimeType;
const int MAXN = 1e6+5;
int task_num;
TimeType now_time; //從第一個到達的作業時間開始
TimeType avg_spend_time; //平均週轉時間
TimeType avg_weight_time; //平均帶權週轉時間
struct StruTask
{
int id; //序號
TimeType arrive_time; //到達時間(輸入)
TimeType service_time; //服務時間(輸入)
TimeType start_time; //開始時間(設定)
TimeType end_time; //結束時間(設定)
TimeType spend_time; //週轉時間:end_time - arrive_time
TimeType weight_time; //帶權週轉時間spend_time/service_time
bool finished;
} arrayTask[MAXN];
TimeType get_task()
{
cout<<"請輸入任務數:"<<endl;
cin>>task_num;
if(task_num <= 0) return -1;
cout<<"----------請輸入任務相關資訊-------"<<endl;
TimeType minx = 1e15;
for(int i = 1; i <= task_num; ++i)
{
cout<<"請輸入第"<<i<<"個任務的 到達時間 和 服務時間:";
arrayTask[i].id = i;
cin>>arrayTask[i].arrive_time;
minx = min(minx,arrayTask[i].arrive_time);
cin>>arrayTask[i].service_time;
}
return minx;
}
int get_next_task()
{
int minx = 1<<30;
int aim = 0;
for(int i = 1; i <= task_num; ++i)
{
if(arrayTask[i].arrive_time<=now_time && !arrayTask[i].finished)
{
if(arrayTask[i].service_time < minx)
{
minx = arrayTask[i].service_time;
aim = i;
}
}
}
return aim;
}
void run_task(StruTask &task)
{
now_time = max(now_time,task.arrive_time);
task.start_time = now_time;
task.end_time = now_time + task.service_time;
now_time = task.end_time;
task.spend_time = task.end_time - task.arrive_time;
avg_spend_time += task.spend_time;
task.weight_time = task.spend_time / task.service_time;
avg_weight_time += task.weight_time;
task.finished = true;
}
void print_result(StruTask &task)
{
cout<<" id: "<<task.id
<<" arrive_time: "<<task.arrive_time<<" service: "<<task.service_time;
cout<<" start: "<<task.start_time<<" end: "<<task.end_time;
cout<<" spend: "<<task.spend_time<<" weight: "<<task.weight_time<<endl;
}
/*SJF 非搶佔式
Short Job First
*/
void SJF()
{
avg_spend_time = 0;
avg_weight_time = 0;
for(int i = 1; i <= task_num; ++i)
{
int id = get_next_task();
run_task(arrayTask[id]);
print_result(arrayTask[id]);
}
}
int main()
{
now_time = get_task();
if(now_time == -1)
return 0;
SJF();
double wait = 0;
for(int i = 1; i <= task_num; ++i)
{
wait += arrayTask[i].start_time - arrayTask[i].arrive_time;
}
avg_spend_time /= task_num;
avg_weight_time /= task_num;
cout<<" avg_spend: "<<avg_spend_time<<" avg_weight: "<<avg_weight_time<<endl;
cout<<" avg_wait: "<<(wait/task_num)<<endl;
return 0;
}
執行示例
4
0 6
0 8
0 7
0 3
4
0 8
1 4
3 5
2 9
搶佔式
#include <iostream>
#include <queue>
using namespace std;
typedef double TimeType;
const int MAXN = 1e3+5;
int task_num;
TimeType now_time; //從第一個到達的作業時間開始
TimeType avg_spend_time; //平均週轉時間
TimeType avg_weight_time; //平均帶權週轉時間
TimeType avg_wait;
TimeType last_run[MAXN];
struct StruTask
{
int id; //序號
TimeType arrive_time; //到達時間(輸入)
TimeType service_time; //服務時間(輸入)
TimeType start_time; //開始時間(設定)
TimeType end_time; //結束時間(設定)
TimeType spend_time; //週轉時間:end_time - arrive_time
TimeType weight_time; //帶權週轉時間spend_time/service_time
TimeType remain_service_time; //剩餘服務時間
} arrayTask[MAXN];
TimeType get_task()
{
cout<<"請輸入任務數:"<<endl;
cin>>task_num;
if(task_num <= 0) return -1;
cout<<"----------請輸入任務相關資訊-------"<<endl;
TimeType minx = 1e15;
for(int i = 1; i <= task_num; ++i)
{
cout<<"請輸入第"<<i<<"個任務的 到達時間 和 服務時間:";
arrayTask[i].id = i;
cin>>arrayTask[i].arrive_time;
minx = min(minx,arrayTask[i].arrive_time);
cin>>arrayTask[i].service_time;
arrayTask[i].remain_service_time = arrayTask[i].service_time;
}
return minx;
}
int get_next_task()
{
TimeType minx = 1e15;
int aim = -1;
for(int i = 1; i <= task_num; ++i)
{
if(arrayTask[i].arrive_time<=now_time && arrayTask[i].remain_service_time)
{
if(arrayTask[i].remain_service_time < minx)
{
minx = arrayTask[i].remain_service_time;
aim = i;
}
}
}
return aim;
}
void run_task(StruTask &task)
{
now_time = max(now_time,task.arrive_time);
avg_wait += now_time - (last_run[task.id]==-1?task.arrive_time:last_run[task.id]);
task.start_time = now_time;
task.end_time = now_time + 1; // 執行一秒後詢問,便於實現
task.remain_service_time -= 1;
now_time = task.end_time;
last_run[task.id] = now_time;
if(!task.remain_service_time)
{
task.spend_time = task.end_time - task.arrive_time;
avg_spend_time += task.spend_time;
task.weight_time = task.spend_time / task.service_time;
avg_weight_time += task.weight_time;
}
}
void print_result(StruTask &task)
{
cout<<" id: "<<task.id
<<" arrive_time: "<<task.arrive_time<<" service: "<<task.service_time;
cout<<" start: "<<task.start_time<<" end: "<<task.end_time;
cout<<" spend: "<<task.spend_time<<" weight: "<<task.weight_time<<endl;
}
/*SJF 搶佔式:又叫最短剩餘時間優先
Shortest remaining time first
*/
void SRTF()
{
avg_spend_time = 0;
avg_weight_time = 0;
avg_wait = 0;
for(int i = 0; i < MAXN; ++i)
{
last_run[i] = -1;
}
int id;
while(1)
{
id = get_next_task();
if(id == -1) break;
run_task(arrayTask[id]);
print_result(arrayTask[id]);
}
}
int main()
{
now_time = get_task();
if(now_time == -1)
return 0;
SRTF();
avg_spend_time /= task_num;
avg_weight_time /= task_num;
avg_wait /= task_num;
cout<<" avg_spend: "<<avg_spend_time<<" avg_weight: "<<avg_weight_time<<endl;
cout<<" avg_wait: "<<avg_wait<<endl;
return 0;
}
執行示例
4
0 8
2 9
3 5
1 4
相關文章
- OSPF開放式最短路徑優先協議協議
- linux中設定程式排程的優先順序別Linux
- 用java語言,模擬實現作業系統的程式排程演算法,先來先服務,高優先順序、高響應比、時間片輪轉和短作業Java作業系統演算法
- oracle排程程式作業dbms_schedulerOracle
- Linux排程器:程序優先順序Linux
- 作業系統精髓設計原理 程式排程作業系統
- Flink排程之排程器、排程策略、排程模式模式
- 作業系統實驗——讀者寫者模型(寫優先)作業系統模型
- Android程式優先順序Android
- 嵌入式作業6.3 CAN 匯流排程式設計程式設計
- kubernetes排程之資源配額
- 2.2.5排程演算法:時間片輪轉、優先順序排程、多級反饋排程演算法
- TKE 使用者故事 | 作業幫 Kubernetes 原生排程器優化實踐優化
- ORA-27492 無法執行作業,排程程式不可用
- Goroutine被動排程之一(18)Go
- kubernetes排程之資源配額示例
- 深度優先與廣度優先
- 十、深度優先 && 廣度優先
- win10如何設定優先程式_win10怎麼設定程式優先順序Win10
- oracle使用DBMS_SCHEDULER排程作業Oracle
- 圖論系列之「廣度優先遍歷及無權圖的最短路徑(ShortPath)」圖論
- Kubernetes排程之親和與反親和
- kubernetes排程之汙點(taint)和容忍(toleration)AI
- win10怎麼設定優先順序 win10如何設定程式程式優先順序Win10
- Apache Oozie 教程:使用 Oozie 排程 Hadoop 作業ApacheHadoop
- 批處理作業排程-分支界限法
- 作業系統之排程演算法作業系統演算法
- 程式初始(二)——程式優先順序,環境變數變數
- kubernetes排程之資源耗盡處理配置
- 實現Quartz.NET的HTTP作業排程quartzHTTP
- 廣度優先與深度優先類似嗎? - Mario
- Linux基礎命令---升值程式優先順序niceLinux
- 【程式碼隨想錄】廣度優先搜尋
- Elastic-job實戰(分散式作業排程框架)AST分散式框架
- .NET Core Hangfire週期性作業排程問題
- Ubuntu系統定時作業無效果的排錯Ubuntu
- 【作業系統】4.程序排程演算法作業系統演算法
- 自走棋手遊前瞻:產品優先or市場優先?