程式排程演算法之先到先服務
程式排程演算法程式排程演算法之先到先服務
先到先服務(First-Come First-Served)
- 優點:
編碼簡單且容易理解; - 缺點:
平均等待時間往往很長;
程式碼
根據個人思路模擬的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 operator< (const StruTask &task)const
{
if(arrive_time == task.arrive_time)
return id > task.id;
return arrive_time > task.arrive_time;
}
}arrayTask[MAXN];
priority_queue<StruTask>que;
void get_task()
{
cout<<"請輸入任務數:"<<endl;
cin>>task_num;
if(task_num <= 0) return;
cout<<"----------請輸入任務相關資訊-------"<<endl;
for(int i = 1; i <= task_num; ++i)
{
cout<<"請輸入第"<<i<<"個任務的 到達時間 和 服務時間:";
arrayTask[i].id = i;
cin>>arrayTask[i].arrive_time;
cin>>arrayTask[i].service_time;
}
}
int get_next_task()
{
if(!que.empty())
{
StruTask task = que.top();
que.pop();
return task.id;
}
return 0;
}
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;
}
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;
}
/*
FCFS:
First-Come First-Served
*/
void FCFS()
{
for(int i = 1; i <= task_num; ++i)
{
que.push(arrayTask[i]);
}
now_time = 0;
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()
{
get_task();
FCFS();
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;
}
執行示例
3
0 24
0 3
0 3
4
3 2
1 5
6 7
4 3
相關文章
- linux之 修改磁碟排程演算法Linux演算法
- 任務排程的並行演算法並行演算法
- 作業系統之排程演算法作業系統演算法
- 程式排程的原理和演算法探析演算法
- 任務排程
- LVS排程演算法演算法
- Spark中資源排程和任務排程Spark
- linux程式排程Linux
- Airflow 任務排程AI
- Laravel 任務排程Laravel
- 用java語言,模擬實現作業系統的程式排程演算法,先來先服務,高優先順序、高響應比、時間片輪轉和短作業Java作業系統演算法
- MySQL 8.0 —— CATS事務排程演算法的效能提升MySql演算法
- Kubernetes之Pod排程
- cpu的排程演算法演算法
- 嵌入式軟體開發之程式架構設計-任務排程架構
- Go語言排程器之排程main goroutine(14)GoAI
- SQL Server最佳化必備之任務排程SQLServer
- 分散式任務排程分散式
- Spring 指南(排程任務)Spring
- newsql新品TiDB之排程SQLTiDB
- 2.2.5排程演算法:時間片輪轉、優先順序排程、多級反饋排程演算法
- 任務排程並行演算法的Java簡單實現並行演算法Java
- 任務排程並行演算法的Python簡單實現並行演算法Python
- Flink排程之排程器、排程策略、排程模式模式
- Timer和TimerTask 任務排程
- 聊聊PowerJob的任務排程
- Linux 定時任務排程Linux
- 分散式排程任務-ElasticJob分散式AST
- LeetCode 621 任務排程器LeetCode
- 磁軌排程演算法介紹演算法
- PHP 程式池與輪詢排程演算法實現多工PHP演算法
- verilog的RR輪詢排程演算法的程式碼實現演算法
- 程式排程案例分析與常見疑惑1:為何不能排程?
- Python任務排程模組APSchedulerPython
- LTS分散式任務排程部署分散式
- 教你更優雅地寫 API 之「靈活地任務排程」API
- [原始碼分析] 定時任務排程框架 Quartz 之 故障切換原始碼框架quartz
- k8s之pod排程K8S