Deadlock nedir? Oluşması için gereken dört koşul nelerdir ve nasıl önlenir?
Cevap
Deadlock (kilitlenme), iki veya daha fazla thread/process'in, her birinin diğerinin tuttuğu kaynağı beklemesi nedeniyle sonsuza kadar beklemesidir.
import threading
a, b = threading.Lock(), threading.Lock()
def t1():
with a:
with b: # t2 b'yi tutuyorsa bekler
...
def t2():
with b:
with a: # t1 a'yı tutuyorsa bekler -> deadlock
...Coffman koşulları (dördü aynı anda sağlanmalı)
- Mutual exclusion: kaynak aynı anda yalnızca bir kişi tarafından kullanılabilir.
- Hold and wait: bir kaynağı tutarken başka kaynak beklenir.
- No preemption: kaynak, sahibinden zorla alınamaz.
- Circular wait: bekleyenler döngüsel bir zincir oluşturur (A, B'yi; B, A'yı bekler).
Önleme: koşullardan birini kırmak
| Kırılan koşul | Yöntem |
|---|---|
| Circular wait | Tüm kilitleri global sabit bir sırada almak (en pratik çözüm) |
| Hold and wait | Gereken tüm kaynakları tek seferde almak |
| No preemption | tryLock ile zaman aşımı; alınamazsa tutulanları bırakıp tekrar denemek |
| Mutual exclusion | Kilitsiz (lock-free) yapılar, değişmez (immutable) veri |
def transfer(src, dst, amount):
first, second = sorted([src, dst], key=lambda acc: acc.id) # sabit sıra
with first.lock, second.lock:
src.balance -= amount
dst.balance += amountDiğer yaklaşımlar
- Kaçınma (avoidance): Banker's algoritması, kaynak tahsisini güvenli durumda tutar; pratikte nadir.
- Tespit ve kurtarma: bekleme grafiğinde döngü aranır, bir işlem sonlandırılır. Veritabanları bunu yapar: deadlock'ta bir transaction'ı kurban seçip geri alır.
Benzer kavram livelock: thread'ler bloklanmaz ama sürekli birbirine yol verip ilerleyemez.
İlgili İşletim Sistemleri soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.