Neden güvensiz durum her zaman kilitlenmeye neden olmaz?


10

Galvin'in İşletim Sistemlerini okuyordum ve aşağıdaki satırla karşılaştım,

Bununla birlikte, tüm güvensiz durumlar çıkmaz değildir. Güvenli olmayan bir durum kilitlenmeye yol açabilir

Birisi nasıl kilitlenme! = Güvensiz durum açıklayabilir misiniz? Burada aynı çizgiyi yakaladım

Güvenli bir sekans yoksa, sistem güvensiz bir durumdadır, bu da kilitlenmeye yol açabilir. (Tüm güvenli durumlar kilitlenmez, ancak güvenli olmayan tüm durumlar kilitlenmelere yol açmaz.)


1
kilitlenme, zaman zaman meydana gelen bir yarış durumuna benzer bir kavram olabilir . güvenli olmayan kod yalnızca belirli bir sıra sıralandığında kilitlenmeyi tetikler. bu dizi "herhangi bir zamanda olabilir" aka "kaza olmasını bekliyor" ...
vzn

güvenli olmayan durum, teorik olarak bir kilitlenme olasılığı vardır. Bazı özel şeyler meydana geldiğinde kilitlenme meydana gelebilir. güvenli durum için, ne olduğu önemli değil, bir kilitlenme olamaz.
nishantbhardwaj2002

1
Herhangi bir tehlikeli durumun (gerçek hayatta) tam olarak aynı nedenlerle her zaman kötü şeylerin olmasına neden olmaz.
David Richerby

Yanıtlar:


14

Kilitlenme belirli bir şey anlamına gelir: şu anda birbirini bekleyen engellenen iki (veya daha fazla) işlem vardır .

Bir In güvensiz duruma orada da bir durumda olabilir belki ileride bir kilitlenme bazen olabilir, ama süreçlerin bir veya her iki fiilen bekleyen başlamamış çünkü henüz olmadı.

Aşağıdaki örneği düşünün:

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

Verdiğiniz bağlantının 7.5.1 Bölümünde daha ilginç bir örnek var :

12 teyp sürücüsüne sahip bir sistem düşünün:

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

Bu güvensiz bir durum. Ama biz bir kilitlenme içinde değiliz. P0 eğer, örneğin, bu nedenle, sadece 4 serbest sürücüler var does isteği ek 5 ve P2 yapar isteği ek 1, biz kilitlenmeye, ancak henüz olmadı. Ve P0 olabilir değil artık sürücüler talep, ancak bunun yerine bu zaten sürücüleri boş olabilir. Programın Max needtüm olası yürütmeleri bitti ve bu, P0'daki 10 sürücünün tümüne ihtiyaç duyduğumuz yürütmelerden biri olmayabilir.


Çok teşekkür ederim beyefendi! ve belirsiz ders kitabımdan nefret ediyorum ...
Ning

