Luthfi Idris Cerita Linux, Jerman Wirausaha dan Hidup Sederhana

ARINC653 Scheduler

Tulisan ini dibuat untuk mengupas tuntas apa itu ARINC653 scheduler, bagaimana cara kerjanya dan bagaimana cara menggunakannya.

ARINC653 scheduler adalah virtual machine scheduler yang anti mainstream dalam artian tidak digunakan untuk keperluan umum melainkan biasanya digunakan untuk bidang penerbangan karena memerlukan isolasi yang ketat antara virtual machine seperti autopilot atau in-flight entertainment. ARINC653 scheduler menggunakan periode statis timeslice, yang artinya tiap domain/partisi mendapatkan timeslice, waktu yang diberikan untuk VCPU memproses sebuah task, yang statis.

Parameter yang digunakan oleh scheduler ini adalah major frame. Major frame adalah waktu yang diberikan untuk satu kali scheduling process, yang di dalam scheduling process bisa terdapat banyak domain process. Sedangkan minor frame adalah waktu proses untuk domainnya sendiri. Contoh: major frame di tentukan sebanyak 10ms dan runtime tiap domain adalah 3ms dan ada 2 domain (0 dan 1). Dom0 akan mendapatkan 3ms lalu ganti ke dom1 juga mendapatkan 3ms dan balik lagi ke dom0 3ms dan mungkin ada idle time sebanyak 1ms dan gantin lagi ke major frame selanjutnya setelah 10ms.

Cara menggunakan ARINC653 scheduler tidak terlalu mudah ataupun sulit. Tidak seperti credit scheduler yang tinggal pakai alias default. Scheduler ini harus ada usaha extra.

  1. Tambahkan “sched=arinc653 maxcpus=1” pada bootline xen, tepatnya pada baris yang ada kata multiboot
  2. Pastikan domain hanya menggunakan 1 VCPU dan CPU. Bisa di set pada file konfigurasi domain dengan parameter vcpus="1" dan cpus="0"
  3. Cek menggunakan perintah sudo xl info apakah setelah booting sudah menggunakan scheduler arinc653. Lalu buat domain seperti biasa
  4. Panggil arinc653_scheduler_set.c yaitu file c yang kita buat sendiri untuk load beberapa parameter yang akan digunakan arinc653 scheduler. Apabila tidak, meskipun sudah buat domain tidak akan jalan.

Contoh file arinc653_scheduler_set.c

Contoh ini hanya menggunakan 1 guest domain tambahan, apabila ada 2 atau lebih maka ditambah baris yang penting seperti uuid_parse, vcpu_id, runtime atau major_frame dan disesuaikan dengan domain yang baru. Bisa juga dengan melakukan pengulangan, tetapi cara ini lebih canggih daripada cara manual seperti di bawah ini.

    #include <stdio.h>
    #include <xenctrl.h>
    #include <uuid/uuid.h>
    
    int main()
    {
        struct xen_sysctl_arinc653_schedule sched;
        xc_interface *xci = xc_interface_open(NULL, NULL, 0);
        int i;
    
        /* inisialisasi major frame dan minor frame */
        sched.major_frame = 0;
        sched.num_sched_entries = 2;
        
        /* parsing uuid domain0 ke domain handle, angka 0 banyak ini bisa dilihat setelah perintah 
        * sudo xl list -v 
        * salin UUID disana, lalu sesuaikan dengan baris ini */
        uuid_parse("00000000-0000-0000-0000-000000000000", sched.sched_entries[0].dom_handle);
        
        /* harus di set ke 0, karena hanya menggunakan 1 vcpu */
        sched.sched_entries[0].vcpu_id = 0;
        
        /* default value yang enak ada 10000000, 
        * karena runtime menggunakan satuan nanosecond jadi 10000000 adalah 10ms */
        sched.sched_entries[0].runtime = 10000000;
        sched.major_frame += sched.sched_entries[0].runtime;

        /* UUID di bawah didapat dari perintah 
        * sudo xl list -v 
        * setelah membuat domain. Jadi bisa berbeda-beda UUID nya tiap kali buat domain. 
        * Supaya tidak selalu berubah, set pada file konfigurasi
        * UUID = "938b9c5b-8d9d-402a-9be0-0e0cc4cf67dc" */
        uuid_parse("938b9c5b-8d9d-402a-9be0-0e0cc4cf67dc", sched.sched_entries[1].dom_handle);
        sched.sched_entries[1].vcpu_id = 0;
        sched.sched_entries[1].runtime = 10000000;
        sched.major_frame += sched.sched_entries[1].runtime;

        /* hanya untuk memastikan bahwa parameter diatas sudah diload dengan baik */        
        i = xc_sched_arinc653_schedule_set(xci, 0, &sched);
        if (!i)
        {
                printf("true\n");
        } else {
                printf("false\n");
        }

        return 0;
    }

Update: Untuk kompilasi program diatas, gunakan parameter -lxenctrl dan -luuid untuk menyertakan library xenctrl dan uuid. Bisa juga membuat file Makefile yang isinya seperti berikut

Sumber:

  1. http://wiki.xen.org/wiki/ARINC653_Scheduler
  2. https://blog.xenproject.org/2013/12/16/what-is-the-arinc653-scheduler/
  3. Milis xen-users

« Pos Sebelumnya Pos Sesudahnya »