SISTEM OPERASI
DEADLOCK
Oleh :
1. Pendahuluan
Deadlock adalah sebuah kebutuhan atau keadaan dimana 2 atau lebih
proses saling menunggu meminta resources untuk waktu yang tidak terbatas
lamanya. Analoginya seperti pada kondisi jalan raya dimana terjadi kemacetan
parah. Deadlock adalah efek samping dari sinkronisasi, dimana satu variabel
digunakan oleh 2 proses.
Kejadian Deadlock selalu tidak lepas dari sumber daya, bahwa hampir
seluruhnya merupakan masalah sumber daya yang digunakan bersama-sama. Oleh
karena itu, kita juga perlu tahu tentang jenis sumber daya, yaitu: sumber daya
dapat digunakan lagi berulang-ulang dan sumber daya yang dapat digunakan dan
habis dipakai atau dapat dikatakan sumber daya sekali pakai. Sumber daya ini
tidak habis dipakai oleh proses manapun.Tetapi setelah proses berakhir, sumber
daya ini dikembalikan untuk dipakai oleh proses lain yang sebelumnya tidak
kebagian sumber daya ini. Sederhananya ialah pada gambar berikut ini merupakan
contoh deadlock di jembatan.
Pada gambar diatas, yang berada di sebelah kiri jembatan tidak dapat
melaju sebab terjadi Deadlock di tengah jembatan (bagian yang dilingkari).
Contoh lain ialah di persimpangan jalan berikut ini:
Gambar.2. Contoh Deadlock di Persimpangan Jalan
Dalam kasus ini setiap mobil bergerak sesuai nomor yang ditentukan,
tetapi tanpa pengaturan yang benar, maka setiap mobil akan bertemu pada satu
titik yang permanen (yang dilingkari) atau dapat dikatakan bahwa setiap mobil
tidak dapat melanjutkan perjalanan lagi atau dengan kata lain terjadi Deadlock.
Contoh lain pada proses yang secara umum terdiri dari tiga tahap, yaitu untuk
meminta, memakai, dan melepaskan sumber daya yang di mintanya. Contoh
kode-nya:
public class Proses {
public synchronized void getA() {
//proses untuk mendapat sumber daya a
}
public synchronized void getB(){
//proses untuk mendapat sumber daya b
}
public void releaseA(){
//proses untuk melepaskan sumber daya a
}
public void releaseB(){
//proses untuk melepaskan sumber daya b
}
}
public class Coba {
public static void main(String [] args) {
Proses P = new Proses();
Proses Q = new Proses();
P.getA();
Q.getB();
P.getB();
Q.getA();
}
}
Tanpa adanya perintah untuk melepaskan artinya saat P mendapatkan A
dan Q mendapatkan B, tetapi tidak dilepaskan, maka saat P minta B dan Q minta
A, maka keduanya akan saling menunggu hingga salah satu melepaskan sumber
dayanya, sedangkan kebutuhan P ada pada Q dan Q ada pada P, sehingga terjadi
Deadlock. Secara umum kejadian ini dapat mudah terjadi dalam pemrograman
multi-thread. Sebab ada kemungkinan lebih besar untuk menggunakan sumber
daya bersama.
3. Starvation
Starvation adalah keadaan dimana satu atau beberapa proses
'kelaparan' karena terus dan terus menunggu kebutuhan sumber dayanya
dipenuhi. Namun, karena sumber daya tersebut tidak tersedia atau dialokasikan
untuk proses lain, akhirnya proses yang membutuhkan tidak bisa
memilikinya. Kondisi seperti ini merupakan akibat dari keadaan menunggu yang
berkepanjangan. Starvation terjadi jika sebuah proses melakukan permintaan
sumber daya yang tidak pernah didapatkan.
Starvation bisa terjadi karena deadlock, tetapi bisa juga terjadi bukan
karena 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. Misalkan terdapat tiga
buah proses P1, P2 dan P3, memerlukan pengaksesan sumber daya R secara
periodik, maka ada kemungkinan terjadi skenario berikut:
- Proses P1 sedang diberi sumber daya R, P2 dan P3 sedang dalam keadaan
blocked menunggu sumber daya R
- Ketika P1 keluar dari critical section, proses P2 dan P3 diijinkan
mengakses sumber daya R
- Sumber daya R dialokasikan ke proses P3
- Setelah selesai, hak akses kembali diberikan kepada proses P1 yang saat
itu kembali membutuhkan sumber daya R
- Jika pemberian hak akses penggunaan sumber daya R terus bergantian
antara proses P1 dan P3 sehingga proses P2 tidak pernah mendapatkan
sumber daya R, maka P2 mengalami starvation
Contoh lain ilustrasi sederhana dari starvation adalah suatu client yang
sedang berinteraksi dengan sebuah server dalamwaktu yang lama mengakibatkan
server tersebut tidak dapat melayani client yang lain.
4. Race Condition
Seperti yang telah kita ketahui bahwa proses dapat bekerja sendiri
(independent process) dan juga dapat bekerja bersama proses-proses yang lain
(cooperating process). Pada umumnya ketika proses saling bekerjasama
(cooperating process) maka proses-proses tersebut akan saling berbagi data. Pada
saat proses-proses berbagi data, ada kemungkinan bahwa data yang dibagi secara
bersama itu akan menjadi tidak konsisten dikarenakan adanya kemungkinan
proses-proses tersebut melakukan akses secara bersamaan yang menyebabkan
data tersebut berubah, hal ini dikenal dengan istilah Race Condition.
Race Condition adalah situasi di mana beberapa proses mengakses dan
memanipulasi data bersama pada saat besamaan. Nilai akhir dari data bersama
tersebut tergantung pada proses yang terakhir selesai. Unutk mencegah race
condition, proses-proses yang berjalan besamaan harus di disinkronisasi.
Dalam beberapa sistem operasi, proses-proses yang berjalan bersamaan
mungkin untuk membagi beberapa penyimpanan umum, masing-masing dapat
melakukan proses baca (read) dan proses tulis (write). Penyimpanan bersama
(shared storage) mungkin berada di memori utama atau berupa sebuah berkas
bersama, lokasi dari memori bersama tidak merubah kealamian dari komunikasi
atau masalah yang muncul. Untuk mengetahui bagaimana komunikasi antar
proses bekerja, mari kita simak sebuah contoh sederhana, sebuah print spooler.
Ketika sebuah proses ingin mencetak sebuah berkas, proses tersebut memasukkan
nama berkas ke dalam sebuah spooler direktori yang khusus. Proses yang lain,
printer daemon, secara periodik memeriksa untuk mengetahui jika ada banyak
berkas yang akan dicetak, dan jika ada berkas yang sudah dicetak dihilangkan
nama berkasnya dari direktori.
Dalam sebuah sistem yang terdiri dari beberapa cooperating sequential
process yang berjalan secara asynchronous dan berbagi data, dapat terjadi seperti
program berikut ini. Untuk lebih jelasnya marilah kita lihat contoh program java
berikut yang memperlihatkan timbulnya Race Condition.
01. int counter = 0;
02.
03. //Proses yang dilakukan oleh produsen
04. item nextProduced;
05.
06. while (1)
07. {
08. while (counter == BUFFER_SIZE) { ... do nothing ... }
09.
10. buffer[in] = nextProduced;
11. in = (in + 1) % BUFFER_SIZE;
12. counter++;
13. }
14.
15. //Proses yang dilakukan oleh konsumen
16. item nextConsumed;
17.
18. while (1)
19. {
20. while (counter == 0) { ... do nothing ... }
21. nextConsumed = buffer[out] ;
22. out = (out + 1) % BUFFER_SIZE;
23. counter--;
24. }
Pada contoh tersebut dapat kita lihat bahwa counter memiliki dua buah
nilai yaitu bernilai tiga (pada saat counter++ dieksekusi) dan bernilai satu (pada
saat counter-- dieksekusi). Hal ini menyebabkan nilai dari counter tersebut
menjadi tidak konsisten. 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 bekerja bersama-sama dieksekusi secara beraturan demi mencegah
timbulnya suatu keadaan yang disebut dengan Race Condition.
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.
6. Penanganan Deadlock
Banyak cara untuk menanggulangi Deadlock
a. Mengabaikan masalah Deadlock.
b. Mendeteksi dan memperbaiki
c. Penghindaran yang terus menerus dan pengalokasian yang baik dengan
menggunakan protocol untuk memastikan sistem tidak pernah memasuki
keadaan Deadlock. Yaitu dengan Deadlock avoidance sistem untuk
mendata informasi tambahan tentang proses mana yang akan meminta dan
menggunakan sumber daya.
d. Pencegahan yang secara struktur bertentangan dengan empat kondisi
terjadinya Deadlock dengan Deadlock prevention sistem untuk memasti-
kan bahwa salah satu kondisi yang penting tidak dapat menunggu.
Pada waktu t0, sistem dalam state selamat. Urutan < P1, P0, P2> memenuhi
kondisi selamat karena P1 dapat segera dialokasikan semua tape drive dan
kemudian mengembalikan semua tape drive sehingga sistem tersedia 5 tape drive.
Kemudian P0 dapat memperoleh semua tape drive dan mengembalikan semua
sehingga system tersedia 10 tape drive dan terakhir proses P2 dapat memperoleh
semua tape drive dan mengembalikan semua tape drive sehingga system tersedia
12 tape drive. Sistem dapat berubah dari state selamat ke state tidak selamat.
Misalnya pada waktu t1, proses P2 meminta tambahan alokasi 1 tape drive. Sistem
menjadi tidak selamat. Pada saat ini, hanya proses P1 yang mendapatkan semua
tape drive dan kemudian mengembalikan semua tape drive sehingga hanya
tersedia 4 tape drive. Karena proses P0 sudah dialokasikan 5 tape drive tetapi
membutuhkan maksimum 10 tape drive sehingga meminta 5 tape drive lagi.
Karena tidak tersedia, proses P0 harus menunggu demikian juga P2 sehingga
system menjadi deadlock.
Sistem dalam keadaan state selamat dengan urutan < P1, P3, P4, P2, P0>
yang memenuhi kriteria algoritma safety. Misalnya proses P1 meminta tambahan
anggota tipe sumber daya A dan dua anggota tipe sumber daya C sehingga
Request1 = (1, 0, 2). Untuk menentukan apakah permintaan dapat segera
dipenuhi, pertama harus diperiksa apakah Request1 ≤ Available ((1, 0, 2) ≤ (3, 3,
2)) ternyata benar. Maka akan diperoleh state baru berikut :
Allocation Need Available
ABC ABC ABC
P0 010 743 230
P1 302 020
P2 301 600
P3 211 011
P4 002 431
3. Non-Preemption
Hal ketiga ialah jangan sampai ada preemption pada sumber daya yang
telah dialokasikan. Untuk memastikan hal ini, kita dapat menggunakan protokol.
Jadi jika sebuah proses meminta sumber daya yang tidak dapat dipenuhi saat itu
juga, maka proses mengalami preempted. Atau dengan kata lain ada sumber daya
dilepaskan dan diberikan ke proses yang menunggu, dan proses itu akan
menunggu sampai kebutuhan sumber dayanya dipenuhi. Atau kita harus mencek
sumber daya yang dimaui oleh proses di cek dahulu apakah tersedia. Jika ya maka
kita langsung alokasikan, sedangkan jika tidak tersedia maka kita melihat apakah
ada proses lain yang menunggu sumber daya juga. Jika ya, maka kita ambil
sumber daya dari proses yang menunggu tersebut dan memberikan pada proses
yang meminta tersebut. Jika tidak tersedia juga, maka proses itu harus menunggu.
Dalam menunggu, beberapa dari sumber dayanya dapat saja di preempted, tetapi
jika ada proses yang memintanya. Cara ini efektif untuk proses yang menyimpan
dalam memory atau register.
4. Circular Wait
Masalah ini dapat ditangani oleh sebuah protokol yang menjaga agar
sebuah proses tidak membuat lingkaran siklus yang dapat mengakibatkan
Deadlock. Sistem mempunyai total permintaan global untuk semua tipe sumber
daya. Proses dapat meminta proses kapanpun menginginkan, tapi permintaan
harus dibuat terurut secara numerik. Setiap proses yang membutuhkan sumber
daya dan memintanya maka nomor urut akan dinaikkan. Cara ini tidak akan
menimbulkan siklus. Masalah yang timbul adalah tidak ada cara pengurutan
nomor sumber daya yang memuaskan semua pihak.
Secara ringkas pendekatan yang digunakan pada metode pencegahan
deadlock dan masalah-masalah yang menghambatnya, terangkum dalam tabel
dibawah ini.
Syarat Langkah Kelemahan
Mutual Exclusion Spooling resource Dapat menyebabkan
chaos
Hold & Wait Meminta resource diawal Sulit memperkirakan di
awal dan tidak optimal
No Pre-emptive Mengambil resource di Hasil proses tidak akan
tengah jalan baik
Circular Wait Penomoran permintaan Tidak ada penomoran
resource yang memuaskan semua
pihak
8. Diagram Graf
Sebuah sistem komputer terdiri dari berbagai macam sumber-daya
(resources), seperti:
a. Fisik (Perangkat, Memori)
b. Logika (Lock, Database record)
c. Sistem Operasi (PCB Slots)
d. Aplikasi (Berkas)
Diantara sumber-daya tersebut ada yang preemptable dan ada juga yang
tidak. Sumber-daya ini akan digunakan oleh proses-proses yang
membutuhkannya. Mekanisme hubungan dari proses-proses dan sumber-daya
yang dibutuhkan/digunakan dapat di diwakilkan dengan graf. Graf adalah suatu
struktur diskrit yang terdiri dari vertex dan sisi, dimana sisi menghubungkan
vertex-vertex yang ada. Berdasarkan tingkat kompleksitasnya, graf dibagi menjadi
dua bagian, yaitu simple graf dan multigraf. Simpel graf tidak mengandung sisi
paralel (lebih dari satu sisi yang menghubungkan dua vertex yang sama).
Berdasarkan arahnya graf dapat dibagi menjadi dua bagian yaitu graf berarah dan
graf tidak berarah. Graf berarah memperhatikan arah sisi yang menghubungkan
dua vertex, sedangkan graf tidak berarah tidak memperhatikan arah sisi yang
menghubungkan dua vertex. Dalam hal ini akan dibahas mengenai implementasi
graf dalam sistem operasi. Salah satunya adalah graf alokasi sumber daya. Graf
alokasi sumber daya merupakan graf sederhana dan graf berarah. Graf alokasi
sumber daya adalah bentuk visualisasi dalam mendeteksi maupun menyelesaikan
masalah deadlock.
Pada gambar "Graf dengan deadlock", terlihat bahwa ada perputaran yang
memungkinkan tejadinya deadlock dan semua sumber daya memiliki satu instans
kecuali sumber daya R2. Graf tersebut memiliki minimal dua perputaran, yaitu:
1. R2 P0 R0 P1 R1 P2 R2
2. R2 P1 R1 P2 R2
Gambar di atas menunjukkan beberapa hal sebagai berikut:
1. P0 meminta sumber daya R0.
2. R0 mengalokasikan sumber dayanya pada P1.
3. P1 meminta sumber daya R1.
4. R1 mengalokasikan sumber dayanya pada P2.
5. P2 meminta sumber daya R2.
6. R2 mengalokasikan sumber dayanya pada P0 dan P1.
7. R3 mengalokasikan sumber dayanya pada P2.
Hal-hal tersebut dapat mengakibatkan deadlock sebab P0 memerlukan
sumber daya R0 untuk menyelesaikan prosesnya, sedangkan R0 dialokasikan untuk
P1. Di lain pihak P1 memerlukan sumber daya R1 sedangkan R1 dialokasikan untuk
P2. P2 memerlukan sumber daya R2 akan tetapi R2 mengalokasikan sumber
dayanya pada R3.
Dengan kata lain, tidak ada satu pun dari proses-proses tersebut yang dapat
menyelesaikan tugasnya sebab sumber daya yang diperlukan sedang digunakan
oleh proses lain. Sedangkan proses lain juga memerlukan sumber daya lain.
Semua sumber daya yang diperlukan oleh suatu proses tidak dapat dipenuhi
sehingga proses tersebut tidak dapat melepaskan sumber daya yang telah
dialokasikan kepadanya. Dan terjadi proses tunggu-menunggu antarproses yang
tidak dapat berakhir. Inilah yang dinamakan deadlock.
Gambar 11, “Tanpa deadlock” memiliki siklus tetapi deadlock tidak
terjadi. Pada gambar di atas, graf memiliki 1 siklus yaitu: P0 R1 P2 R0
P3 R2 P0. Graf di atas menunjukkan beberapa hal:
1. P0 meminta sumber daya R1.
2. R1 mengalokasikan sumber dayanya pada P2.
3. P2 meminta sumber daya R0.
4. R0 mengalokasikan sumber dayanya pada P3.
5. P3 meminta sumber daya R2.
6. R0 mengalokasikan sumber dayanya pada P3.
7. R1 mengalokasikan sumber dayanya pada P1.
Hal ini tidak menyebabkan deadlock walaupun ada siklus sebab semua
sumber-daya yang diperlukan P1 dapat terpenuhi sehingga P1 dapat melepaskan
semua sumber-dayanya, yang kemuadian dapat digunakan oleh proses lain.
Dengan algoritma ini bentuk siklus pada graf tidak dapat terjadi. Sebab
untuk setiap perubahan yang terjadi akan diperiksa dengan algoritma deteksi
siklus. Algoritma ini memerlukan waktu n² dalam mendeteksi siklus dimana n
adalah jumlah proses dalam sistem. Jika tidak ada siklus dalam graf, maka sistem
berada dalam status aman. Tetapi jika siklus ditemukan maka sistem berada dalam
status tidak aman. Pada saat status tidak aman ini, proses Pi harus menunggu
sampai permintaan sumber dayanya dipenuhi. Pada saat ini R1 sedang tidak
mengalokasikan sumber dayanya, sehingga P1 dapat memperoleh sumber daya
R1. Namun, jika claimed edge diubah menjadi sisi permintaan dan kemudian
diubah menjadi sisi alokasi, hal ini dapat menyebabkan terjadinya siklus (Gambar
13, “Graf alokasi sumber daya dalam status tidak aman”).
8.4 Pendeteksian dengan Graf Tunggu
Jika semua sumber daya hanya memiliki satu instans, deadlock dapat
dideteksi dengan mengubah graf alokasi sumber daya menjadi graf tunggu. Ada
pun caranya sebagai berikut:
1. Cari sumber daya Rm yang memberikan instansnya pada Pi dan Pj yang
meminta sumber daya pada Rm.
2. Hilangkan sumber daya Rm dan hubungkan sisi Pi dan Pj dengan arah
yang bersesuaian yaitu PjPi.
3. Lihat apakah terdapat siklus pada graf tunggu? Deadlock terjadi jika dan
hanya jika pada graf tunggu terdapat siklus.
Gambar 15. Graf tunggu
Untuk mendeteksi deadlock, sistem perlu membuat graf tunggu dan secara
berkala memeriksa apakah ada siklus atau tidak. Untuk mendeteksi adanya siklus
diperlukan operasi sebanyak n², dimana n adalah jumlah vertex dalam graf alokasi
sumber daya.
DAFTAR PUSTAKA