LAPORAN TUGAS SISTEM OPERASI MODUL D
Diajukan Untuk Memenuhi Tugas Sistem Operasi
Dosen Pengampu
Arie Budiansyah, ST., M.Eng
Disusun Oleh:
Arif Maulana
(2208107010067)
Informatika
Semester 3
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS SYIAH KUALA
2023
A. A. Deadlock in Java
Deadlock adalah kondisi yang terjadi dalam pemrograman berbasis utas (multi-threading) ketika dua atau lebih utas (thread) terjebak dalam situasi di mana masing-masing menunggu sumber daya yang dipegang oleh yang lain, sehingga tidak ada dari mereka yang dapat melanjutkan. Ini adalah situasi yang menghambat aplikasi dan dapat menyebabkan program tidak responsif. Kondisi deadlock dapat terjadi ketika ada empat kondisi yang ada secara bersamaan, yang dikenal sebagai "Empat Kondisi Penting Deadlock." Empat kondisi ini adalah:
Mutual Exclusion: Setidaknya satu sumber daya harus memiliki sifat eksklusif, yang berarti hanya satu utas dapat mengaksesnya pada satu waktu.
Hold and Wait: Sebuah utas harus mengunci setidaknya satu sumber daya saat itu memegang sumber daya lain, dan dalam waktu yang sama, menunggu untuk mengunci sumber daya tambahan.
No Preemption: Sumber daya yang sudah dikunci tidak dapat diambil oleh kekuatan dari utas yang menggunakannya; hanya utas yang memiliki sumber daya tersebut yang dapat membebaskannya.
Circular Wait: Terdapat rangkaian utas yang menunggu sumber daya dalam lingkaran tertutup. Misalnya, utas A menunggu sumber daya yang dimiliki oleh utas B, utas B menunggu sumber daya yang dimiliki oleh utas C, dan seterusnya, hingga utas terakhir menunggu sumber daya yang dimiliki oleh utas A.
Contoh sederhana deadlock dalam Java dapat terjadi ketika dua utas mencoba mengunci dua sumber daya dalam urutan yang berbeda. Jika kedua utas tersebut mencoba mengunci sumber daya yang sama dalam urutan yang berbeda, mereka bisa terjebak dalam deadlock.
1. Contoh Program Deadlock
output: Kode di atas adalah contoh dari situasi deadlock dalam pengelolaan sumber daya (resource) di dalam aplikasi multi-threading. Deadlock adalah kondisi di mana dua atau lebih utas (thread) saling menunggu sumber daya yang dipegang oleh utas lain, sehingga tidak ada dari mereka yang dapat melanjutkan.
Kode tersebut membuat dua utas, t1 dan t2, yang berusaha untuk mengunci dua sumber daya string, yaitu resource1 dan resource2. Masing-masing utas berusaha mengunci sumber daya dalam urutan yang berbeda, yang menyebabkan deadlock. Berikut adalah penjelasan kode tersebut secara detail:
code mendefinisikan dua string, resource1 dan resource2, yang akan digunakan sebagai sumber daya yang akan dikunci oleh utas.
code membuat t1 dan t2, yang merupakan dua utas yang akan berjalan secara bersamaan.
Utas t1 memiliki metode run() yang mencoba untuk mengunci resource1, mencetak pesan bahwa "Thread 1: locked resource 1", dan kemudian menunggu selama 100 milidetik sebelum mencoba mengunci resource2. Ini dilakukan dalam blok synchronized, yang berarti resource1 akan dikunci oleh t1 sehingga tidak dapat diakses oleh utas lain selama t1 menjalankan kode ini.
Utas t2 memiliki metode run() yang mencoba untuk mengunci resource2, mencetak pesan bahwa "Thread 2: locked resource 2", dan kemudian menunggu selama 100 milidetik sebelum mencoba mengunci resource1. Ini juga dilakukan dalam blok synchronized, yang berarti resource2 akan dikunci oleh t2 sehingga tidak dapat diakses oleh utas lain selama t2 menjalankan kode ini.
code kemudian memulai kedua utas (t1 dan t2) menggunakan t1.start() dan t2.start().
Ketika kedua utas dimulai, t1 akan mengunci resource1, dan t2 akan mengunci resource2. Namun, kemudian t1 mencoba untuk mengunci resource2 yang sedang dikunci oleh t2, dan sebaliknya, t2 mencoba untuk mengunci resource1 yang sedang dikunci oleh t1. Karena keduanya menunggu satu sama lain untuk melepaskan sumber daya yang mereka butuhkan, mereka akan terjebak dalam kondisi deadlock, dan aplikasi tidak akan pernah selesai. Deadlock dapat menyebabkan aplikasi menjadi tidak responsif dan harus dihindari dalam pengembangan aplikasi multi-threading. Solusi umum untuk menghindari deadlock adalah menggunakan urutan kunci yang konsisten dan meminimalkan penggunaan blok synchronized.
2. Program Deadlock Solved
Output:
Kode di atas adalah contoh untuk mengatasi masalah deadlock dengan menggantikan urutan kunci yang digunakan oleh dua utas yang bersaing untuk sumber daya yang sama. Ini adalah contoh penggunaan solusi untuk deadlock dalam aplikasi multi-threading.
Kode ini mengatasi deadlock dengan mengganti urutan penguncian sumber daya dalam dua utas. Sebagai hasilnya, utas-utas ini tidak akan saling menunggu satu sama lain untuk melepaskan sumber daya yang mereka butuhkan, dan deadlock dihindari. Solusi ini adalah salah satu dari beberapa cara untuk menghindari deadlock dalam aplikasi multi-threading.
3. Program Producer Consumer Test
Output:
Kode di atas adalah contoh dari masalah produsen-konsumen yang diimplementasikan dengan menggunakan dua utas (producer dan consumer) yang berkomunikasi melalui objek CubbyHole
Dengan cara ini, produsen dan konsumen berkomunikasi dengan aman melalui objek CubbyHole, yang memastikan bahwa produsen tidak akan memasukkan data ke dalam wadah jika wadah penuh, dan konsumen tidak akan mengambil data jika wadah kosong. Ini adalah implementasi dasar dari masalah produsen-konsumen dalam pemrograman multi-threading.
Komentar
Posting Komentar