Bölüm 7: Kilitlenme

Bölüm 7: Kilitlenme · Çalışma Soruları
KaynaklarDört koşulTahsis çizgesiStratejilerTespitBankacı algoritmasıÖnlemeCanlı kilit ve açlıkJava'da kilitlenme
Sercan KÜLCÜ

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

ABr1r2

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?

P1R1P2R3P3R2P4

Kesikli ok istek (süreç → kaynak), düz ok atama (örnek → süreç). Hiçbir kaynakta boş örnek yok.

P1R1P2R3P3R2P4

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.

P1R1P2R3P3R2P4

P4 hiçbir şey beklemiyor: biter ve R1 örneğini bırakır.

P1R1P2R3P3R2P4

P1'in R1 isteği karşılanır; P1 biter, R1 ve R2'yi bırakır.

P1R1P2R3P3R2P4

P3 R2'yi alır, biter; R2 ve R3 boşalır.

P1R1P2R3P3R2P4

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 ABCDE

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.

A (boşta) = (1 0 1)SüreçTahsis Cİstek RP1(1 0 1)(0 1 0)P2(2 1 0)(1 0 1)P3(0 1 2)(2 0 1)P4(1 1 0)(0 0 2)

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.

A (boşta) = (1 0 1)SüreçTahsis Cİstek RP1(1 0 1)(0 1 0)P2(2 1 0)(1 0 1)P3(0 1 2)(2 0 1)P4(1 1 0)(0 0 2)

P1: R (0 1 0) ≤ A (1 0 1) değil (B türünden boş yok) → şimdilik geç.

A (boşta) = (3 1 1)SüreçTahsis Cİstek RP1(1 0 1)(0 1 0)P2(2 1 0)(1 0 1)✓P3(0 1 2)(2 0 1)P4(1 1 0)(0 0 2)

P2: R (1 0 1) ≤ A ✓ → bitebilir, tahsisini bırakır: A = (3 1 1).

A (boşta) = (3 2 3)SüreçTahsis Cİstek RP1(1 0 1)(0 1 0)P2(2 1 0)(1 0 1)✓P3(0 1 2)(2 0 1)✓P4(1 1 0)(0 0 2)

P3: R (2 0 1) ≤ A ✓ → bitebilir, tahsisini bırakır: A = (3 2 3).

A (boşta) = (4 3 3)SüreçTahsis Cİstek RP1(1 0 1)(0 1 0)P2(2 1 0)(1 0 1)✓P3(0 1 2)(2 0 1)✓P4(1 1 0)(0 0 2)✓

P4: R (0 0 2) ≤ A ✓ → bitebilir, tahsisini bırakır: A = (4 3 3).

A (boşta) = (5 3 4)SüreçTahsis Cİstek RP1(1 0 1)(0 1 0)✓P2(2 1 0)(1 0 1)✓P3(0 1 2)(2 0 1)✓P4(1 1 0)(0 0 2)✓

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
ABCD
Tutulan4321
İhtiyaç5265

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.

Work = (3 2 2)SüreçTahsisMaxİhtiyaçP0(1 1 2)(5 3 3)(4 2 1)P1(2 0 1)(3 2 2)(1 2 1)P2(3 1 0)(7 1 2)(4 0 2)P3(0 2 1)(2 4 2)(2 2 1)P4(1 0 2)(5 2 3)(4 2 1)

Toplam (10 6 8) − tahsisler (7 4 6) = Available (3 2 2); İhtiyaç = Max − Tahsis. Work = Available ile başlanır.

Work = (3 2 2)SüreçTahsisMaxİhtiyaçP0(1 1 2)(5 3 3)(4 2 1)P1(2 0 1)(3 2 2)(1 2 1)P2(3 1 0)(7 1 2)(4 0 2)P3(0 2 1)(2 4 2)(2 2 1)P4(1 0 2)(5 2 3)(4 2 1)

P0: İhtiyaç (4 2 1) ≤ Work (3 2 2) değil (A türü yetmez) → şimdilik geç.

Work = (5 2 3)SüreçTahsisMaxİhtiyaçP0(1 1 2)(5 3 3)(4 2 1)P1(2 0 1)(3 2 2)(1 2 1)✓P2(3 1 0)(7 1 2)(4 0 2)P3(0 2 1)(2 4 2)(2 2 1)P4(1 0 2)(5 2 3)(4 2 1)

P1: İhtiyaç (1 2 1) ≤ Work ✓ → biter, tahsisini geri verir: Work = (5 2 3).

Work = (8 3 3)SüreçTahsisMaxİhtiyaçP0(1 1 2)(5 3 3)(4 2 1)P1(2 0 1)(3 2 2)(1 2 1)✓P2(3 1 0)(7 1 2)(4 0 2)✓P3(0 2 1)(2 4 2)(2 2 1)P4(1 0 2)(5 2 3)(4 2 1)

P2: İhtiyaç (4 0 2) ≤ Work ✓ → biter, tahsisini geri verir: Work = (8 3 3).

Work = (8 5 4)SüreçTahsisMaxİhtiyaçP0(1 1 2)(5 3 3)(4 2 1)P1(2 0 1)(3 2 2)(1 2 1)✓P2(3 1 0)(7 1 2)(4 0 2)✓P3(0 2 1)(2 4 2)(2 2 1)✓P4(1 0 2)(5 2 3)(4 2 1)

P3: İhtiyaç (2 2 1) ≤ Work ✓ → biter, tahsisini geri verir: Work = (8 5 4).

Work = (9 5 6)SüreçTahsisMaxİhtiyaçP0(1 1 2)(5 3 3)(4 2 1)P1(2 0 1)(3 2 2)(1 2 1)✓P2(3 1 0)(7 1 2)(4 0 2)✓P3(0 2 1)(2 4 2)(2 2 1)✓P4(1 0 2)(5 2 3)(4 2 1)✓

P4: İhtiyaç (4 2 1) ≤ Work ✓ → biter, tahsisini geri verir: Work = (9 5 6).

Work = (10 6 8)SüreçTahsisMaxİhtiyaçP0(1 1 2)(5 3 3)(4 2 1)✓P1(2 0 1)(3 2 2)(1 2 1)✓P2(3 1 0)(7 1 2)(4 0 2)✓P3(0 2 1)(2 4 2)(2 2 1)✓P4(1 0 2)(5 2 3)(4 2 1)✓

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.

Son

Bölüm 7: Kilitlenme: Çalışma Soruları
Konu anlatımı: Kilitlenme sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.