10 fungsi Built-In
11. Pustaka Standar
12.10 Informasi Sistem
12.12.2 Penjadwalan Realtime
Thread-Thread selalu diciptakan dengan kebijakan penjadwalan default "tidak realtime". Di beberapa sistem ini juga yang mungkin untuk meningkatkan suatu prioritas Thread dan sesudah itu menjadwalkan di dalam "yang realtime". Ini bermanfaat untuk tugas-tugas dengan persyaratan-persyaratan pemilihan waktu dan kemampuan reaksi yang tegas, seperti suatu fungsi yang merekam atau memutar ulang di suatu aplikasi multimedia.
Kebijakan penjadwalan dan prioritas suatu Thread dapat diubah dengan fungsi yang berikut yang mengambil dua argument tambahan, kebijakan POL (0 = default, 1 = round-robin realtime, 2 =penjadwalan fifo realtime) dan prioritas PRIO (di mana 0 menandakan prioritas default). Catatan bahwa di penjadwalan kebanyakan sistem realtime hanya akan dihibahkan kepada proses-proses yang diistimewakan.
public extern setsched THREAD POL PRIO; // set scheduling parameters
Kebijakan penjadwalan yang ada dan prioritas suatu thread dapat didapat kembali dengan fungsi getsched:
public extern getsched THREAD; // get scheduling parameters
Cakupan yang nyata dari nilai-nilai prioritas adalah sistem. spesifik. Di suatu sistem UNIX yang khas sekedar Thread yang tidak realtime dapat mempunyai prioritas 0, selagi thread-Thread yang realtime selalu mempunyai prioritas-prioritas positif. Prioritas thread yang lebih tinggi harus selalu didahulukan dari mereka yang prioritas lebih rendah. selain itu Semua tetap sama, Thread-Thread yang menggunakan penjadwalan round-robin masing-masing memberi mereka timeslice "adil", selagi penanganan thread di suatu fifo "datang awal dilayani lebih dulu" dasar. Yang belakangan hanya dapat berada disela oleh proses-proses prioritas yang lebih tinggi (dan isyarat-isyarat) dan seperti itu harus digunakan di kepedulian yang paling. Setidak-tidaknya anda harus pastikan bahwa suatu prioritas Thread yang tinggi tidak menjalankan unsuspended untuk periode waktu yang diperluas, jika tidak itu bisa mengamankan sistem anda. Dengan demikian suatu Thread yang realtime pada umumnya perlu membelanjakan kebanyakan dari waktu nya "di dalam tempat buangan" di mana menunggu masukan tiba atau suatu kondisi untuk diberi isyarat.
Mengira bahwa nilai prioritas yang dicakup bersifat berdekatan dan berisi yang manapun 0 atau 1, anda dapat menentukan cakupan-cakupan untuk sistem anda dengan script kecil berikut:
test POL PRIO = setsched this_thread 0 0 || true
where () = setsched this_thread POL PRIO; = false otherwise;
priotest POL = (hd L,last L) if not null L
where L = reverse (while (test POL) pred 0) ++ while (test POL) succ 1;
Di sini adalah suatu contoh hasil yang diperoleh di Linux:
==> map priotest [0,1,2] [(0,0),(1,99),(1,99)]
Penjadwalan Realtime di Windows
Di bawah Windows, berbagai hal sedikit berbeda, karena Windows tidak benar-benar mempunyai penjadwalan thread POSIX-compatible. Sebagai gantinya, proses-proses mempunyai "kelas-kelas prioritas" selagi Thread-Thread mempunyai "prioritas-prioritas" yang ditafsirkan dalam konteks kelas prioritas dari proses, mereka kepunyai. Oleh karena itu di bawah Windows argument POL dari operasi yang setsched benar-benar ditafsirkan sebagai suatu kelas prioritas untuk seluruh proses selagi argument PRIO menetapkan prioritas setiap thread. Clib menjejaki semua panggilan yang setsched dan selalu memungkinkan proses mempunyai kelas prioritas yang paling tinggi menetapkan untuk suatu Thread yang masih aktif. untuk tujuan ini, nilai polis 0, 1 dan 2 dipetakan kepada kelas-kelas prioritas "normal", "high" dan "realtime". (Yang belakangan harus digunakan dengan hemat, jika sama sekali, di suatu script Q, karena itu membuat Windows sangat tak bereaksi.) Lebih dari itu, fungsi yang setsched juga menerima suatu nilai polis dari -1 untuk menandakan proses-proses "waktu idle". (Anda akan jarang menemui penggunaan untuk ini, kecuali jika anda ingin menulis suatu screensaver di dalam Q.) Untuk masing-masing kebijakan, nilai-nilai prioritas yang mungkin mempunyai suatu cakupan dari -3 sampai 3, di mana -3 menandakan waktu idle thread, 0 adalah prioritas yang normal, dan 3 adalah prioritas yang paling tinggi untuk digunakan thread-thread "waktu-kritis". Prioritas ukur yang tersisa menyediakan beberapa jumlah tambahan dari kendali di mana Thread mendapat tulang terlebih dulu.
Sementara sebagian "efek khusus" dapat dicapai dengan nilai-nilai prioritas lebih eksotis dari Windows, untuk pemakaian khas suatu kebijakan dari 0 dengan prioritas kosong harus dipekerjakan untuk thread yang biasa, suatu kebijakan dari 1 dengan sebagian (kecil) nilai prioritas positif untuk suatu thread dengan persyaratan-persyaratan realtime yang moderat, dan suatu kebijakan dari 2 jika waktu sangat kritis. Jika anda mengikuti konvensi-konvensi ini lalu script anda akan mampu berjalan dibawah Windows dan kebanyakan sistem UNIX tanpa perubahan.
12.12.3 Mutexes
mutexes Clib dating dengan tiga jenis: fast (tidak ada pemeriksaan kesalahan), error checking (gagal jika thread yang ada telah memegang suatu kunci di mutex) dan recursive (thread yang sama boleh mengunci mutex berulang kali, dan nomor yang sama dari operasi membuka kunci diwajibkan untuk membuka kunci mutex kembali). Operasi yang didukung adalah lock (menantikan mutex untuk tidak terkunci, lalu menguncinya dan mengembalikan ()),unlock (membuka kunci mutex, mengembalikan ()) dan try (mengunci mutex jika itu tersedia, gagal dengan cara lainnya).
KEBERATAN: Operasi ini berbahaya, ketika Anda dapat dengan mudah membuat deadlock yang mungkin mengamankan interpreter. Catatan bahwa suatu deadlock juga akan mencegah
thread yang dilibatkan sejak pembatalan, sesuai dengan standar POSIX, menantikan suatu kunci mutex bukan suatu titik pembatalan. Dengan demikian operasi ini harus digunakan dengan kepedulian.
Karena Q tidak memiliki variabel-variabel yang dapat berubah dan interpreter builtins semuanya adalah thread-aman, mutexes benar-benar digunakan sangat sedikit di dalam Q dibanding di dalam bahasa-bahasa prosedural yang lain. Mereka paling bermanfaat untuk melindungi bagian-bagian kritis di mana suatu urutan operasi dengan efek samping (seperti I/O) dilaksanakan dalam satu pertunjukan yang atomis. Hal ini bisa dilakukan dengan penguncian suatu mutex di permulaan dan membuka kunci nya pada akhir urutan. Pemakaian seperti itu adalah aman, dengan ketentuan bahwa tanpa operasi di dalam urutan boleh menghalangi selama satu periode waktu tak tentu atau bahkan yang diperluas.
public extern type Mutex; // mutex type
public ismutex MUTEX; // check for mutex objects public extern mutex; // standard (fast) mutex object public extern errorchecking_mutex; // error checking mutex object public extern recursive_mutex; // recursive mutex object public extern lock MUTEX; // lock MUTEX
public extern unlock MUTEX; // unlock MUTEX public extern try MUTEX; // try MUTEX
12.12.4 Kondisi
kondisi-kondisi Clib mendukung operasi yang berikut: isyarat (bangun satu thread yang menantikan kondisi), siaran (bangun semua thread yang menantikan kondisi) dan menunggu (penjarakan thread yang ada sampai kondisi itu dikirim). Masing-masing operasi ini mengembalikan (). Menunggu operasi dapat juga dilibatkan dengan sebuah tuple (COND, WAKTU) untuk menandakan suatu masa penantian yang diatur waktu. Jika masa penantian waktu ke luar atau disela oleh suatu isyarat lalu operasi gagal. Catatan bahwa seiring standar POSIX, Nilai waktu menandakan satu waktu mutlak (nilai bilangan bulat atau floating-point dalam hitungan detik karena "zaman", lihat juga uraian fungsi waktu builtin di Miscellaneous Functions).
public extern type Condition; // condition type
public iscondition COND; // check for condition objects public extern condition; // new condition object
public extern signal COND; // signal COND public extern broadcast COND; // broadcast COND
public extern await COND; // wait for COND, or (COND,TIME)
12.12.5 Semaphores
Semafor Clib pada kenyataannya antrian-antrian semafor yang dapat digunakan sebagai suatu suatu chanel komunikasi untuk lewatnya nilai-nilai antara thread yang berbeda menggunakan suatu disiplin FIFO. Di dalam perluasan kepada operasi semafor POSIX 1003.1b, clib juga menyediakan dukungan untuk semafor-semafor yang dibatasi yang diciptakan dengan suatu batas yang positif di banyaknya nilai-nilai, antrian semafor boleh digunakan pada setiap waktu. Ketika suatu nilai yang baru ditempatkan ke suatu semafor yang dibatasi, thread yang ada
dipenjarakan sampai antrian mempunyai ruang untuk menerima suatu nilai yang baru, jika perlu.
Operasi yang didukung adalah pos (enqueue suatu nilai), mendapatkan (dequeue suatu nilai dan hasilnya, secepat satu yang tersedia), mencoba (versi tidak blok yang di dapat yang gagal jika tidak ada nilai yang tersedia), get_size atau # yang kedua mengembalikan ukuran antrian yang ada, dan get_bound yang mengembalikan batas ukuran antrian dari suatu semafor yang dibatasi (atau kosong jika semafor itu tak terhingga).
Catatan bahwa sama dengan semafor-semafor yang tak terhingga, ukuran semafor yang maksimum adalah benar-benar dibatasi oleh sistem operasi, lihat dokumentasi POSIX thread anda yang lokal untuk detil. Jika batas implementasi spesifik ini terlewati, usaha itu untuk menempatkan suatu nilai yang baru menaikkan suatu perkecualian syserr 9.
public extern type Semaphore; // semaphore type
public issemaphore SEM; // check for semaphore objects public extern semaphore; // semaphore object
public extern bounded_semaphore MAX; // bounded semaphore object public extern post SEM X; // enqueue a value
public extern get SEM; // dequeue a value
public extern try SEM; // dequeue a value, fail if none public extern get_size SEM; // get the current queue size
public extern get_bound SEM; // get the max queue size (0 if none)