Pencegahan Deadlock
Pendahuluan
Pendahuluan mengenai Deadlock bisa dilihat di sini
Pendahuluan
Didalam sebuah sistem, bisa saja terjadi Deadlock.
Yang disebabkan oleh 4 kondisi yang terjadi bersamaan, yaitu :
- Mutual Exclusion.
- Hold and Wait Condition.
- No Preemption and Voluntary Lock Release.
- Circular Waiting
Penjelasan untuk masing-masing kondisi diatas bisa dilihat di Deadlock
Lalu bagaimana agar bisa mencegah Deadlock ?
Secara sederhana tentunya dengan membuat salah satu dari 4 kondisi diatas tidak terpenuhi.
Yaitu :
1. Mutual Exclusion
Mutual Exclusion artinya ada bagian code atau data yang dipakai bersama dan hanya boleh diakses oleh satu thread/process saja.
Bagian code atau resource ini diset Mutual Exlusion karena sumber daya nya yang terbatas atau memang harus cuma satu agar konsistensi sistem terjaga.
Misalnya contohnya table di database, yang digunakan untuk mengatur flow process.
Atau misalnya yang sering dicontohkan adalah Printer yang digunakan bersama oleh proses/thread.
Naah..Untuk mencegah Deadlock, maka bagian ini mesti diset agar tidak di-lock, dan bisa diakses oleh semua thread/process.
Tapi..tunggu..
Ini sepertinya tidak mungkin..
Karena tujuan dari Mutual Exlusion itu adalah untuk menjaga barang yang satu itu agar tidak sembarangan dan tidak semua process/thread bisa mengaksesnya pada satu saat.
Kalaulah misalnya bagian itu tidak di lock, maka akan banyak terjadi ketidak konsistenan data dan proses.
…..
Atau bisa memakai teknik Spooling
Yang biasanya kita lihat di Spooling printer.
Yang sebenarnya adalah antrian untuk mengakses sumber daya yang terbatas.
Yang memungkinkan sebuah sumber daya diakses hanya oleh satu thread/process pada satu saat.
Tapi.., tunggu..
Mutual Exlusion sebenarnya tidak hanya peduli dengan akses, tetapi juga dengan State, yaitu status terakhir dari bagian code atau data tersebut.
Bayangkan sebuah sistem dengan spooling, yang isinya ada beberapa item.
Masing-masing item, merasa bahwa dia akan mengubah data sesuai dengan status yang diketahui sebelum masuk ke spooler.
Padahal ketika item lain dijalankan, bisa saja statusnya berubah, dan tidak cocok lagi dengan status yang dipunyai sebelumnya.
Jadi secara praktis, mencegah kondisi Mutual Exlusion ini susah dicapai.
2. Hold and Wait Condition
Artinya sebuah proses/thread sedang hold/memegang sebuah resource, dan juga meminta resource lain yang sedang di hold oleh proses/thread lain.
Tetapi tidak selalu harus circular atau tidak selalu harus saling mengunci.
Pencegahannya tentu saja adalah dengan :
- Mengetahui dari awal proses/thread mana saja yang akan melock sebuah resource.
- Mengetahui dari awal proses/thread mana saja yang akan waiting sebuah resource.
- Mengassign proses/thread untuk resource yang diperlukan, sehingga proses/thread tersebut tidak menunggu, atau terlalu lama memegang resource.
Tapi ini juga sepertinya tidak mungkin untuk mengatasi Deadlock
Resource di dalam sistem komputer berlangsung on-demand, yaitu dibutuhkan pada saat tertentu.
Tidak terprediksi dan dialokasikan secara dinamis oleh Operating System.
Dan pada satu saat, resource bisa diminta oleh banyak proses/thread secara bersamaan.
Oleh karenanya hal ini juga sepertinya tidak praktis untuk mencegah terjadinya Deadlock.
Sebenarnya ada algorithma yang mencoba untuk memecahkan masalah tersebut seperti Banker’s Algorithm, akan tetapi secara praktikal agak sulit untuk diimplementasikan dengan perkembangan dan arsitektur sistem komputer saat ini.
Atau bisa juga memanfaatkan RAG (Resource Allocation Graph) yang disediakan oleh Sistem Operasi.
3. No Preemption
Artinya yang bisa melepaskan Lock terhadap sebuah resource, hanyalah si process/thread itu secara voluntarily/sukarela.
Jadi tidak dipaksa oleh aksi Preemptive dari pihak lain seperti operating system.
Untuk mencegah hal ini terjadi, biasanya caranya adalah :
- ada proses yang akan memonitor thread/process yang melakukan locking lama terhadap sebuah proses, kemudian melakukan proses kill.
- memberi urutan prioritas terhadap process/thread yang berebut resource tersebut. Sehingga proses/thread yang memiliki prioritas yang lebih tinggi akan bisa mengambil paksa resource yang sedang di lock oleh proses lain.
Tetapi cara diatas juga bisa membuat sistem yang tidak stabil dan butuh konfigurasi yang cukup hati-hati ketika mengimplementasikannya.
4. Circular Wait
Kejadian Circular Wait ini adalah sebuah proses/thread menunggu resource lain yang dilock oleh proses lain, dan begitu pula sebaliknya.
Saling tunggu-tungguan.
Saling mengunci tepatnya.
Untuk mencegahnya, maka biasanya dilakukan penomoran untuk resource nya.
Ingat ya, untuk resource nya, bukan untuk process/thread nya seperti yang kita lakukan untuk kasus No Preemption.
Dengan adanya penomoran resource ini, maka request hanya bisa dilakukan terhadap resource yang nomornya lebih tinggi dibandingkan resource yang sedang di lock.
Dengan cara ini, maka tidak akan ada Circular Wait, karena tidak mungkin misalnya thread ke 2 yang sedang memegang resource 2, akan meminta resource 1.
Karena resource 1 , penomorannya kecil dari resource 2.
Sementara thread 1, tetap bisa meminta resource 2, karena resource 2 lebih besar penomorannya dari resource 1.
Cara ini yang mungkin bisa diimplementasikan dengan lebih terstruktur.
Walaupun tidaklah semudah itu Fergussso….
Itu… lanjut di next artikel..