Pemrograman C: Implementasi Semaphore dengan Busy-WaitingPada kesempatan ini kita akan memahami bagaimana semaphore bekerja. Perlu ditekankan bahwa tujuan penggunaan busy-waiting disini hanya untuk pembelajaran saja. Agar lebih mudah memahami bagaimana logika dibalik semaphore. Tentu sudah ada file header sungguhan untuk kebutuhan ini yaitu semaphore.h yang lebih efisien, menggunakan sistem penjadwalan dan tidak boros sumber daya CPU. Ada dua macam semaphore yaitu binary semaphore dan counting semaphore. Inti dari semaphore sebenarnya adalah sebuah variable dengan tipe integer yang digunakan bersama-sama antar thread dan bersifat atomic atau tidak boleh mengalami kondisi race. Semaphore berguna untuk sinkronisasi thread hingga antar proses. Tetapi kali ini kita hanya akan menyentuh pada tingkatan thread. Kita akan mencoba meniru fungsi-fungsi bawaan semaphore.h yaitu sem_init(), sem_wait() dan sem_post(), yang mana dalam hal ini menggunakan counting semaphore. Tetapi sebelumnya kita ketahui dulu pseudocode dari semaphore berdasarkan dari deskripsi di manual semaphore POSIX di https://man7.org/linux/man-pages/man3/sem_wait.3.html: If the semaphore's value is greater than zero, then the decrement proceeds, and the function returns, immediately. If the semaphore currently has the value zero, then the call blocks until either it becomes possible to perform the decrement (i.e., the semaphore value rises above zero), or a signal handler interrupts the call.
wait() dan signal() juga biasa dinotasikan sebagai P() dan V(), yang merupakan inisial dari istilah Belanda karena konsep semaphore awalnya dikemukakan oleh Edsger Wybe Dijkstra, seorang ilmuwan komputer berkebangsaan Belanda. wait() digunakan untuk memasuki sesi kritis (critical section). value adalah nilai inisiasi yang diberikan untuk membatasi berapa jumlah thread yang boleh masuk critical section sekaligus. Nanti akan kita implementasikan di fungsi sem_init(). Setelah selesai di critical section, maka signal() harus dipanggil agar melepaskan spinlock pada thread lain yang sedang menunggu untuk masuk ke critical section (jika ada). Berikut adalah prototype dari fungsi-fungsi semaphore yang akan kita buat:
Jika ingin latihan, sampai disini silahkan berhenti membaca dan buat implementasi dari prototype diatas. Jika sudah, bandingkan ketika menggunakan semaphore.h atau semaphore versi sendiri hasilnya harus sesuai. Berikut adalah implementasi yang saya buat. Saya tidak menggunakan variable atomic tetapi menggunakan variable biasa yang didampingi oleh mutex agar tidak mengalami kondisi race.
Semoga bermanfaat! |