İç İçe Geçme Nasıl Oluşur
İki alt sistem, bağımsız modüller olarak hayata başlar. Zamanla her biri, paylaşılan bir tanrı-nesnesi üzerinde bir alan biriktirir: global bir yapılandırma yapısı, bir singleton yönetici, statik bir sınıf. Her ekleme: tek başına doğru. Bağlanma: küçük ölçekli testlerde görünmez.
Bu durumun katılaştığı üç alt yapı:
VLC medya oynatıcı. Ses, video ve oynatma listesi, global bir oynatıcı durumunu koruyan tek bir kilidi paylaşır. Bir zaman damgasına atlama isteği kilidi alır, oynatma konumunu değiştirir ve ses tamponunu temizler. Aynı kilidi bekleyen video alt sistemi durur. Oynatma listesi alt sistemi de beklediği için ön yükleme yapamaz. Sonuç: üç bağımsız alt sistem, tek bir durum nesnesi üzerinden sıralanır. Performans maliyeti: alt sistem sayısı N olmak üzere O(N) kilit çekişmesi; tümü işlem gecikmesiyle orantılıdır.
Redis olay döngüsü. AOF fsync (disk yazma), replikasyon (ağ yazma) ve komut çalıştırma (CPU) tek iş parçacıklı olay döngüsünü paylaşır. Her biri: tek başına doğru. Yavaş bir fsync komut çalıştırmayı durdurur. Replikasyon gecikmesi yazma yükü altında artar. Bağlantı noktası: farklı gecikme profillerine sahip işlemler tarafından paylaşılan tek bir yürütme bağlamı.
LevelDB VersionSet. Yazma yolu (memtable flush) ve arka plan sıkıştırma VersionSet kilidini paylaşır. Bir sıkıştırma işi kilidi onlarca milisaniye boyunca tutar. Yazma yolu durur. Her iki işlem de: gereklidir. Bağlantı: yapısal, zamanlama değil.
Kritik Ayrım
Bir Intertangle yapısal bir bağlantıya sahiptir, zamanlama sorunu değil. Bir yarış durumu: iki iş parçacığı senkronizasyon olmadan paylaşılan duruma erişir. Çözüm: bir mutex ekleyin.
Bir Intertangle: iki alt sistem tasarım gereği durumu paylaşır. Bir mutex eklemek bağlantıyı düzeltmez; erişimi sıralar. Alt sistemler hâlâ durumu paylaşır. Darboğaz sıkılaşır.
Bir VLC Intertangle'ına mutex eklemek durumu kötüleştirir: artık ses, video ve çalma listesi tek bir kilidi bekler. Yapısal çözüm: her alt sisteme kendi durumunu verin. Faz anlık görüntüsü: paylaşılan durumun anlık görüntüsünü faz sınırında dondurun, her alt sistemin anlık görüntüyü bağımsız olarak okumasına izin verin, yazmaları sonunda geri birleştirin.
Yapısal vs Zamanlama
Bir Intertangle için temel tanı sorusu: bir mutex eklemek onu düzeltir mi, yoksa daha mı kötüleştirir?
Bir yarış durumu: bir mutex eklemek sorunu çözer. Doğru erişim sıralaması bozulmayı ortadan kaldırır.
Bir Intertangle: bir mutex eklemek erişimi sıralı hale getirir ancak yapısal bağımlılığı korur. Alt sistemler hâlâ durumu paylaşır. Yük altında birbirlerini hâlâ bloke ederler. Darboğaz daralır.
Bir Intertangle Nasıl Bulunur
Üç tespit sinyali:
1. Alt sistemler arasında paylaşılan değiştirilebilir alanlar. Birden fazla alt sistem tarafından okunan ve yazılan alanlara sahip bir god-object. Bir alt sistemin alan erişimini kaldırmak başka bir alt sistemi bozuyorsa, bu alt sistemler durumu paylaşır.
2. İlişkisiz işlemleri koruyan tek mutex. Bir kilit, ses flush İLE video decode İLE playlist fetch işlemlerini koruyor: farklı gecikme profillerine sahip üç alt sistem, hepsi birbirini bekliyor. Koku: aynı kilit adı altında ilişkisiz işlemler.
3. Yük eklenirken performans gerilemesi. İşlem A'nın gecikmesi, işlem B eşzamanlı çalışırken artar, ancak A ve B bağımsız görünür. Bağımsız değillerdir: durumu paylaşırlar.
Faz-Anlık Görüntü Düzeltmesi
Faz anlık görüntü deseni:
# ÖNCE: alt sistemler paylaşılan durumu doğrudan okur ve yazar
class GameWorld:
position = {} # paylaşılan değiştirilebilir
velocity = {} # paylaşılan değiştirilebilir
def physics_tick(world):
for entity in world.entities:
world.position[entity] += world.velocity[entity] # döngü ortasında paylaşılan duruma yazar
# SONRA: fazdan önce snapshot donduruldu; yazmalar next_state tamponuna gider
def physics_tick(world):
snapshot = world.freeze() # değişmez görünüm
next_state = {}
for entity in snapshot.entities:
next_state[entity] = snapshot.position[entity] + snapshot.velocity[entity]
world.merge(next_state) # faz sınırında atomik birleştirme
Her alt sistem anlık görüntüyü okur. Hiçbir alt sistem ona yazmaz. Yazmalar bir tamponda birikir ve faz sınırında atomik olarak birleştirilir. Alt sistemler artık bağımsız çalışır: kilit çekişmesi yok, sıralama bağımlılığı yok, gizli bağlantı yok.
Düzeltmeyi Uygula
Bir ekip bir hata bildiriyor: oyun motorlarının animasyon sistemi ve çarpışma sistemi aynı varlık dönüşüm nesnesine yazıyor. İkisi aynı tick içinde çalıştığında, çarpışma sonuçları animasyonun önce çalışıp çalışmadığına bağlı oluyor. Bir mutex eklemek sıralamayı düzeltti, ancak şimdi animasyon, çarpışma geniş-faz taraması yaptığında takılıyor.