Sebelum memilih algoritma scheduler, kita perlu tahu atribut apa yang dimiliki setiap task. Pada bagian ini kita mendefinisikan struct Task dengan empat atribut utama: ID, arrival time, burst time, dan priority. Kita juga menambahkan field hasil simulasi (startTime, finishTime) yang akan diisi saat scheduler berjalan pada Bagian 4.
Atribut Task #
Berikut penjelasan tiap atribut:
| Atribut | Tipe | Penjelasan |
|---|---|---|
id | std::string | Identifier unik (mis. "T1") |
arrival | int | Waktu task tiba di queue (time unit) |
burst | int | Lama eksekusi yang dibutuhkan (time unit) |
priority | int | Prioritas — angka lebih kecil = lebih tinggi (Unix convention) |
startTime | int | Waktu mulai eksekusi (diisi saat simulasi) |
finishTime | int | Waktu selesai eksekusi (diisi saat simulasi) |
Definisi struct Task #
#include <string>
struct Task {
std::string id;
int arrival;
int burst;
int priority;
int startTime = -1;
int finishTime = -1;
};Field startTime dan finishTime diberi default -1 sebagai penanda “belum dijadwalkan”. Saat scheduler berjalan, kedua field ini diisi dengan nilai aktual.
Metrik Turunan #
Dari field di atas, kita bisa menghitung dua metrik turunan:
- Waiting time =
startTime - arrival(waktu task menunggu di queue sebelum mulai). - Turnaround time =
finishTime - arrival(total waktu dari arrival hingga selesai).
Kedua metrik ini dihitung pada Bagian 4 saat simulasi selesai.
Program Verifikasi #
Berikut program yang membangun lima task contoh dan mencetak ringkasannya.
#include <iostream>
#include <string>
#include <vector>
struct Task {
std::string id;
int arrival;
int burst;
int priority;
int startTime = -1;
int finishTime = -1;
};
int main() {
std::vector<Task> tasks = {
{"T1", 0, 5, 2},
{"T2", 1, 3, 1},
{"T3", 2, 8, 3},
{"T4", 3, 6, 2},
{"T5", 4, 4, 1}
};
std::cout << "Daftar task:\n";
std::cout << "ID arrival burst prio\n";
for (const auto& t : tasks) {
std::cout << t.id << " "
<< t.arrival << " "
<< t.burst << " "
<< t.priority << "\n";
}
std::cout << "\nTotal task: " << tasks.size() << "\n";
std::cout << "Total burst: ";
int total = 0;
for (const auto& t : tasks) total += t.burst;
std::cout << total << " time units\n";
return 0;
}Output yang Dihasilkan:
Daftar task:
ID arrival burst prio
T1 0 5 2
T2 1 3 1
T3 2 8 3
T4 3 6 2
T5 4 4 1
Total task: 5
Total burst: 26 time unitsBedah Baris Penting #
std::string id: identifier dipakai sebagai string (mis."T1") alih-alih angka agar mudah dibaca di output. Pada produksi, ID bisa berupaintuntuk efisiensi.int startTime = -1: inisialisasi default dengan nilai sentinel-1. Setelah simulasi, bila masih-1, berarti task tidak pernah dijadwalkan — kondisi error yang seharusnya tidak terjadi pada scheduler valid.- Default member initializer C++11+: penulisan
= -1di dalam struct membuat setiapTaskyang dibuat langsung memilikistartTime = -1tanpa perlu diset eksplisit. Bandingkan denganarrival,burst,priorityyang tidak punya default — wajib diisi saat konstruksi (akan menyebabkan compile error bila lupa, yang merupakan perilaku yang kita inginkan untuk field input). std::vector<Task> tasks = {{"T1", 0, 5, 2}, ...}: aggregate initialization C++17 membuatTasktanpa konstruktor eksplisit. Urutan nilai mengikuti urutan deklarasi field:id,arrival,burst,priority. FieldstartTimedanfinishTimeotomatis dapat default-1.
Ringkasan Bagian 1 #
Kita telah mendefinisikan struct Task dengan enam field: empat input (id, arrival, burst, priority) dan dua hasil simulasi (startTime, finishTime). Metrik turunan waiting time dan turnaround time dapat dihitung dari field hasil. Pada Bagian 2, kita membangun priority queue dengan custom comparator untuk pemilihan task.