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:

AtributTipePenjelasan
idstd::stringIdentifier unik (mis. "T1")
arrivalintWaktu task tiba di queue (time unit)
burstintLama eksekusi yang dibutuhkan (time unit)
priorityintPrioritas — angka lebih kecil = lebih tinggi (Unix convention)
startTimeintWaktu mulai eksekusi (diisi saat simulasi)
finishTimeintWaktu selesai eksekusi (diisi saat simulasi)

Definisi struct Task #

cpp
#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.

cpp
#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:

text
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 units

Bedah Baris Penting #

  1. std::string id: identifier dipakai sebagai string (mis. "T1") alih-alih angka agar mudah dibaca di output. Pada produksi, ID bisa berupa int untuk efisiensi.
  2. 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.
  3. Default member initializer C++11+: penulisan = -1 di dalam struct membuat setiap Task yang dibuat langsung memiliki startTime = -1 tanpa perlu diset eksplisit. Bandingkan dengan arrival, burst, priority yang tidak punya default — wajib diisi saat konstruksi (akan menyebabkan compile error bila lupa, yang merupakan perilaku yang kita inginkan untuk field input).
  4. std::vector<Task> tasks = {{"T1", 0, 5, 2}, ...}: aggregate initialization C++17 membuat Task tanpa konstruktor eksplisit. Urutan nilai mengikuti urutan deklarasi field: id, arrival, burst, priority. Field startTime dan finishTime otomatis 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.