This page needs JavaScript activated to work correctly !

This page will be redirect in 3 second !

Semafor & Studi Kasus - Networking | IDRaya.com

Semafor & Studi Kasus

Triawan NETWORKING 10/10/2020 0 Discuss 134 Views

Semafor dapat digunakan sebagai alat atau perangkat untuk menyelesaikan masalah sinkronisasi secara umum. Konsep semafor (semaphore) diperkenalkan petama kali oleh Edsger Djikstra pada tahun 1960-an, dalam kehidupan nyata, semafor adalah sistem sinyal yang digunakan untuk berkomunikasi secara visual, contoh dalam kegiatan pramuka semafor menggunakan bendera untuk mengirim atau menerima berita. Sedangkan dalam hal ini semafor adalah sebuah variabel integer yang digunakan untuk pensinyalan (penanda) antara proses-proses dan hanya dapat diakses melalui tiga operasi yang bersifat atomik, yaitu initialize, increment dan decrement. Operasi increment dapat mengakibatkan terjadinya pemblokiran proses, sebaliknya operasi decrement dapat mengakibatkan membuka pemblokiran proses. Operasi semafor ini disebut juga dengan istilah counting atau general semafor.

Permasalahan Bounded Buffer

Sebelum membahas lebih jahu mengenai studi kasus producer consumer, terlebih dahulu kita harus mengetahui permasalah pada bounded buffer itu sendiri yang merupakan struktur data untuk digunakan sebagai tempat penampungan sementara (buffer) dari suatu nilai tertenu, dan memiliki kapasitas yang terbatas (bounded). Kemudian dari permasalahan bounded-buffer ini dapat menerangkan sinkronisasi antar berbagai proses yang berjalan secara konkuren dalam mengakses share resource, dalam hal ini mengakses data yang sama. Sehingga studi kasus producer consumer dapat menerangkan pemecahan permasalahan ini, dan studi kasus ini juga disebut sebagai finite-buffer yang merupakan contoh klasik dari permasalahan sinkronisasi.

Bounded Buffer Gambar Bounded/Finite Buffer.

Sebagai permisalan kita memiliki buffer melingkar dengan dua petunjuk (pointer) yaitu: pointer masuk (in) menunjukkan posisi tersedianya tempat yang kosong (tidak ada data/empty) berikutnya untuk menyimpan data, dan kemudian pointer keluar (out) menunjukkan posisi tersedianya tempat yang penuh (terdapat data/full) berikutnya untuk diambil datanya. Pada gambar diagram diatas dapat dianggap terdapat dua proses atau thread baik sebagai produser yang menyimpan (deposit) satu item data ke dalam tempat (buffer) yang kosong sesuai dengan pointer in dan konsumer mengambil satu item data sesuai dengan pointer out. Pada gambar diatas satu item data yaitu berupa lingkaran berwarna merah.

Penerapan Semafor Pada Producer Consumer

Proses kooperatif adalah proses yang saling mempengaruhi satu sama lain, karna saling menggunakan sumber daya yang sama seperti malalui pertukran pesan. Sehingga agar menghindari inkonsisten data akibat pengaksesan data yang merupakan sumber daya bersama yang dilakukan secara konkuren maka diperlukan sinkronisasi.

Semafor Producer Consumer Case Gambar Semafor Producer Consumer Case.

Studi kasus ilustrasi proses producer consumer dapat menggambarkan penggunaan sinkronisasi semafor disertai bounded buffer, yaitu produser menaruh data ke dalam buffer untuk selanjutnya diambil oleh konsumer. Dari studi kasus ini muncul permasalahan yaitu dapat terjadinya race condition dalam mengakses share resource yakni buffer sebagai cricital section, karna diaskses secara konkuren. Sehingga proses-proses ini harus dilindungi dengan cara berikut.

  1. Pada satu waktu hanya satu proses saja yang dapat memasuki critical section, dengan demikain buffer hanya dapat diakses oleh produser saja atau konsumer.
  2. Tidak memperbolehkan produser untuk menyimpan/menaruh data, jika buffer telah penuh, dan tidak memperbolehkan konsumer mengambil data, jika buffer masih kosong.
  3. Sebaliknya jika buffer tidak penuh maka produser dapat menyimpan data, kemudian sebagai hasilnya konsumer diizinkan untuk mengambil data. Demikian pula setelah konsumer menggambil data maka buffer akan kosong, sehingga produser harus diizinkan untuk mengisi/menyimpan datanya ke dalam buffer.

Observasi dari gambar diagram proses producer consumer diatas dapat kita ketahui bahwa.

  1. Produser harus menunggu sampai buffer tidak penuh, kemudian diperbolehkan menyimpan datanya, dan selanjutnya memberi tahu konsumer bahwa buffer tidak kosong.
  2. Sebaliknya konsumer menunggu sampai buffer tidak kosong, kemudian diperbolehkan mengambil data, dan selanjutnya memberi tahu producer bahwa buffer tidak penuh.

Sebelum proses produser atau konsumer ini dapat memiliki akses ke buffer, maka pertama kali buffer harus dikunci, setelah selesai digunakan baik oleh produser atau konsumer, maka kunci buffer tersebut harus dibuka. Singkatnya untuk melakukan hal ini kita memerlukan semafor untuk memblokir produser saat buffer penuh, juga memblokir konsumer saat buffer kosong, serta memerlukan semafor biner yang disebut sebagai mutex untuk menjamin hanya ada satu proses baik produser atau konsumer yang dapat mengakses share resource dalam hal ini adalah buffer.

