Saya membaca Sistem Operasi oleh Galvin dan menemukan garis di bawah ini,
Namun, tidak semua negara bagian yang tidak aman menemui jalan buntu. Keadaan yang tidak aman dapat menyebabkan kebuntuan
Bisakah seseorang tolong jelaskan bagaimana jalan buntu! = Kondisi tidak aman ? Saya juga menangkap garis yang sama di sini
Jika urutan aman tidak ada, maka sistem dalam keadaan tidak aman, yang MUNGKIN menyebabkan kebuntuan. (Semua negara aman bebas dari kebuntuan, tetapi tidak semua negara tidak aman menyebabkan kebuntuan.)
operating-systems
deadlocks
vikkyhacks
sumber
sumber
Jawaban:
Deadlock berarti sesuatu yang spesifik: ada dua (atau lebih) proses yang saat ini diblokir menunggu satu sama lain.
Dalam keadaan tidak aman Anda juga bisa berada dalam situasi di mana mungkin ada jalan buntu di masa depan, tetapi itu belum terjadi karena salah satu atau kedua proses belum benar-benar mulai menunggu.
Perhatikan contoh berikut:
Ada contoh yang lebih menarik di Bagian 7.5.1 dari tautan yang Anda berikan :
Ini adalah kondisi yang tidak aman. Tapi kita tidak menemui jalan buntu. Hanya ada 4 drive gratis, jadi, misalnya, jika P0 tidak permintaan tambahan 5, dan P2 tidak permintaan tambahan 1, kita akan kebuntuan, tetapi belum terjadi. Dan P0 mungkin tidak meminta drive lagi, tetapi malah membebaskan drive yang sudah ada. Ini
Max need
atas semua kemungkinan eksekusi program, dan ini mungkin bukan salah satu eksekusi di mana kita membutuhkan semua 10 drive di P0.sumber
Hanya untuk menjelaskan apa yang Wandering Logic katakan.
Katakanlah saya memiliki dua utas yang keduanya membutuhkan akses ke X dan Y, dan tidak memiliki sinkronisasi dan tidak ada mekanisme untuk memperbaiki kebuntuan. Ini tidak aman, karena yang satu bisa mengunci X dan yang lainnya Y dan kemudian tidak ada yang bisa melanjutkan. Tapi itu tidak dijamin.
Skenario ini tidak berakhir di jalan buntu, tetapi bisa saja. Karena cara kerja threading, tidak ada aliran yang ditetapkan. OS mengontrol threading sehingga dapat terjadi sesuatu seperti berikut:
sumber
Kondisi aman pasti bebas dari kebuntuan, tetapi jika Anda tidak dapat memenuhi semua persyaratan untuk mencegah kebuntuan, itu mungkin terjadi. Sebagai contoh jika dua utas dapat mengalami kebuntuan saat mereka memulai utas A, maka utas B, tetapi ketika mereka memulai kebalikannya (B, A) mereka akan bekerja dengan baik - izinkan saya menganggap B lebih baik;) Keadaan sistem tidak aman, tetapi dengan urutan awal yang beruntung itu akan berhasil. Tidak ada jalan buntu, tetapi itu mungkin. Jika Anda juga menyinkronkannya dengan tangan - mulailah dengan urutan yang baik - berbahaya - untuk beberapa alasan mereka mungkin tidak dipecat sesuka Anda - sistem masih tidak aman (karena kemungkinan deadlock) tetapi ada kemungkinan kecil untuk itu. Dalam hal beberapa peristiwa eksternal seperti membekukan utas atau menyela setelah melanjutkan itu akan gagal.
Anda harus menyadari - kondisi aman adalah kondisi yang cukup untuk menghindari kebuntuan, tetapi kondisi tidak aman hanya perlu. Sulit untuk menulis kode keluar dari kepala sekarang, tetapi saya dapat mencari beberapa. Saya memang menemukan kode di Ada yang lebih dari 99/100 kali berfungsi dengan sempurna selama beberapa minggu (dan kemudian berhenti karena server restart bukan kebuntuan) tetapi sesekali itu macet setelah beberapa detik dalam kondisi deadlock.
Izinkan saya menambahkan beberapa contoh mudah dengan membandingkan dengan pembagian: Jika fungsi Anda membagi c / d dan mengembalikan hasil, tanpa memeriksa apakah d sama dengan 0, mungkin ada pembagian dengan kesalahan nol, sehingga kode tidak aman (penamaan yang sama dimaksudkan), tetapi sampai Anda melakukan pembagian seperti itu, semuanya baik-baik saja, tetapi setelah kode analisis teoritis tidak aman dan mungkin jatuh ke dalam perilaku tidak terdefinisi tidak ditangani dengan benar.
sumber
Berikut ini adalah pemahaman saya tentang ini (tolong perbaiki saya jika saya salah): (A) Jika jalan buntu, berarti ada siklus (salah satu syarat yang diperlukan) (B) Siklus adalah syarat wajib untuk jalan buntu (untuk tunggal dan multi sumber daya contoh)
Jadi kita dapat membuktikan sekarang bahwa ada siklus yang mungkin tidak mengarah ke jalan buntu, Anda bisa lihat di sini ada siklus yang berarti keadaan tidak aman ditemukan, tetapi ini mungkin tidak mengarah ke jalan buntu karena sumber daya R2 yang berpartisipasi dalam siklus dapat memecahkan siklus begitu proses P3 selesai dan lepaskan (ingat P3 tidak memiliki ketergantungan atau menunggu sumber daya lainnya).
sumber
Keadaan tidak aman sepele: Thread 1 mengambil kunci A, lalu mengunci B, lalu membuka keduanya. Thread 2 mengambil kunci B, lalu mengunci A, lalu membuka keduanya.
Ini hanya akan menyebabkan kebuntuan jika Thread 2 mengambil kunci B hanya antara Thread 1 mengambil kunci A dan mencoba mengambil kunci B, atau Thread 1 mengambil kunci A hanya antara Thread 2 mengambil kunci B dan mencoba mengambil kunci A.
Jika Thread 1 dan Thread 2 melakukan ini secara acak sekali dalam satu jam, dan ada celah waktu mikrodetik yang sebenarnya akan menyebabkan kebuntuan. ini bisa berjalan sangat lama di tangan pelanggan sampai akhirnya Anda menemui jalan buntu.
Berjalan melintasi jalan dengan mata tertutup. Itu tidak aman. Tapi kamu tidak selalu terbunuh.
sumber