Bölüm 7: Kilitlenme
Çoktan Seçmeli · Giriş
Soru 1: Kesilebilir Kaynak
Aşağıdaki kaynaklardan hangisi sahibine zarar vermeden elinden alınıp sonra geri verilebilen kesilebilir bir kaynaktır?
C: Sayfanın içeriği diske yazılıp sonra geri yüklenebilir; CPU da bağlamı kaydedilerek el değiştirir. Yarıda kesilen yazma işi bozulur, mutex ve kayıt kilidi yalnızca sahibince bırakılır: bunlar kesilemez kaynaklardır ve kilitlenmeler bu tür kaynaklarla oluşur.
Çıktı Sorusu · Giriş
Soru 2: Ters Sırada Edinim
İkili semaforlar r1 ve r2 1 ile başlıyor. Tek CPU'da iki çizelgeleme sırası deneniyor: (a) A1, A2, B1, … (b) A1, B1, A2, B2 (A1: A'nın ilk satırı). Her sırada ne olur?
/* A */ /* B */ down(&r1); down(&r2); down(&r2); down(&r1); kullan(); kullan(); up(&r2); up(&r1); up(&r1); up(&r2);
Cevabı göster
(a) A iki kaynağı da alır. B1'de B, r2'yi bekler ama A işini bitirip up yapınca devam eder: kilitlenme yok.
(b) A r1'i, B r2'yi alır; A2'de A r2'yi, B2'de B r1'i bekler. up satırlarına hiçbiri ulaşamaz: kilitlenme.
Kilitlenme yalnızca her iş parçacığı ilk down'ını ötekinin ikinci down'ından önce yaparsa oluşur; bu yüzden testlerde nadiren görülür. İkisi de önce r1, sonra r2 alsaydı hiçbir sırada kilitlenme olmazdı.
Çoktan Seçmeli · Kilitlenme Koşulları
Soru 3: Hangi Koşul Kırıldı?
Bir sistemde kural şu: süreç yeni bir kaynak istemeden önce elindeki bütün kaynakları bırakmak, sonra hepsini birlikte yeniden istemek zorunda. Bu kural kilitlenmenin hangi koşulunu ortadan kaldırır?
A: Süreç hiçbir zaman bir kaynağı tutarken başka bir kaynağı beklemez. Bedeli: kaynaklar gereksiz bırakılıp yeniden alınır, çok kaynak isteyen süreç aç kalabilir. Kesme yok koşulunu kırmak ise kaynağın süreçten zorla geri alınabilmesidir.
Çıktı Sorusu · Kilitlenme Koşulları
Soru 4: Kaç Kaynak Yeter?
Süreçler aynı türden özdeş kaynakları (ör. teyp sürücüsü) teker teker istiyor ve hepsini işi bitince bırakıyor. (a) 4 süreç, her biri aynı anda en çok 3 sürücü: kilitlenmenin hiç oluşmaması için en az kaç sürücü gerekir? (b) 6 süreç, her biri en çok 4 sürücü, sistemde 18 sürücü: kilitlenme olabilir mi? (c) 18 sürücü ve süreç başına en çok 4 ile en çok kaç süreç güvenle çalışır?
Cevabı göster
En kötü durumda her süreç k − 1 kaynak tutup bir tane daha bekler. Bir kaynak daha varsa biri ihtiyacını tamamlar, biter ve kaynaklarını bırakır: gereken en az sayı n · (k − 1) + 1.
- (a) 4 · 2 + 1 = 9 sürücü.
- (b) 6 · 3 + 1 = 19 > 18: olabilir. 18 sürücünün hepsi altı sürece üçer dağılırsa herkes dördüncüyü bekler.
- (c) 3n + 1 ≤ 18 → n ≤ 5,67 → en çok 5 süreç.
Bu sınır tut ve bekle koşulunun döngüsel beklemeye dönüşemeyeceği kaynak sayısıdır; bankacı algoritmasının tek kaynaklı en kötü durumudur.
Adım Adım Çalıştırma · Modelleme
Soru 5: Döngü Var, Kilitlenme?
R1'in 2, R2 ve R3'ün birer örneği var. P1 R2'yi tutup R1 istiyor; P2 bir R1 tutup R3 istiyor; P3 R3'ü tutup R2 istiyor; P4 diğer R1 örneğini tutuyor, istek yok. Çizgede döngü var mı? Sistem kilitlenmiş mi?
Kesikli ok istek (süreç → kaynak), düz ok atama (örnek → süreç). Hiçbir kaynakta boş örnek yok.
Döngü: P1 → R1 → P2 → R3 → P3 → R2 → P1. Tek örnekli olsaydı kesin kilitlenme olurdu; ama R1'in ikinci örneği döngü dışındaki P4'te.
P4 hiçbir şey beklemiyor: biter ve R1 örneğini bırakır.
P1'in R1 isteği karşılanır; P1 biter, R1 ve R2'yi bırakır.
P3 R2'yi alır, biter; R2 ve R3 boşalır.
P2 R3'ü alıp biter. Herkes bitti: kilitlenme yok. Çok örnekli kaynaklarda döngü gereklidir ama yeterli değildir.
while (isteği boştakilerle karşılanabilen bitmemiş P var) { P'ye istediğini ver; P biter, tüm kaynaklarını bırakır; } if (bitmeyen süreç kaldı) kilitlenme var; else kilitlenme yok;
Çıktı Sorusu · Modelleme
Soru 6: Kim Kilitlendi?
Tüm kaynaklar tek örnekli. A, R'yi tutup S'yi; B, S'yi tutup T'yi; C, T'yi tutup R'yi istiyor. D, U'yu tutup S'yi istiyor. E, V'yi tutuyor ve istek yapmıyor. Bekleme (wait-for) çizgesini çizin. Hangi süreçler kilitlenmiştir, hangileri ilerleyebilir?
Cevabı göster
Kaynak düğümleri çıkarılır, her “Pi → R → Pj” yolu “Pi, Pj'yi bekliyor” kenarı olur: A → B, B → C, C → A, D → B.
Döngü A → B → C → A: tek örnekli kaynaklarda döngü kilitlenmenin kanıtıdır, A, B, C kilitli. D döngüde değildir ama döngüdeki B'yi beklediği için o da ilerleyemez. E hiçbir şey beklemez, biter.
Çoktan Seçmeli · Stratejiler
Soru 7: Bankacı Hangi Strateji?
Her isteği vermeden önce “bu istek verilirse durum güvenli kalır mı?” diye soran ve güvensizse isteği erteleyen bankacı algoritması hangi stratejiye örnektir?
B: Kaçınma dört koşulun hepsine izin verir, ama çalışma anında sistemi hep güvenli durumda tutar; azami ihtiyaçların önceden bilinmesini ister. Önleme koşullardan birini tasarımda imkânsız kılar; tespit kilitlenmeye izin verip sonra bulur.
Adım Adım Çalıştırma · Tespit ve Kurtarma
Soru 8: Tespit Algoritması
Üç kaynak türü, toplam E = (5 3 4). Tahsis (C) ve şu anki istek (R) matrisleri tabloda. Sistem kilitlenmiş mi? Satırlar P1'den başlayarak sırayla taranıyor.
E = (5 3 4), tahsislerin toplamı (4 3 3) → boşta A = (1 0 1). İsteği A ile karşılanabilen işaretsiz süreç aranır.
P1: R (0 1 0) ≤ A (1 0 1) değil (B türünden boş yok) → şimdilik geç.
P2: R (1 0 1) ≤ A ✓ → bitebilir, tahsisini bırakır: A = (3 1 1).
P3: R (2 0 1) ≤ A ✓ → bitebilir, tahsisini bırakır: A = (3 2 3).
P4: R (0 0 2) ≤ A ✓ → bitebilir, tahsisini bırakır: A = (4 3 3).
P1: R (0 1 0) ≤ A ✓ → bitebilir, tahsisini bırakır: A = (5 3 4). Tüm süreçler işaretlendi: kilitlenme yok.
A = E - (C satırlarının toplamı); hepsi işaretsiz; while (R[i] <= A olan işaretsiz Pi var) { A = A + C[i]; /* Pi biter */ Pi'yi işaretle; } if (işaretsiz kalan yok) kilitlenme yok;
Çoktan Seçmeli · Tespit ve Kurtarma
Soru 9: Bir İstek Fazlası
Önceki sorudaki durumda tek fark: P2'nin isteği (1 0 1) yerine (1 1 1). Boşta A = (1 0 1). Tespit algoritmasına göre hangi süreçler kilitlenmiştir?
D: A = (1 0 1) iken P1 ve P2 B türü ister (boşta 0), P3 A türünden 2 ister (1 var), P4 C türünden 2 ister (1 var). İlk turda hiçbir satır karşılanamaz; algoritma hemen biter ve dördü de işaretsiz kalır. Tek bir hücre sonucu tamamen değiştirir.
Çıktı Sorusu · Kaçınma
Soru 10: Tek Kaynaklı Bankacı
Tek türden 14 birim kaynak var. A 4 birim tutuyor (en çok 9), B 3 (en çok 5), C 2 (en çok 8), D 1 (en çok 6). Durum güvenli mi? Bu durumda C 3 birim daha isterse istek verilmeli mi?
Cevabı göster
| A | B | C | D | |
|---|---|---|---|---|
| Tutulan | 4 | 3 | 2 | 1 |
| İhtiyaç | 5 | 2 | 6 | 5 |
Boşta 14 − 10 = 4. B (2 ≤ 4) biter → 7; C (6 ≤ 7) → 9; D (5 ≤ 9) → 10; A → 14. Güvenli; güvenli dizi B, C, D, A (B, A, C, D de olur).
C'ye 3 verilirse boşta 1 kalır; en küçük ihtiyaç (B: 2) bile karşılanamaz → güvensiz. İstek reddedilir, C bekletilir. Kaynak fiilen boşta olduğu hâlde ertelenir: kaçınmanın bedeli budur.
Adım Adım Çalıştırma · Kaçınma
Soru 11: Güvenlik Algoritması
A, B, C türlerinden toplam 10, 6 ve 8 örnek var. Tahsis ve Max tabloda. Durum güvenli mi? Satırlar P0'dan başlayarak sırayla taranıyor.
Toplam (10 6 8) − tahsisler (7 4 6) = Available (3 2 2); İhtiyaç = Max − Tahsis. Work = Available ile başlanır.
P0: İhtiyaç (4 2 1) ≤ Work (3 2 2) değil (A türü yetmez) → şimdilik geç.
P1: İhtiyaç (1 2 1) ≤ Work ✓ → biter, tahsisini geri verir: Work = (5 2 3).
P2: İhtiyaç (4 0 2) ≤ Work ✓ → biter, tahsisini geri verir: Work = (8 3 3).
P3: İhtiyaç (2 2 1) ≤ Work ✓ → biter, tahsisini geri verir: Work = (8 5 4).
P4: İhtiyaç (4 2 1) ≤ Work ✓ → biter, tahsisini geri verir: Work = (9 5 6).
P0: İhtiyaç (4 2 1) ≤ Work ✓ → biter, tahsisini geri verir: Work = (10 6 8). Güvenli dizi: P1, P2, P3, P4, P0.
Work = Available; Finish[i] = false; while (Finish[i] == false ve Need[i] <= Work olan i var) { Work = Work + Allocation[i]; Finish[i] = true; } /* hepsi true ise güvenli */ güvenli = (tüm Finish true);
Çıktı Sorusu · Kaçınma
Soru 12: İki İstek
Önceki sorudaki duruma dönün (Available = (3 2 2)). (a) P3, (1 1 0) isterse istek hemen verilir mi? (b) Bunun yerine P4 yalnızca (0 1 0) isterse verilir mi?
Cevabı göster
(a) Verilir. İstek ≤ İhtiyaç (2 2 1) ve ≤ Available. Varmış gibi: Available (2 1 2), P3'ün ihtiyacı (1 1 1). P0, P1, P2 karşılanamaz ama P3 karşılanır → Work (3 4 3); ardından P1 (5 4 4), P2 (8 5 4), P4 (9 5 6), P0 (10 6 8). Güvenli dizi P3, P1, P2, P4, P0.
(b) Verilmez, P4 bekletilir. Available (3 1 2) olur: P0, P1, P3, P4 B türünden 2 ister (1 var), P2 A türünden 4 ister (3 var). Hiçbir satır karşılanamaz → güvensiz.
Küçük bir istek bile reddedilebilir: belirleyici olan miktar değil, isteğin ardından herkesin bitebileceği bir dizinin kalıp kalmadığıdır.
Çoktan Seçmeli · Kaçınma
Soru 13: Güvensiz Durum
Bankacı algoritmasına göre güvensiz durumdaki bir sistem için hangisi doğrudur?
B: Güvensiz durumda süreçler azami isteklerini yaparsa bitişi garanti eden bir dizi yoktur; ama süreçler bunu yapmayabilir ve kilitlenme hiç oluşmayabilir. Kilitlenmiş durumlar güvensiz durumların alt kümesidir. Kaçınma güvensiz duruma hiç girmez; süreç sonlandırmak kurtarmadır.
Çoktan Seçmeli · Önleme
Soru 14: Yazıcı Biriktirme
Süreçler yazıcıya doğrudan erişmek yerine çıktılarını diskteki bir biriktirme dizinine yazıyor; yazıcıyı yalnızca biriktirme daemon'u kullanıyor. Bu tasarım yazıcı için hangi koşulu ortadan kaldırır?
A: Süreçler açısından yazıcı artık paylaşılabilir: herkes aynı anda iş bırakabilir, gerçek aygıtı tek bir daemon kullanır. Sınır: biriktirme diski de bir kaynaktır; yarım kalmış çıktılarla dolarsa yine kilitlenme olabilir.
Çoktan Seçmeli · Önleme
Soru 15: Kaynak Numaralandırma
Kaynaklar numaralanmış: 1 görüntüleyici, 2 yazıcı, 3 çizici, 4 teyp, 5 Blu-ray. Süreç yalnızca elindekilerden büyük numaralı bir kaynak isteyebilir (hiçbirini bırakmadan). Hangi istek dizisi bu kurala uyar?
D: 2 → 4 → 5 kesin artan sıradadır. A'da teyp (4) tutulurken yazıcı (2), B'de çizici (3) tutulurken görüntüleyici (1), C'de Blu-ray (5) tutulurken çizici (3) istenir. Kural döngüyü kırar: döngüdeki en büyük numaralı kaynağı tutan süreç daha küçük numaralı bir kaynak isteyemez.
Klasik Soru · Diğer Sorunlar
Soru 16: Hatayı Sınıflandır
Her durumun kilitlenme, canlı kilit, açlık ya da atomiklik ihlalinden hangisi olduğunu gerekçesiyle yazın ve bir çare önerin.
(1) Dar bir koridorda karşılaşan iki kişi aynı anda hep aynı tarafa geçip duruyor.
(2) Düşük öncelikli bir yedekleme işi, sürekli gelen yüksek öncelikli işler yüzünden günlerdir çalışamıyor.
(3) İki banka işlemi birbirinin kilitlediği hesap kaydını bekliyor.
(4) İş parçacığı güvenli bir kuyrukta iki tüketici if (!q.isEmpty()) x = q.remove(); çalıştırıyor; ara sıra istisna oluşuyor.
Cevabı göster
- (1) Canlı kilit: ikisi de aktif ve durum değiştiriyor ama ilerleme yok. Çare: rastgele süre bekleyip yeniden denemek.
- (2) Açlık: sistem ilerliyor, yalnızca bu iş süresiz erteleniyor. Çare: yaşlanma ya da FIFO.
- (3) Kilitlenme: karşılıklı bekleme döngüsü, ikisi de bloke. Çare: kayıtları hep aynı sırayla kilitlemek ya da işlemlerden birini geri sarmak.
- (4) Atomiklik ihlali: iki çağrı ayrı ayrı güvenli, ama arada öteki tüketici son öğeyi alabilir. Çare: tek atomik işlem (
poll()) ya da ikisini aynı kilit altına almak.
Çoktan Seçmeli · Pratikte Kilitlenme
Soru 17: Ters Sıralı synchronized
Program büyük olasılıkla ne yapar? (uyu: Thread.sleep çağıran yardımcı metot)
Object a = new Object(); Object b = new Object(); Thread t1 = new Thread(() -> { synchronized (a) { uyu(50); synchronized (b) { System.out.println("T1"); } } }); Thread t2 = new Thread(() -> { synchronized (b) { uyu(50); synchronized (a) { System.out.println("T2"); } } }); t1.start(); t2.start();
C: T1 a'yı, T2 b'yi tutarken 50 ms uyur; uyanınca her biri ötekinin kilidini ister ve ikisi de BLOCKED kalır (beş denemede de program bitmedi). JVM monitörleri kesilemez; jstack kilitlenmeyi raporlar ama çözmez. Düzeltme: kilitleri her yerde aynı sırayla almak.