A. Pengertian
Semaphore
Semaphore
adalah mekanisme efektif yang digunakan baik pada sistem uniprosesor
maupun
sistem multiprosesor. Semaphore pada dasarnya adalah counter yang
diasosiasikan
dengan struktur data. Semaphore diperiksa oleh semua kernel thread
sebelum
kernel thread tersebut mencoba untuk mengakses struktur data. Setiap
semaphore
dapat dipandang sebagai objek yang terdiri atas Variable integer List proses
yang sedang menunggu (waiting) Dua metode atomik : down atau up
Metode
down mengurangi nilai dari semaphore. Jika nilai yang baru kurang dari 0,
metode
ini menambahkan proses yang sedang berjalan ke list semaphore dan mem-
block
proses tersebut. Metode up menambah nilai dari semaphore dan jika nilai
barunya
sama dengan atau lebih dari 0, mengaktivasi kembali proses dalam
semaphore
list.
Tiap
stuktur data yang diproteksi memiliki semaphorenya masing-masing yang
diinisiasi
dari 1. Ketika sebuah kernel control path akan mengakses struktrur data
tersebut,
control path mengeksekusi metode down() pada semaphore bersangkutan.
Jika
nilai baru semaphore tidak negatif, akses ke data dapat dilakukan. Sebaliknya
jika
nilai baru negatif, proses yang mengeksekusi kernel control path ditambahkan ke
dalam
list semaphore dan di-block. Ketika proses lain mengeksekusi metode up()
pada
semaphore tersebut, salah satu dari proses dalam list diperbolehkan untuk
dilanjutkan.
Semaphore
adalah salah satu cara menangani critical section. Semaphore S merupakan
variabel
bertipe integer yang diakses dengan 2 standar operasi atomic, yaitu wait dan
signal.
Operasi-operasi ini diwakili dengan P (wait) dan V(signal), sebagai berikut :
Wait(S)
: while S 0 do no)op;
S:=S
– 1;
Signal
: S:=S + 1;
Misalkan
ada 2 proses yang sedang berjalan secara konkure, yaitu P1 denga pernyataan
S1
dan P2 dengan pernyataan S2. andaikan kita mengharapkan S2 baru akan dijalankan
hanya
setelah S1 selesai. Hal ini dapat dilakukan dengan menggunakan bantuan
semaphore
synch (dengan nilai awal = 0) yang akan dishare oleh kedua proses.
Untuk
Proses P1 :
S1 ;
Signal(synch);
Untuk
proses P2:
Wait(synch);
S2;
Karena
nilai awal untuk synch adalah nol, maka P2 akan mengeksekusi S2 hanya setelah
P1
mengerjakan signal(synch) setelah S1
Salah
satu kerugian dari penggunaan semaphore diatas adalah adanya busy waiting.
Apabila
suatu proses menempati critical, dan ada proses lain ingin masuk critical
section,
maka
kan terjadi iterasi secara terus-menerus pada entry-section. Hal ini akan
menimbulkan
masalah pada sistem yang menggunakan konsep multiprogramming.
Untuk
menghindari busy waiting, dilakukan modifikasi pada operasi wait dan signal.
Jika
suatu
proses sedang mengeksekusi operasi wait, maka nilai semaphore menjadi tidak
positif.
Pada saat ini proses akan memblok dirinya sendiri (blok) dan ditempatkan pada
waiting
queue.
Proses
yang sedang diblok akan menunggu hingga semaphore S direstart, yaitu pada saat
beberapa
proses yang lain mengeksekusi operasi signal. Suatu proses akan direstart
dengan
operasi wakeup, yang akan mengubah proses dari keadaan waiting ke ready.
Beberapa
Prinsip Semaphore :
1.
Dua proses dapat saling berkaitan atau menentukan proses yang lain dengan
memanfaatkan signal-sinal
2.
Sebuah proses akan dihentikan oleh proses yang lain, ketika mendapatkan signal
tertentu. Suatu proses akan menunggu diproses setelah nilai integer menjadi 0.
selanjutnya sinyal akan dilakukan increamen dengan penambahan 1
3.
Semaphore merupakan variable bertipe integer yang diakses oleh 2 operasi atomik
standar, yaitu wait dan signal.
4.
terdapat dua operasi terhadap semaphore yaitu Down dan Up. Nama aslinya : P dan
V
B. MACAM-MACAM
SEMAPHORE
Ada 2
macam semafor yang cukup umum, yaitu:
1.
Binary semaphore
2.
Counting semaphore
Binary
semaphore adalah semafor yang bernilai hanya 1 dan 0. Sedangkan Counting
semaphore adalah semafor yang dapat bernilai 1 dan 0 dan nilai integer yang
lainnya.
Banyak
sistem operasi yang hanya mengimplementasi binary semaphore sebagai primitif,
sedangkan counting semaphore dibuat dengan memakai primitif ini. Untuk lebih
rinci mengenai cara pembuatan counting semaphore dapat dilihat pada bagian
berikutnya.
Perlu
diketahui di sini bahwa, ada beberapa jenis dari counting semaphore. Salah satu
jenisnya adalah semafor yang tidak mencapai nilai negatif (seperti yang
dicontohkan pada bagian sebelumnya). Jenis yang lain adalah semaphore yang
dapat mencapai nilai negatif.
Solusi
Pembuatan Counting Semaphore dari Binary Semaphore.
Pembuatan
counting semaphore banyak dilakukan para programmer untuk memenuhi alat
sinkronisasi yang sesuai dengannya. Seperti yang telah dibahas di atas, bahwa
counting semaphore ada beberapa macam. Pada bagian ini, akan dibahas counting
semaphore yang memperbolehkan harga negatif.
Listing
program di bawah ini diambil dari buku Silberschatz.
00
binary-semaphore S1,S2;
01
int C;
Subrutin
waitC dapat dilihat di bawah ini:
02
wait (S1);
03
C--;
04 if
( C < 0 ) { 05 signal (S1); 06 wait (S2); 07 } 08 signal (S1); subrutin
signalC dapat dilihat di bawah ini: 09 wait (S1); 10 C++; 11 if (C <= 0) 12
signal (S2); 13 else 14 signal (S1); Kita memerlukan dua binary semaphore pada
kasus ini, maka pada baris 00 didefinisikan dua binary semaphore. Baris 01
mendefinisikan nilai dari semafor tersebut. Perlu diketahui di sini bahwa waitC
adalah wait untuk counting semaphore, sedangkan wait adalah untuk binary
semaphore. Jika diperhatikan pada subrutin waitC dan signalC di awal dan akhir
diberikan pasangan wait dan signal dari binary semaphore. Fungsi dari binary
semaphore yang ini adalah untuk menjamin critical section (instruksi wait dan
signal dari semafor bersifat atomic, maka begitu pula untuk waitC dan signalC,
jadi kegunaan lain semafor adalah untuk membuat suatu subrutin bersifat
atomic). Binary semaphore S2 sendiri digunakan sebagai tempat menunggu giliran
proses-proses. Proses-proses tersebut menunggu dengan cara spinlock atau
non-spinlock tergantung dari implementasi binary semaphore yang ada.
zPerhatikan baris 03 dan 04. Baris ini berbeda dengan apa yang sudah dijabarkan
pada bagian sebelumnya. Karena baris ini maka memungkinkan nilai semafor untuk
menjadi negatif. Lalu apa artinya bagi kita? Ternyata nilai negatif mengandung
informasi tambahan yang cukup berarti bagi kita yaitu bila nilai semafor
negatif, maka absolut dari nilai tersebut menunjukkan banyaknya proses yang
sedang menunggu atau wait. Jadi arti baris 11 menyatakan bahwa bila ada proses
yang menunggu maka bangunkan mereka semua untuk berkompetisi. Mengapa pada
baris 05 dilakukan signal untuk S1? Alasannya karena seperti yang telah kita
ketahui bahwa semaphore menjamin ketiga sifat dari critical section. Tetapi
adalah tidak relevan bila pada saat waktu menunggu, waitC masih mempertahankan
mutual exclusivenya. Bila hal ini terjadi, proses lain tidak akan dapat masuk,
sedangkan proses yang berada di dalam menunggu proses yang lain untuk signal.
Dengan kata lain deadlock terjadi. Jadi, baris 05 perlu dilakukan untuk
menghilangkan sifat mutual exclusive pada saat suatu proses menunggu. Pada
baris 12 hanya menyatakan signal untuk S2 saja. Hal ini bukanlah merupakan
suatu masalah, karena jika signal S2 dipanggil, maka pasti ada proses yang
menunggu akan masuk dan meneruskan ke instruksi 07 kemudian ke instruksi 08 di
mana proses ini akan memanggil signal S1 yang akan mewakili kebutuhan di baris
12.
C.FUNGSI
SEMAPHORE
a.
Menyelesaikan Masalah Critical Section. Critical section adalah suatu bagian
yang berisi sejumlah variabel yang akan dishare (dipengaruhi dan mempengaruhi )
proses yang lain.
Secara
umum, penyelesaian critical section harus memenuhi 3 syarat :
1.
Mutual exclusion. Jika suatu proses sedang mengerjakan critical section, maka
tidak boleh ada proses lain yang masuk (mengerjakan) critical section tersebut.
2. Progress. Jika tidak ada suatu
proses yang megerjakan critical section, dan ada beberapa proses yag akan masuk
ke critical section, maka hanya proses-proses yang sedang berada pada entry-section
saja yang boleh berkompetisi untuk mengerjakan critical section.
3.
Bounded waiting. Besarnya waktu tunggu dari suatu proses yang akan memasuki
critical section sejak proses itu meminta ijin untuk mengerjakan critical
section, hingga permintaan itu dipenuhi. Untuk setiap proses yang akan masuk
critical section harus meminta ijin terlebih dahulu, dan proses yang mendapat
izinlah yang akan masuk ke critical section. Entry-section adalah daerah tempat
proses menunggu untuk memasuki critical section. Sedangkan Exit-section adalah
daerah dimana suatu proses baru saja keluar dari critical section.
b. Semafor Menyelesaikan Masalah Sinkronisasi
antar Proses Kadangkala kita ingin membuat suatu proses untuk menunggu proses
yang lain untuk menjalankan suatu perintah. Isu yang ada di sini adalah
bagaimana caranya suatu proses mengetahui bahwa proses yang lain telah
menyelesaikan instruksi tertentu. Oleh karena itu digunakanlah semafor karena
semafor adalah solusi yang cukup baik dan mudah untuk mengatasi hal tersebut.
Nilai semaphore diset menjadi 0 Proses 1 Proses 2 56 print "satu" 17
wait(semaphoreVar) 57 signal(semaphoreVar) 18 print "dua" siapapun
yang berjalan lebih cepat, maka keluarannya pasti "satu" kemudian
diikuti oleh "dua". Hal ini disebabkan karena jika proses 2 berjalan
terlebih dahulu, maka proses tersebut akan menunggu (nilai semafor = 0) sampai
proses 1 memanggil signal. Sebaliknya jika proses 1 berjalan terlebih dahulu,
maka proses tersebut akan memanggil signal untuk memberikan jalan terlebih
dahulu kepada proses 2.
D. IMPLEMENTASI
SEMAPHORE
1. Windows – Fungsi yg dipakai adalah
CreateSemaphore – Biasanya digunakan untuk membatasi jumlah thread yang memakai
suatu resource secara bersamaan
2. Java – Semafor di Java™ bersifat transparan
oleh programmer
3.
Java™ menyembunyikan Semafor dibalik konsep monitor
4.
Reserved Word yang dipakai Java™ adalah synchronized
E. KELEMAHAN
SEMAPHORE
•
Termasuk Low Level
•
Kesulitan dalam pemeliharaannya, karena tersebar dalam seluruh program.
•
Menghapus wait => dapat terjadi nonmutual exclusion.
• Menghapus
signal => dapat terjadi deadlock
•
Error yang terjadi sulit untuk dideteksi
•
Lebih baik menggunakan high level construct
0 comments:
Post a Comment