kanan. Akhirnya tidak terjadi kemajuan dalam kerja dua antrian tersebut. Misal ada proses A mempunyai resource X, proses B mempunyai resource Y. Kemudian kedua proses ini dijalankan
bersama, proses A memerlukan resource Y dan proses B memerlukan resource X, tetapi kedua proses tidak akan memberikan resource yang dimiliki sebelum proses dirinya sendiri selesai
dilakukan. Sehingga akan terjadi tunggu-menunggu.
2. Starvation. Starvation adalah kondisi yang biasanya terjadi setelah deadlock. Proses yang
kekurangan resource karena terjadi deadlock tidak akan pernah mendapat resource yang dibutuhkan sehingga mengalami starvation kelaparan. Namun, starvation juga bisa terjadi
tanpa deadlock. Hal ini ketika terdapat kesalahan dalam sistem sehingga terjadi ketimpangan dalam pembagian resouce. Satu proses selalu mendapat resource, sedangkan proses yang lain
tidak pernah mendapatkannya. Ilustrasi starvation tanpa deadlock di dunia nyata dapat dilihat di bawah ini. Pada gambar diatas, pada antrian kanan terjadi starvation karena resource jembatan
selalu dipakai oleh antrian kiri, dan antrian kanan tidak mendapatkan giliran.
17.8. Rangkuman
Dalam menjalankan fungsinya dalam sistem operasi, dibutuhkan interaksi antara beberapa proses yang berbeda. Interaksi tersebut bertujuan agar terjadi kesinambungan antar proses yang terjadi
sehingga sistem operasi dapat berjalan sebagaimana mestinya. Interaksi tersebut dapat melalui sistem berbagi memori atau dengan cara saling berkirim pesan. Terkadang, beberapa pesan yang
dikirim tidak dapat diterima seluruhnya oleh penerima dan menyebabkan informasi yang lain menjadi tidak valid, maka dibutuhkanlah sebuah mekanisme sinkronasi yang akan mengatur
penerimaan dan pengiriman pesan sehingga kesalahan penerimaan pesan dapat diperkecil. Pesan yang dikirim dapat ditampung dalam penyangga sebelum diterima oleh penerima.
Interaksi antar proses dapat juga terjadi antara proses yang memiliki sistem berbeda. Dalam interaksi tersebut dikenal sebutan client dan server yang memungkinkan sistem yang berbeda untuk
berinteraksi dengan menggunakan socket. Dalam interaksi tersebut dikenal juga RPC Remote Procedure Call yaitu metode yang memungkinkan sebuah sistem mengakses prosedur sistem lain
dalam komputer berbeda.
Dalam interaksi antar proses, terkadang suatu proses saling menunggu proses yang lain sebelum melanjutkan prosesnya, sehingga proses-proses tersebut saling menunggu tanpa akhir, hal ini
disebut deadlock. Jika deadlock terjadi dalam waktu lama, maka terjadilah starvation, yaitu suatu proses tidak mendapatkan resource yang dibutuhkan.
Rujukan
[Silberschatz2005] Avi Silberschatz, Peter Galvin, dan Grag Gagne. 2005. Operating Systems Concepts. Seventh Edition. John Wiley Sons.
[WEBFSF1991a] Free
Software Foundation.
1991. GNU
General Public
License –
http:gnui.vLSM.org licenses gpl.txt . Diakses 29 Mei 2006. [WEBWIKIA] Wikipedia. http:en.wikipedia.orgwikiClient_28computing29 . Diakses 24 Mei
2007. [WEBWIKIB] Wikipedia. http:en.wikipedia.orgwikiServer_28computing29 . Diakses 24 Mei
2007. [WEBWIKIC] Wikipedia. http:en.wikipedia.orgwikiClient_server . Diakses 24 Mei 2007.
122
Bab 18. Sinkronisasi
18.1. Pendahuluan
Sinkronisasi diperlukan untuk menghindari terjadinya ketidak-konsistenan data akibat adanya akses data secara konkuren. Proses-proses disebut konkuren jika proses-proses itu ada dan berjalan pada
waktu yang sama, proses-proses konkuren ini bisa bersifat independen atau bisa juga saling berinteraksi. Proses-proses konkuren yang saling berinteraksi memerlukan sinkronisasi agar
terkendali dan juga menghasilkan output yang benar.
18.2. Race Condition
Race condition adalah suatu kondisi dimana dua atau lebih proses mengakses shared memorysumber daya pada saat yang bersamaan dan hasil akhir dari data tersebut tergantung dari
proses mana yang terakhir selesai dieksekusi sehingga hasil akhirnya terkadang tidak sesuai dengan yang dikehendaki.
Contoh 18.1. Race Condition
1. int counter = 0;
2. Proses yang dilakukan oleh produsen
3. item nextProduced;
4. while 1 {
5. while counter == BUFFER_SIZE { ... do nothing ... }
6. buffer[in] = nextProduced;
7. in = in + 1 BUFFER_SIZE;
8. counter++;
9. }
10. Proses yang dilakukan oleh konsumen 11. item nextConsumed;
12. while 1 { 13.
while counter == 0 { ... do nothing ... }
14. nextConsumed = buffer[out] ;
15. out = out + 1 BUFFER_SIZE;
16. counter--;
17. } Pada program di atas, terlihat bahwa terdapat variabel counter yang diinisialisasi dengan nilai 0, dan
ditambah 1 setiap kali terjadi produksi serta dikurangi 1 setiap kali terjadi konsumsi. Pada bahasa mesin, baris kode
counter++ dan
counter-- diimplementasikan seperti di bawah ini:
Contoh 18.2. Race Condition dalam bahasa mesin
counter++ register1 = counter
register1 = register1 + 1 counter
= register1 counter--
register2 = counter register2 = register2 - 1
counter = register2
Jika perintah counter++
dan counter--
berusaha mengakses nilai counter secara konkuren, 123
maka nilai akhir dari counter bisa salah. Hal ini tidak berarti nilainya pasti salah, tapi ada kemungkinan untuk terjadi kesalahan. Contoh urutan eksekusi baris kode tersebut yang
mengakibatkan kesalahan pada nilai akhir counter:
Contoh 18.3. Program yang memperlihatkan Race Condition
2misalkan nilai awal counter adalah 2 1.produsen: register1 = counter
register1 = 2 2.produsen: register1 = register1 + 1 register1 = 3
3.konsumen: register2 = counter register2 = 2
4.konsumen: register2 = register2 - 1 register2 = 1 5.konsumen: counter
= register2 counter = 1
6.produsen: counter = register1
counter = 3 Status akhir dari counter seharusnya adalah 0, tapi kalau urutan pengeksekusian program berjalan
seperti di atas, maka hasil akhirnya menjadi 3. Perhatikan bahwa nilai akhir counter akan mengikuti eksekusi terakhir yang dilakukan oleh komputer. Pada program di atas, pilihannya bisa 1 atau 3.
Perhatikan bahwa nilai dari counter akan bergantung dari perintah terakhir yang dieksekusi. Oleh karena itu maka kita membutuhkan sinkronisasi yang merupakan suatu upaya yang dilakukan agar
proses-proses yang saling bekerjasama dieksekusi secara beraturan demi mencegah timbulnya suatu keadaan race condition.
Gambar 18.1. Ilustrasi program produsen dan konsumen
Kunci untuk mencegah masalah ini dan di situasi yang lain yang melibatkan memori bersama, berkas bersama, dan sumber daya lain yang digunakan secara bersama-sama adalah menemukan
beberapa jalan untuk mencegah lebih dari satu proses melakukan proses tulis dan baca kepada data yang sama pada saat yang sama. Dengan kata lain, kita membutuhkan mutual exclusion, sebuah
jalan yang menjamin jika sebuah proses sedang menggunakan variabel atau berkas yang digunakan bersama-sama, proses lain akan dikeluarkan dari pekerjaan yang sama.
Cara untuk menghindari race condition adalah kita harus dapat menjamin bahwa jika suatu proses sedang menjalankan critical section, maka proses lain tidak boleh masuk ke dalam critical section
tersebut. Critical section dijelaskan dibawah.
18.3. Critical Section
Critical section adalah segmen kode yang mengakses data yang digunakan proses secara bersama-sama yang dapat membawa proses itu ke bahaya race condition. Biasanya sebuah proses
sibuk melakukan perhitungan internal dan hal-hal lainnya tanpa ada bahaya yang menuju ke race condition pada sebagian besar waktu. Akan tetapi, biasanya setiap proses memiliki segmen kode
dimana proses itu dapat mengubah variabel, meng-update suatu tabel, menulis ke suatu file, dan lain-lainnya, yang dapat membawa proses itu ke bahaya race condition.
124