Dokumen tersebut menjelaskan tentang semaphore, yaitu primitive sinkronisasi yang lebih tinggi dari lock untuk mengatur urutan eksekusi thread. Semaphore beroperasi dengan menggunakan counter dan antrian thread, dimana operasi wait() akan menurunkan counter sedangkan signal() akan menaikkan counter dan membangunkan thread di antrian. Nilai awal semaphore menentukan jumlah thread yang dapat mengakses resource secara bersamaan.
English for Proficiency Certification (EPC) - Modul 2 - Further Exercises and...
Modul Sistem Operasi Semaphore
1. MODUL S.O – SEMAPHORE (IND)
TUJUAN
Menjelaskan perbedaan antara sinkronisasi dengan locks dan semaphore
Mengidentifikasi penggunaan semaphore
Menggambarkan operasi semaphore dasar dan inisialisasi semaphore
MENGAPA PERLU SEMAPHORE
Locks hanya menyediakan mutual exclusion
o Sehingga memastikan hanya 1 thread saja pada critical section untuk waktu tertentu (saat
share resource penting seperti kasus bank kemarin)
Mungkin perlu lebih dari itu : Menambahkan urutan pada penjadwalan thread
o Contoh : Produser/Konsumer
Produser : Memproduksi resource (data)
Consumer : Mengkonsumsi resource (data)
o Contoh
Urutan perintah : ps | grep “gcc” | wc
ps sebagai produser, grep menggunakan hasil dari ps dan wc baru berjalan
setelah menggunakan gasil dari grep.
o Produser dan Konsumer tidak bisa beroperasi dalam tahap lock yang sekuensial/bergantian,
karena akan banyak jadi context switching yg membuat operasi tidak efisien, jadi kita perlu :
Menempatkan buffer berukuran fix antara produser dan konsumer
Mensinkronisasikan akses ke buffer
Produser bisa tetap “memproduksi” selama buffer belum penuh, consumer bisa
tetap menggunakan hasil produksi selama buffer belum kosong.
SEMAPHORE
APA ITU SEMAPHORE
Semaphore adalah sebuah primitive untuk sinkronisasi yang lebih tinggi levelnya daripada lock
Ditemukan oleh Dijkstra pada 1965 sebagai bagian dari Proyek Sistem Operasi
Semaphore adalah
o Sebuah counter yang dimanipulasi secara atomik melalui dua operasi : signal dan wait.
o wait(semaphore) : lakukan decrement (diturunkan nilainya) pada counter, jika counter
bernilai zero maka lakukan block sampai semaphore di”nyalakan” sinyalnya (is signaled)
sering disebut juga P(), dari kata belanda yang artinya test, dan juga sering
disebut down()
2. o signal(semaphore) : lakukan increment pada counter, “bangunkan” satu pengantri bila
ada.
Sering disebut juga V(), dari bahasa Belanda yang artinya increment (naikkan), dan
juga sering disebut up()
o sem_init(semaphore,counter) : set nilai counter pertama.
IMPLEMENTASI SEMAPHORE PD PSEUDOCODE
Gambar di atas adalah pseudo code untuk algortitam dari semaphore
Pertama kita punya structure yaitu value yang menunjukan hitungan/cacahan/count ke atas
dan kebawah, dan queue L yang merupakan list proses-proses agar kita bisa men-track proses-proses
mana yang sedang menunggu sehingga kita dapat membangunkannya (wake up) kemudian.
Fungsi wait() seperti yang dibahas sebelumnya : Bila value (nilai semaphore) lebih besar dari nol,
decrement value, bila tidak tambahkan proses ke list/antrian dan lakukan block pada proses tsb
sampai sampai seseorang membangunkannya.
Fungsi signal() bertujuan mengecek apakah list tidak kosong . Bila list (antrian) tidak kosong, hilangkan
proses P dari antrian L dan bangunkan proses P tsb, bila list kosong, increment value.
Wait() dan signal() adalah operasi pd critical section karena mereka sama sama megakses value dan
antrian. Jadi mereka harus dieksekusi secara atomik (satuan) satu sama lain karena itu ada operasi
yang sama dengan lock yaitu operasi blocking
BLOCKING SEMAPHORE
Tiap semaphore memiliki sebuah antrian proses/thread yang berkaitan.
3. o Bila wait() di call oleh sebuah thread :
Bila semaphore “available” (nilainya 1 atau lebih) maka thread akan diteruskan
(tetap berjalan)
Bila semaphore “unavailable” maka thread di block dan menunggu di antrian.
o Memanggil signal() akan membuka semaphore
Bila ada thread sedang menunggu di antrian, satu thread di unblock
Bila tidak ada thread di antrian, buat sebuah signal untuk diingat saat sebuah wait()
dicall dilakukan dengan meng-increment value semaphore
INISIALISASI SEMAPHORE
Bila kita inisialisasi semaphore ke 1 , apa artinya?artinya ada bendera semaphore berkibar (available)
o Thread pertama yang memanggil wait() dapat terus berjalan (running)
Karena thread pertama tersebut sudah memakai “hak berjalan/hak akses” maka
tanda bendera semaphore harus “diturunkan” (semaphore unavailable) Nilai
senaphore berubah dari 1 ke 0
o Bila ada thread kedua yang memanggil wait() maka akan diblock (karena tidak ada bendera
semaphore berkibar)
Thread kedua ini akan mengantri, menunggu giliran mendapat hak akses/hak
berjalan,
semaphore tetap bernilai 0
o Bila thread pertama sudah selesai “urusannya” maka ia akan memanggil signal()
Ternyata ada thread dua sedang ‘tidur’ di antrian. Thread dua dibangunkan karena
thread 1 sudah selesai ,
semaphore tetap bernilai 0 , tetap tidak boleh ada thread lain yg mengakses karena
sekarang ada thread 2 yang diberi hak akses
o Bila thread kedua sekarang sudah selesai urusannya dan memanggil signal()
Karena tidak ada lagi thread yang mengantri, bendera semaphore dikibarkan
nilai semaphore berubah dari 0 ke 1
Thread selanjutnya yang akan mengakses akan memanggil wait() dan langsung
boleh mengakses tanpa menunggu.
Bila kita lihat sistem semaphore itu berlaku seperti lock mutual exclusive (Mutex Lock)!
NILAI SEMAPHORE
Bagaimana bila nilai semaphore diinisialisasi ke 2?
o Maka ada dua thread yang boleh mengakses/berjalan pada saat yang sama.
o Kode inisialisasinya : sem_init(sem,2)
Jadi penggunaan nilai semaphore adalah untuk menunjukkan alokasi jumlah thread yang dapat
mengakses resource (shared buffer/ device) secara bersamaan
KUIS
1. Jelaskan Perbedaan Lock biasa dengan Semaphore
2. Gambarkan algoritma dari sinkronisasi menggunakan semaphore
REFERENSI