Mengapa keadaan tidak aman tidak selalu menyebabkan kebuntuan?

10

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.)

vikkyhacks
sumber
1
kebuntuan bisa menjadi konsep yang mirip dengan kondisi balapan yang terjadi sebentar-sebentar. kode yang tidak aman hanya memicu kebuntuan ketika urutan tertentu berbaris. urutan itu bisa "terjadi kapan saja" alias "kecelakaan menunggu terjadi" ...
vzn
keadaan tidak aman berarti, secara teoritis ada kemungkinan kebuntuan. kebuntuan dapat terjadi ketika beberapa hal tertentu terjadi. untuk keadaan aman, tidak peduli apa yang terjadi, tidak mungkin ada jalan buntu.
nishantbhardwaj2002
1
Untuk alasan yang persis sama bahwa setiap situasi berbahaya (dalam kehidupan nyata) tidak selalu menyebabkan hal-hal buruk terjadi.
David Richerby

Jawaban:

14

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:

Process A                  Process B
lock X                     lock Y           # state is "unsafe"
                           unlock Y
lock Y                                      # state is back to "safe" (no deadlock this time.  We got lucky.)

Ada contoh yang lebih menarik di Bagian 7.5.1 dari tautan yang Anda berikan :

Pertimbangkan sistem dengan 12 tape drive dengan:

Process       Max Need       Current
P0:             10              5
P2:              9              3

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 needatas semua kemungkinan eksekusi program, dan ini mungkin bukan salah satu eksekusi di mana kita membutuhkan semua 10 drive di P0.

Logika Pengembaraan
sumber
Terima kasih banyak Pak! dan saya benci buku pelajaran saya yang tidak jelas ...
Ning
Tetapi saya juga memiliki beberapa pertanyaan: (1) Anda mengatakan ["] Kebutuhan Max adalah atas semua kemungkinan eksekusi program [."] , Tetapi Anda juga mengatakan ["] jika P0 meminta 5 tambahan, dan P2 meminta 1 tambahan, kita akan menemui jalan buntu [. "] , di mana (1) berarti jika Max Need tidak tercapai, mungkin saja terjadi deadlock, sementara (2) berarti harus mengalami deadlock ketika tidak tercapai?
Ning
Apakah alasan saya benar ?: Jika P2 tidak permintaan tambahan 1 dan selesai , maka kaset bebas menjadi (4 + 3 = 7), dan karena P1 meminta tambahan 5 maka dapat dicapai, sehingga tidak ada deadlock. Tetapi jika P2 tidak selesai, maka kebuntuan terjadi karena bahkan jika P1 hanya perlu 5 untuk menyelesaikan, masih 4 <5.
Ning
Untuk contoh terakhir: P0 meminta tambahan 5, lalu 5 + 5 + 3 = 13> 12, jadi P0 harus menunggu P2, untuk menghasilkan kebuntuan, biarkan saja P2 meminta tambahan.
Bit_hcAlgorithm
7

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.

Thread 1                    Thread 2
Lock X                      
Lock Y
OS Interrupts Thread 1 and passes control to Thread 2
                            Unable to lock needed resources.
OS Interrupts Thread 2 and passes control to Thread 1
Unlock X                    
Unlock Y                    
                            Lock Y
                            Lock X
 ....

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:

Thread 1                    Thread 2
Lock X        
OS Interrupts Thread 1 and passes control to Thread 2
                            Lock Y              
DEADLOCK Thread 1 needs Y, Thread 2 needs X. Neither knows to back down and simply waits.
JustAnotherSoul
sumber
1

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.

Jahat
sumber
0

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, keadaan tidak aman dengan siklus 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).

Mahesh Kumar Chopker
sumber
2
Selamat datang di situs ini! Poin kecil: yang terbaik adalah menghindari frasa "boleh tidak" dalam bahasa Inggris tertulis, karena tidak jelas apakah ini berarti "tidak boleh" ("Anda mungkin tidak parkir di sini") atau "mungkin tidak" ("Anda mungkin tidak menikmati film ini . ")
David Richerby
0

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.

gnasher729
sumber