Semaphore adalah suatu isyarat yang digunakan untuk menentukan akses untuk berbagi sumber daya sistem.
Wikipedia Indonesia
Semaphore adalah sebuah struktur data komputer yang digunakan untuk sinkronisasi proses, yaitu untuk memecahkan masalah di mana lebih dari satu proses atau thread dijalankan secara bersamaan dan harus diatur urutan kerjanya.
I Made Wiryana
Semaphore adalah suatu mekanisme sikronisasi untuk menjaga task yang berjalan secara konkuren untuk saling mengganggu ketika sedang mengakses sumber daya yang sama dan memberi peringatan ketika terjadi suatu error.
MDGR (Masyarakat Digital Gotong Royong)
Semaphore adalah sebuah variabel bertipe integer yang selain saat inisialisasi.
Dalam kehidupan nyata, semaphore adalah sistem sinyal yang digunakan untuk berkomunikasi secara visual. Dalam software, semaphore adalah sebuah variabel bertipe integer yang selain saat inisialisasi, hanya dapat diakses melalui dua operasi standar, yaitu increment dan decrement.
Semaphore digunakan untuk menyelesaikan masalah sinkronisasi secara umum. Berdasarkan jenisnya, semaphore hanya bisa memiliki nilai 1 atau 0, atau lebih dari sama dengan 0. Konsep semaphore pertama kali diajukan idenya oleh Edsger Dijkstra pada tahun 1967.
Operasi standar pada semaphore (dalam bahasa pemrograman C):
void kunci(int sem_value) {while(sem_value <= 0);sem_value–;}void buka(int sem_value) {sem_value++;}
Nama asli dari operasi tersebut sebenarnya adalah Proberen (test) dan Verhogen (increment). Namun, sebutan untuk 2 method ini sangat beragam, antara lain sering dikenal dengan nama :release dan acquire, P dan V , serta kunci dan buka. Dalam penjelasan ini akan digunakan istilah buka dan kunci. Fungsi wait dipanggil ketika thread akan memasuki critical section-nya atau ketika thread akan memakai resource yang tersedia. Jika sem_value kurang dari sama dengan 0, thread tersebut harus menunggu sampai thread lain memanggil fungsi buka. Fungsi buka dipanggil ketika thread meningggalkan critical section-nya atau ketika melepaskan resource yang telah digunakannya. Tentu saja kedua operasi tersebut harus bersifat atomik karena sem_value dapat diakses oleh beberapa proses (shared resource).
Semaphore memiliki dua jenis, yaitu:
- Binary semaphore. Semaphore ini hanya memiliki nilai 1 atau 0. Sering juga disebut sebagai semaphore primitif
- Counting semaphore. Semaphore ini memiliki nilai 0, 1, serta integer lainnya. Banyak sistem operasi yang tidak secara langsung mengimplementasikan semaphore ini, tetapi dengan memanfaatkan binary semaphore
Prinsip semaphore :
- Dua proses atau lebih dapat bekerja sama dengan menggunakan penanda-penanda sederhana
- Proses dipaksa berhenti sampai proses memperoleh penanda tertentu
- Variabel khusus untuk penandaan ini disebut semaphore
Fungsi Semaphore
Seperti telah disebutkan sebelumnya, semaphore berfungsi untuk menangani masalah sinkronisasi secara umum, yaitu:
1. Mutual Exclusion. Sesuai dengan prinsip mutual exclusion, jika suatu thread sedang berada dalam critical section-nya, thread lain harus menunggu thread tersebut keluar daricritical section-nya sebelum dapat memasuki critical section-nya sendiri. Di sinilah semaphore digunakan, thread yang akan memasuki critical section-nya akan memanggil fungsi kunci terlebih dahulu. Jika tidak ada thread lain yang sedang berada dalam critical section, thread ini akan memasuki critical section-nya. Jika terdapat thread lain yang sedang berada dalam critical section-nya, thread ini harus menunggu.Setelah thread keluar daricritical section-nya, thread tersebut akan memanggil fungsi buka sehingga sem_value akan naik menjadi lebih dari 0, dan satu (dari beberapa) thread yang sedang menunggu akan mendapatkan giliran untuk memasuki critical section-nya.
Sebagai contoh, misalnya terdapat dua buah thread yang sedang berjalan bersamaan:
thread A: thread B:count = count + 1; count = count + 1;
Thread A dan B mengakses variabel yang sama, yaitu count sehingga thread A dan B harus berjalan satu-satu. Untuk itu digunakan semaphore mutex yang berupa binary semaphoredengan nilai awal 1.
thread A: thread B:kunci(mutex); kunci(mutex);count = count + 1; count = count + 1;buka(mutex); buka(mutex);
Thread manapun yang mengeksekusi kunci terlebih dahulu akan jalan terus, sedangkanthread yang tiba belakangan akan menunggu sampai thread yang sudah berjalan terlebih dahulu mengeksekusi buka, setelah itu kedua thread berjalan lagi dengan normal.
2. Resource Controller. Bayangkan sebuah restoran yang setiap malamnya ramai dikunjungi pelanggan. Kapasitas restoran terbatas, tetapi pemilik restoran memiliki kebijakan bahwa semua pengunjung yang datang akan mendapatkan kesempatan untuk makan, dengan konsekuensi yaitu pelanggan harus sabar menunggu gilirannya. Oleh karena itu, dikerahkanlah pegawai restoran untuk menahan tamu di luar jika restoran penuh lalu mempersilahkan tamu masuk jika tempat telah tersedia.Dari analogi di atas, pelanggan adalah thread, kapasitas restoran adalah resource, dan pegawai restoran adalah semaphore. Semaphore menyimpan banyaknya resource yang tersedia. Saat threadingin memakai resource ia akan memanggil fungsi kunci. Jika resource masih tersedia,thread bisa langsung menggunakannya, sebaliknya jika semua resource sedang dipakai,thread tersebut harus menunggu. Setelah resource selesai dipakai thread akan memanggil fungsi buka sehingga resource yang bebas bertambah.
Contohnya dapat kita lihat pada kasus berikut: Terdapat tiga buah thread yang berjalan bersamaan. Resource yang tersedia hanya cukup untuk dua buah thread.
thread A: thread B: thread C://critical section //critical section //critical section
Tentu saja harus diatur agar pada suatu saat hanya ada dua buah thread yang berada pada critical section-nya. Hal ini dilakukan dengan menggunakan semaphore multiplex yaitu sebuah counting semaphore dengan nilai awal sama dengan jumlah resource yang tersedia yaitu dua.
thread A: thread B: thread C:kunci(multiplex); kunci(multiplex); kunci(multiplex);//critical section //critical section //critical sectionbuka(multiplex); buka(multiplex); buka(multiplex);
Jika dua buah thread sedang berada dalam critical section, thread berikutnya yang akan memasuki critical section harus menunggu kedua thread tersebut selesai untuk dapat memasuki critical section-nya.
3. Sinkronisasi Antar-Proses. Ada kalanya suatu thread memerlukan resource yang dihasilkan oleh thread lainnya. Oleh karena itu dibutuhkan suatu mekanisme untuk mengatur urutan eksekusi thread. Mekanisme ini dilakukan dengan memanfaatkan semaphore.
Sebagai contoh, misalnya terdapat dua buah thread yang sedang berjalan bersamaan:
thread A: thread B:count = count + 1; count = count * 2;
Nilai awal dari variabel count adalah 5, nilai akhir yang diinginkan adalah 12, oleh karena itu thread A harus dieksekusi sebelum thread B. Agar hal ini dapat terjadi dibutuhkan suatu semaphore mutex yang merupakan sebuah binary semaphore dengan nilai awal 0.
thread A: thread B:count = count + 1; kunci(mutex);buka(mutex); count = count * 2;
Thread B akan menunggu sampai eksekusi thread A selesai sebelum melanjutkan. Jika kita cermati fungsi kunci, thread akan terus berada dalam waiting loop sampai sem_value naik lebih dari 0. Padahal, di dalam loop tersebut thread tidak melakukan tugas apa-apa. Inilah yang disebut dengan busy waiting (semaphore jenis ini disebut dengan semaphorespinlock). Hal ini tentu saja akan berakibat buruk terhadap kinerja CPU, karena looptersebut membutuhkan CPU cycle, sementara loop tersebut tidak menghasilkan apa-apa, jadi sama saja dengan menyia-nyiakan CPU cycle.Untuk mengatasi hal ini, dibuatlah modifikasi dari semaphore, yaitu dengan menambahkan waitingqueue pada masing-masing semaphore. Tujuannya adalah agar thread yang harus menunggu dipindahkan ke waiting queue dan kegiatannya dihentikan sementara.Ketika thread keluar dari critical section-nya,thread tersebut akan memanggil fungsi buka yang akan mengeluarkan satu (dari beberapa) thread yang berada dalam waiting queue lalu membangunkannya untuk kemudian memasuki critical section-nya.
Struktur semaphore ini menjadi (masih dalam bahasa C):
void buka(int sem_value){sem_value++;if(sem_value <= 0){/*keluarkan satu thread dari waiting queue*//*aktifkan thread tersebut*/}}void kunci(int sem_value){sem_value–;if(sem_value < 0){/*masukkan thread ke dalam waiting queue*//*blok thread tersebut*/}}
Berbeda dengan semaphore yang biasa, pada semaphore yang telah dimodifikasi ini sem_value bisa menjadi negatif. Jika kita renungkan maknanya, ternyata ketika semaphore bernilai negatif, nilai tersebut melambangkan banyaknya thread yang berada pada waiting queue semaphore tersebut.
Keuntungan menggunakan semaphore:
- Dari segi programming, penanganan masalah sinkronisasi dengan semaphore umumnya rapi dan teratur, sehingga mudah untuk dibuktikan kebenarannya
- Semaphore diimplementasikan dalam hard code sehingga penggunaannya bersifat portabel
REFERENSI
– Free Software Foundation.`The GNU C Library Reference Manual’, for Version 2.2.x of the GNU C Library. 2001
– Husain, Kamran. Parker, Tim.‘Red Hat Linux Unleashed’,Sams Publishing.1996
– Hariyanto, Bambang.‘Sistem Operasi’, Edisi 2, Informatika Bandung. 2000
– Masyarakat Digital Gotong Royong (MDGR) http://bebas.vlsm.org
– Sams Development Team.‘Unix Unleashed’,Sams Publishing.1994
– Stallings, William.‘Operating Systems’, New jersey. Prentice-Hall Inc.1995
– http://danang.staff.ugm.ac.id/
– http://id.wikipedia.org/wiki/Semafor
– http://ilmukomputer.com/2006/08/28/sistem-operasi-proses-pada-linux/