Metode dalam sinkronisasi
Dikenal tiga alternatif dalam menyediakan sinkronisasi task, yaitu:
- Semaphores
- Monitors
- Message Passing
Semaphores
Semaphore dimanfaatkan oleh Dijkstra (1965) dalam upaya menyediakan competition synchronization melalui mutually exclusive access pada shared data structures. Berikut beberapa karakteristik dari semaphore:
- Semaphore adalah suatu struktur data yang terdiri dari sebuah counter dan antrian (queue) untuk menyimpan task descriptors
- Task descriptor adalah suatu struktur data yang menyimpan informasi yang berkaitan dengan execution state dari suatu task
- Semaphores dapat juga digunakan untuk mengimplementasi guards, cara untuk memungkinkan suatu guarded code yang mengakses shared data structures, dieksekusi hanya jika suatu kondisi terpenuhi
- Semaphores hanya mempunyai dua operasi, wait dan release (asalnya disebut P and V oleh Dijkstra)
- Semaphores dapat digunakan untuk menyediakan competition synchronization maupun cooperation synchronization
Cooperation Synchronization with Semaphores
Berikut ini adalah contoh penggunaan semaphore untuk shared buffer pada kasus producer-consumer problem:
• Buffer diimplementasi sebagai ADT (Abstract Data Type) dengan operasi DEPOSIT dan FETCH sebagai satu satunya cara untuk mengakses buffer
• Dua buah semaphores digunakan untuk cooperation, yaitu : emptyspots and fullspots
• Semaphore counters digunakan untuk menyimpan informasi tentang banyaknya emptyspots dan fullspots di dalam buffer
• DEPOSIT diawali oleh pengecekan emptyspots untuk mengetahui apakah ada slot kosong di dalam buffer
• Jika ada, maka nilai counter dari emptyspots dikurangi (decremented) dan penyisipan ke dalam buffer dilakukan
• Jika tidak, maka task pemanggil (caller) ditempatkan ke dalam antrian (queue) untuk mendapatkan emptyspots
• Jika DEPOSIT selesai dijalankan, maka counter untuk fullspots harus ditambah (incremented)
• FETCH diawali oleh pengecekan fullspots untuk mengetahui jika di dalam buffer terdapat value
- Jika ada fullspot, maka counter untuk fullspots dikurangi (decremented) dan nilai yang tersimpan dalam buffer dihilangkan (removed)
- Jika tidak ada values di dalam buffer, maka task pemanggil (caller) harus ditempatkan pada antrian (queue) untuk fullspots
- Jika eksekusi FETCH selesai, counter untuk emptyspots harus ditambah (incremented).
- Operasi FETCH dan DEPOSIT berjalan menggunakan semaphore yang mempunyai dua operasi yaitu wait and release
Semaphores: Wait and Release Operations
wait(aSemaphore)
if aSemaphore’s counter > 0 then
decrement aSemaphore’s counterelse
put the caller in aSemaphore’s queueend
attempt to transfer control to a ready task
-- if the task ready queue is empty,
-- deadlock occurs
release(aSemaphore)
if aSemaphore’s queue is empty then
increment aSemaphore’s counterelse
put the calling task in the task ready queueend
transfer control to a task from aSemaphore’s queue
Producer and Consumer Tasks
semaphore fullspots, emptyspots;
fullstops.count = 0;
emptyspots.count = BUFLEN;
task producer;
loopend producer;
-- produce VALUE –-
wait (emptyspots); {wait for space}
DEPOSIT(VALUE);
release(fullspots); {increase filled}
end loop;
task consumer;
loopend consumer;
wait (fullspots);{wait till not empty}}
FETCH(VALUE);
release(emptyspots); {increase empty}
-- consume VALUE –-
end loop;
Evaluasi pada Semaphores
- Kesalahan dalam penggunaan semaphores dapat menyebabkan gagalnya cooperation synchronization, misalnya buffer menjadi overflow jika wait dari fullspots tertinggal dalam penulisannya
- Kesalahan dalam penggunaan semaphores dapat menyebabkan gagalnya competition synchronization, misalnya program mengalami deadlock jika release dari access tertinggal dalam penulisannya
Comments
Post a Comment