Ama ayrıca bazı sorularım var: (1) ["] Azami ihtiyaç, programın tüm olası yürütmelerinin üzerindedir [."] , Fakat aynı zamanda P0 ek bir 5 talep ederse ve P2 talep ederse ek 1, yapacağız kilitlenmeye [. "] , burada (1) aracı Max İhtiyacı bu kadar sağlanamadığı durumda olası (2) araç iken, kilitlenme olması gerekir bunun elde değilken kilitlenme var mı?
Ning

P2 Eğer benim gerekçem ?: doğru mu yapar isteği ek 1 ve bitirmek sonra serbest bantlar hiçbir çıkmazdan böylece, 5 o zaman elde edilebilir ilave talep (4 + 3 = 7) ve P1 beri olmak. P2 Ama eğer gelmez bitirmek, sonra kilitlenme oluşur beri P1 sadece bitirmek, hala 4 <5 için 5 eksik olsa da.
Ning

Son örnek için: P0 ek 5 talep eder, sonra 5 + 5 + 3 = 13> 12, bu nedenle P0'ın P2'yi beklemesi gerekir, kilitlenme üretmek için P2'nin ek talep etmesine izin verin.
Bit_hcAlgorithm

7

Wandering Logic'in söylediklerini açıklamak için.

Diyelim ki, hem X hem de Y'ye erişmesi gereken iki iş parçacığım var ve senkronizasyon ve kilitlenmeyi giderecek bir mekanizma yok. Bu güvensizdir, çünkü biri X'i ve diğer Y'yi kilitleyebilir ve sonra ikisi de devam edemez. Ancak garanti edilmez.

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

Bu senaryo çıkmaza girmedi, ama olabilirdi. İplik geçirmenin çalışma şekli nedeniyle, belirli bir akış yoktur. İşletim sistemi iş parçacığını kontrol eder ve böylece aşağıdaki gibi bir şey olabilir:

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.

1

Güvenli durum kesin olarak kilitlenmez, ancak kilitlenmeyi önlemek için tüm gereksinimleri yerine getiremezseniz oluşabilir. Örneğin, A iş parçacığı başlatıldığında iki iş parçacığı kilitlenmeye düşebilirse, sonra B iş parçacığı, ancak tam tersini başlattıklarında (B, A) iyi çalışırlar - B'nin daha iyi olduğunu varsayalım;) Sistemin durumu güvensiz, ama şanslı bir başlangıç ​​sırası ile işe yarayacaktır. Kilitlenme yok, ama mümkün. Bunları el ile de senkronize ederseniz - iyi sırayla başlatın - tehlikelidir - herhangi bir nedenden dolayı ateşlenmeyebilirler - sistem hala güvensizdir (olası kilitlenme nedeniyle), ancak düşük olasılık vardır. Devam ettikten sonra iş parçacıklarını veya kesintileri dondurmak gibi bazı dış olaylarda başarısız olur.

Farkına varmalısınız - güvenli durum kilitlenmeyi önlemek için yeterli bir durumdur, ancak güvensizlik sadece zorunlu bir durumdur. Şu anda kafadan kod yazmak zor, ancak bazılarını arayabilirim. Ada'da 99/100 kereden fazla birkaç hafta boyunca mükemmel çalıştığını (ve sonra sunucu yeniden başlatma değil kilitlenme nedeniyle durdu) kodla karşılaştım ama arada bir kilitlenme durumuna birkaç saniye sonra çöküyordu.

Bölüme kıyasla biraz kolay örnek vereyim: İşleviniz c / d'yi böler ve sonucu döndürürse, d'nin 0 olup olmadığını kontrol etmeden sıfır hata ile bölünme olabilir, bu nedenle kod güvensizdir (aynı adlandırma amaçlanmıştır), ancak böyle bir bölünme yaparsanız, her şey yolundadır, ancak teorik analizden sonra kod güvensizdir ve düzgün işlenmeyen tanımlanmamış davranışlara düşebilir.


0

İşte bu konuda benim anlayışım (lütfen yanılıyorsam beni düzeltin): (A) Kilitlenme varsa, bir döngü var demektir (gerekli koşullardan biri) (B) Bir döngü kilitlenme için zorunlu koşuldur (hem tek hem de çoklu için) yönetim ortamı kaynakları)

Böylece şimdi kilitlenmeye yol açmayacak bir döngü olduğunu kanıtlayabiliriz, döngü ile güvenli olmayan durum Burada güvenli olmayan bir durumun bulunduğu anlamına gelen bir döngü olduğunu görebilirsiniz, ancak döngüye katılan kaynak R2, P3 süreci biter ve serbest bırakır bırakmaz döngü (P3'ün herhangi bir bağımlılığı olmadığını veya başka bir kaynak beklemediğini unutmayın).


2
Siteye Hoşgeldiniz! Küçük bir nokta: yazılı İngilizce'de "olmayabilir" ifadesinden kaçınmak en iyisidir, çünkü "olmamalı" ("buraya park edemezsiniz") veya "olmayabilir" ("Bu filmden hoşlanmayabilirsiniz ")
David Richerby

0

Önemsiz güvensiz bir durum: Diş 1, A kilidini, ardından B kilidini alır, ardından her ikisinin kilidini açar. İplik 2 B kilidini alır, ardından A kilidini alır, ardından her ikisinin kilidini açar.

Bu, yalnızca İplik 2, yalnızca Diş 1'i A kilidini alıp B kilidini almaya çalıştığında veya B dişini sadece A kilidini aldığında kilitlenmeye neden olur. kilit A. almaya çalışan Konu 2 alma kilit B arasındaki

Eğer Diş 1 ve Diş 2 bunu saatte bir rastgele yaparsa ve aslında bir kilitlenmeye yol açacak mikrosaniye bir zaman aralığı varsa. bu, şans eseri bir çıkmaza girene kadar müşterilerin elinde çok uzun süre çalışabilir.

Gözlerin kapalıyken caddenin karşısına yürü. Güvensiz. Ama sen her zaman öldürülmezsin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.