Tasking penuh pada Ada cukup luwes untuk aplikasi umum, tetapi sistem kritis menuntut perilaku konkurensi yang dapat dianalisis sebelum program dijalankan. Profil Ravenscar adalah himpunan pembatasan tasking yang ditetapkan bahasa untuk memenuhi kebutuhan itu, dengan model konkurensi statis dan prioritas tetap. Topik ini membahas alasan pembatasan profil Ravenscar, daftar batasan utamanya, pola task periodik yang sesuai, serta cara kompilator menegakkan profil tersebut.
Alasan pembatasan tasking#
Analisis waktu pada sistem kritis, misalnya kendali penerbangan atau pemantauan medis, memerlukan kepastian bahwa setiap task menyelesaikan pekerjaannya sebelum tenggatnya. Kepastian semacam itu sulit diperoleh apabila task dapat dibuat dan dihentikan saat program berjalan, prioritasnya berubah sewaktu-waktu, atau memorinya dialokasikan secara dinamis. Profil Ravenscar membatasi kemampuan tasking tepat pada titik-titik tersebut. Dengan pembatasan itu, himpunan task diketahui sejak program dibangun, memori tidak terfragmentasi oleh alokasi saat berjalan, dan waktu tunggu terpanjang pada tiap sinkronisasi dapat dibatasi.
Pembatasan ini juga menyederhanakan penilaian karena penguji tidak perlu memodelkan alokasi mendadak atau perubahan prioritas yang tidak mungkin terjadi. Hasilnya adalah model eksekusi yang statis, yaitu seluruh task dikenali sejak program dimulai dan komunikasi antar task hanya melalui protected object. Model ini sejalan dengan tuntutan standar sertifikasi perangkat lunak kritis.
Batasan utama profil#
Profil ditetapkan pada Ada Reference Manual sebagai kumpulan restriction yang dapat ditegakkan kompilator, dan daftar berikut merangkum batasan utamanya.
- Seluruh task berada pada level library, yaitu dinyatakan pada spesifikasi package, sebagaimana dibatasi
No_Task_Hierarchy. - Task tidak memiliki entry (
Max_Task_Entries => 0), sehingga komunikasi antar task hanya melalui protected object. - Pernyataan
selectdilarang (No_Select_Statements), begitu pula perubahan prioritas saat berjalan (No_Dynamic_Priorities). - Task tidak berhenti (
No_Task_Termination) dan tidak boleh dibatalkan dengan pernyataanabort(No_Abort_Statements). - Hanya
delay untilyang diizinkan (No_Relative_Delay), sehingga jadwal tidak bergeser. - Alokasi memori implisit dilarang (
No_Implicit_Heap_Allocations) dan panjang antrean tiap entry dibatasi satu (Max_Entry_Queue_Length => 1). - Kebijakan penguncian menggunakan protokol priority ceiling (
Ceiling_Locking).
Dua batasan terakhir berperan penting dalam analisis. Panjang antrean satu membuat waktu tunggu tiap panggilan tidak menumpuk tanpa batas, sedangkan protokol ceiling membuat waktu tunggu terpanjang pada protected object dapat dihitung dari durasi aksinya. Larangan penghentian task juga berarti tidak ada task baru yang muncul saat program berjalan, sehingga beban prosesor dapat dihitung dari daftar task yang sudah diketahui itu.
Pola task periodik#
Pola eksekusi utama pada profil ini adalah task periodik dengan delay until beracuan tetap. Task menghitung waktunya lebih dahulu, menunggu sampai waktu itu tercapai, menjalankan pekerjaannya, lalu menambahkan periode ke acuannya. Program berikut menerapkan pola itu dengan periode 100 milidetik dan prioritas tetap.
with Ada.Real_Time;
with Ada.Text_IO;
procedure Pemantau_Periodik is
use type Ada.Real_Time.Time;
task Pemantau is
pragma Priority (10);
end Pemantau;
task body Pemantau is
Next : Ada.Real_Time.Time := Ada.Real_Time.Clock;
begin
for Siklus in 1 .. 3 loop
delay until Next;
Ada.Text_IO.Put_Line ("siklus" & Integer'Image (Siklus) & " selesai");
Next := Next + Ada.Real_Time.Milliseconds (100);
end loop;
end Pemantau;
begin
null;
end Pemantau_Periodik;# kompilasi program
gnatmake -q pemantau_periodik.adb
# jalankan program
./pemantau_periodiksiklus 1 selesai
siklus 2 selesai
siklus 3 selesaiBaris keluaran muncul dengan jarak 100 milidetik satu sama lain. Interval itu tidak bergeser sekalipun pekerjaan satu siklus memakan waktu karena acuan Next dihitung dari jam nyata. Siklus yang selesai lebih cepat hanya memperpanjang penantian menuju acuan berikutnya, sehingga lama pekerjaan tidak terakumulasi ke interval.
Prioritas task ditetapkan dengan pragma Priority sebelum program berjalan, sesuai tuntutan prioritas statis profil, sehingga urutan eksekusi ketika dua task siap bersamaan dapat ditentukan pada saat analisis. Program contoh membatasi diri pada tiga siklus, sedangkan task periodik pada profil ini dinyatakan tanpa akhir dan tidak pernah berhenti sesuai batasan No_Task_Termination. Seluruh task pada profil juga harus dinyatakan di luar subprogram apa pun.
Penegakan profil oleh kompilator#
Kompilator menolak program yang melanggar profil sebelum program itu dijalankan. Program berikut memasang pragma Profile (Ravenscar) lalu mendeklarasikan task di dalam prosedur utama, dan pelanggaran itu dikenali secara statis.
pragma Profile (Ravenscar);
with Ada.Real_Time;
with Ada.Text_IO;
procedure Penolakan_Profil is
use type Ada.Real_Time.Time;
task Pemantau is
pragma Priority (10);
end Pemantau;
task body Pemantau is
Next : Ada.Real_Time.Time := Ada.Real_Time.Clock;
begin
for Siklus in 1 .. 3 loop
delay until Next;
Ada.Text_IO.Put_Line ("siklus" & Integer'Image (Siklus) & " selesai");
Next := Next + Ada.Real_Time.Milliseconds (100);
end loop;
end Pemantau;
begin
null;
end Penolakan_Profil;# kompilasi program dengan pragma Profile (Ravenscar)
gnatmake -q penolakan_profil.adbpenolakan_profil.adb:8:04: error: violation of restriction "No_Task_Hierarchy"
penolakan_profil.adb:8:04: error: from profile "Ravenscar" at line 1
gnatmake: "penolakan_profil.adb" compilation errorGNAT melaporkan pelanggaran No_Task_Hierarchy beserta profil yang memasangnya, dan tidak ada berkas biner yang dihasilkan. Sesuai profil, task dinyatakan pada level library, yaitu di dalam spesifikasi package. Pemeriksaan semacam ini berlangsung pada saat kompilasi untuk pelanggaran yang dapat dikenali secara statis, sedangkan pelanggaran yang baru tampak saat berjalan ditandai oleh pemeriksaan runtime. Alur kerjanya menjadi sederhana, yaitu memasang pragma pada unit yang memuat task, kemudian membiarkan kompilator menyaring pelanggarannya lebih dahulu.
-- tidak-dijalankan
package Pemantau_Suhu is
task Pemantau is
pragma Priority (10);
end Pemantau;
end Pemantau_Suhu;Task yang dinyatakan pada spesifikasi package tersedia sejak elaborasi, yaitu tahap penyiapan unit sebelum pernyataan pertama dijalankan, dan tidak bergantung pada blok mana pun. Dengan demikian, seluruh task profil Ravenscar dikenali sejak program dimulai, sesuai tuntutan analisis statisnya.
Kesalahan umum#
Empat kekeliruan berikut sering muncul saat profil Ravenscar dipraktikkan.
- Menghitung periode dari
delayrelatif yang diulang. Setiap eksekusi menghitung penantian berikutnya dari saat pekerjaan selesai, sehingga lama pekerjaan terakumulasi ke interval dan jadwal bergeser terus. Gunakandelay untildengan acuan yang ditambah periode tetap, seperti pada pola periodik di atas. - Menghentikan task saat program berjalan. Batasan
No_Task_Terminationmenjadikan penghentian itu pelanggaran, dan task periodik memang dirancang berjalan tanpa akhir pada targetnya. Keluarkan hasil kerjanya melalui protected object alih-alih menghentikannya. - Menganggap profil menjamin ketepatan waktu dengan sendirinya. Profil membatasi mekanisme agar analisis dapat dilakukan, sedangkan prioritas dan periode tiap task tetap tanggung jawab perancangnya.
- Membuat task baru saat program berjalan. Batasan
No_Task_Hierarchymenuntut seluruh task berada pada level library, sehingga perluasan pekerjaan dirancang sebagai task yang sudah ada sejak awal.
Ringkasan#
- Profil Ravenscar membatasi tasking pada model statis, yaitu task level library tanpa entry, tanpa select, dan tanpa penghentian task.
- Komunikasi antar task hanya melalui protected object, jadwal menggunakan delay until, dan penguncian menggunakan protokol priority ceiling.
- GNAT menegakkan profil melalui pragma Profile (Ravenscar) dan menolak pelanggaran yang dikenalinya pada saat kompilasi.
Referensi#
- D.13 The Ravenscar and Jorvik Profiles — Ada Reference Manual 2022 — Menetapkan daftar restriction yang membentuk profil Ravenscar.
- Use the Ravenscar Profile — Guidelines for Safe and Secure Ada/SPARK, AdaCore — Menyajikan alasan dan aturan praktis pemakaian profil Ravenscar.
- GNAT User’s Guide — AdaCore — Mendokumentasikan pragma Profile dan penegakan restriction pada GNAT.