Sebagai catatan, signal/tanda semafor pertama kali dilakukan oleh konsumer ketika buffer tidak penuh, dan selanjutnya dilakukan oleh produser ketika buffer tidak kosong.


/* program boundedbuffer */
const int sizeofbuffer = 2; /* buffer size */
semaphore s = 1, n = 0, e = sizeofbuffer;
    
/* solusi buffer produser */
void producer() {
	while(true) {
		produce(); /* proses rekursif produser */
		semWait(e); /* tunggu hingga ada slot buffer yang kosong (empty) > 0,  atau paling sedikit 1 slot kosong dan kurangi */ 
		semWait(s); /* kunci buffer agar konsumer tidak dapat masuk (mutex lock) */
		append(); /* produksi item data di slot ini */
		semSignal(s); /* buka kunci buffer agar konsumer dapat masuk (mutex unlock) */ 
		semSignal(n); /* beritahu konsumer bahwa buffer ada isinya/increment full */
	}
}

/* solusi buffer konsumer*/
void consumer() {
	while(true) {
		semWait(n); /* tunggu hingga ada slot buffer yang penuh (full) > 0,  atau paling sedikit 1 slot penuh dan kurangi */ 
		semWait(s); /* kunci buffer agar produser tidak dapat masuk (mutex lock) */
		take(); /* konsumsi item data di slot ini */
		semSignal(s); /* buka kunci buffer agar produser dapat masuk (mutex unlock) */ 
		semSignal(e); /* beritahu produser bahwa slot buffer ada yang kosong/increment empty */
		consume(); /* proses rekursif konsumer */
	}
}

/* Blok kode utama yang akan dijalankan saat program dieksekusi */
void main() {
	perbegin(producer, consumer);
}

Program Producer Consumer Bounded Buffer

Terlihat program dari permasalahan studi kasus producer consumer yang ditangani oleh perangkat sinkroniasi semafor, berikut beberapa penjelasannya.

  1. Variable sizeofbuffer – sebagai bounded buffer memiliki kapasitas terbatas yaitu sebanyak n, permisalkan nilai n adalah 2 maka dapat dianalogikakan sebagai kapasitas penampung antrian. Serta nilai variabel ini digunakan oleh semafor e sebagai nilai inisialisasi awal untuk melacak/mengetahui jumlah ruang kosong pada buffer.
  2. Penggunaan Mutex – merupakan binari semafor yang dapat bernilai 1 atau 0, untuk memastikan buffer hanya dapat diakses oleh satu proses saja (produser atau konsumer). Jika mutex bernilai 0, maka satu proses sedang mengakses buffer dan sebaliknya jika bernilai 1, maka sedang tidak diakses oleh proses manapun. Dalam kasus ini disimbolkan dengan semafor s, dan nilai inisialisai awal hanya diperbolehkan bernilai 0 atau 1.
  3. Penggunaan in dan out – produser dapat membuat item dan menyimpannya di buffer, dan nilai index in akan bertambah di buffer. Sebaliknya pada konsumer ketika mengambil item di buffer, dan nilai index out akan berkurang di buffer, tetapi konsumer harus dapat memastikan bahwa ia tidak mencoba membaca buffer yang kosong, dengan cara memastikan bahwa produser selangkah lebih maju darinya sebelum mengambil tindakan lebih lanjut (proceeding) dan hal ini direpresentasikan dengan nilai kondisi in > out. Untuk mempermudah pelacakan jumlah item baik yang masuk (in) atau yang keluar (out) didalam buffer, kita menggunakan semafor n.

Berikut deskripsi singkat dari berbagai prosedur program producer consumer diatas untuk memudahkan proses tracing/penelusuran.

Prosedur semWait();
  1. Akan mengurangi nilai variabel semafor.
  2. Jika nilai variabel negatif/ kurang dari 0 maka proses yang mengeksekusi prosedur semWait() akan di block dan dimasukkan kedalam antrian.
  3. Jika nilai variabel >= 0 maka proses tersebut akan dieksekusi atau dilayani.
Prosedur semSignal();
  1. Akan menambahkan nilai variabel semafor.
  2. Jika nilai variable <= 0 maka proses yang diblok oleh prosedur semWait() akan dibebaskan.

Referensi

  1. Operating Systems: Internals and Design Principles (8th Edition), William Stallings, 2014.
  2. Operating System Concepts (9th Edition in Chinese) by Abraham Silberschatz et al.
  3. The Linux Programming Interface: A Linux and UNIX System Programming Handbook, Michael Kerrisk.

Agus Triawan/Triawan

 matriawan@gmail.com

Triawan is just an ordinary person, founder idraya[dot]com who just a little bit knows also likes try and error about devices, networks and programming/applications to solve challenges related to information technology.

If there is question, please discuss below. Very welcome and expected to provide corrections, criticisms, and suggestions.


We'll not share/display your email.
Example: Say <b>Hello</b> &lt;?php echo 'World'; ?&gt;
Output: Say Hello <?php echo 'World'; ?>
Words can come true for you, so be wise in speaking.

Be the first :D