Deadlock
Harus berapa lama aku menunggumu ..
Aku menunggumu…, menunggu…, harus berapa lama..
- Noah - Menunggumu
Pendahuluan
Didalam sebuah sistem, bisa saja terjadi Deadlock.
Atau Kebuntuan.
Yaitu kondisi tidak ada lagi yang bisa dilakukan, karena beberapa proses saling menunggu satu sama lain.
Deadlock berawal dari kejadian saling tunggu-tungguan ..
Seperti lirik lagu Noah diatas.
Satu sama lain saling diam untuk terus menunggu sampai waktu yang tidak bisa di tentukan.
Dan menunggu itu itu menghabiskan waktu, dan menguras perhatian.
Jadi apa itu Deadlock ?
Deadlock ini terjadi ketika 2 orang yang saling mencinta, tapi tidak kunjung menikah karena saling menunggu persetujuan dari keluarganya.
Dan masing-masing keluarga tidak mau menyetujui kecuali pihak lain juga sudah setuju.
Haalah…
Sinetron sekali yaa.
Tapi benar.., mirip itu pemisalannya.
Ketika 2 thread saling terkoneksi satu sama lain.
Butuh satu sama lain.
Thread 1 butuh response/resource dari Thread 2.
Thread 2 juga butuh response/resource dari Thread 1 pada saat yang bersamaan.
Dan mereka saling menunggu agar kisah cintanya berlanjut.
Tiap saat akan mengecek apakah sudah ada keputusan atau tidak.
Dan satu sama lain tidak ada yang mau memutuskan.
Begitulah seterusnya, sehingga waktunya habis untuk mengecek.
Ok, secara seriusnya, bagaimana sih Deadlock itu ?
Baiklah..
Dari sisi teknis, maka Deadlock ini adalah :
beberapa thread/process terblokir atau tidak bisa lanjut, karena masing-masing nya sedang melock/mengunci sebuah resource dan juga sekaligus menunggu kesempatan untuk mengakses resource lain yang juga sedang dilock/dikunci oleh proses lainnya.
Ilustrasinya seperti yang kita ceritakan di awal artikel ini.
Oleh karena nya, kita bisa melihat bahwa ada kondisi sbb yang terjadi di kasus Deadlock ini, yaitu :
- kondisi dimana ada resource yang dipakai bersama.
- kondisi dimana resource ini cuma bisa digunakan oleh satu thread/proses pada satu saat.
- kondisi resource tersebut sedang dilock oleh satu thread, dan menunggu akses ke resource lain.
- kondisi menunggu resource yang bersifat circular/tunggu-tungguan.
Keempat kondisi diatas harus terjadi semuanya agar bisa dianggap Deadlock.
Persyaratan kondisi diatas terkenal sebagai Coffman conditions yaitu 4 syarat/kondisi yang harus dipenuhi agar terjadi Deadlock, yaitu :
1. Mutual Exclusion
Artinya agar deadlock terjadi, maka harus ada bagian code atau data yang dipakai bersama dan hanya boleh diakses oleh satu thread saja.
Istilahnya bagian code atau datanya pada satu saat hanya bisa dipakai/diupdate oleh satu thread saja.
Ini disebut Mutual Exclusion
Mutual Exclusion ini diperlukan biasanya untuk menghindari Race Condition yang menjadi biang pemicu inconsistency data terhadap data/sumber daya yang dipakai bersama (Critical Section).
Kalau di Java, kita lihat penggunaan Mutual Exclusion ini biasanya menggunakan keyword :
- synchronized
- reentrantLock
- semaphore dengan jumlah thread yang diizinkan cuma 1 saja.
- object monitor
2. Hold and Wait Condition
Artinya agar deadlock terjadi, maka selain Mutual Exclusion diatas, maka harus ada kondisi :
- sebuah proses/thread sedang hold/memegang sebuah resource, dan juga meminta resource lain yang sedang di hold oleh proses/thread lain.
Inilah yang kita misalkan dengan kasus 2 orang yang saling mencinta diatas, diawal artikel ini.
3. No Preemption
Artinya yang bisa melepaskan Lock terhadap sebuah resource, hanyalah si process/thread itu secara voluntarily.
Jadi tidak dipaksa oleh aksi Preemptive dari pihak lain seperti operating system.
4. Circular Wait
Kejadian Deadlock ini juga akan terjadi kalau saja tiga kondisi diatas, ditambah bahwa sebuah proses/thread menunggu resource lain yang dilock oleh proses lain, dan begitu pula sebaliknya.
Saling tunggu-tungguan.
Lalu Deadlock ini efeknya apa ?
Misalkan 2 Thread yang saling deadlock.
Maka efeknya Thread 1 dan Thread 2 jadi ngehang, dan proses mereka masing-masing tidak berlanjut.
Efeknya bagi manusianya ketika menggunakan aplikasi yang memakai 2 thread diatas adalah tidak bisa melakukan pekerjaannya.
Abis itu kesal..
Abis itu stress..
Abis itu menyadari kalau ada yang salah..
Kemudian kill prosess yang ngehang tersebut..
Dan kejadian tersebut berulang kembali..
Lalu bahaya tah ?
Iya tentu saja.
Ketika dihadapkan pada kasus Deadlock ini, maka akan ada pilihan :
- Biarkan saja, ntar juga kalau nggak bisa jalan keduanya, akan secara manual akan di kill oleh pengguna.
- Deteksi deadlock tersebut, dan informasikan ke pengguna.
- Buat scheduler untuk bisa mengkill prosesnya
Itu… lanjut di next artikel..
Tentang Bagaimana mencegah Deadlock ?