un

guest
1 / ?
back to lessons

Karılmış Örüntünün Nasıl Oluşturuluyor

İki alt sistem, bağımsız modüller olarak hayatlarına başlar. Zamanla, her biri paylaşılan bir tanrı nesnesinde: bir global yapısal struct, bir singleton yöneticisi, bir static sınıf ekler. Her eklenme: izolasyonunda doğru. Kombineleşme: küçük ölçekli testlerde görünmez.

Karılmış Örüntü: Sistem A ve B, snapshot veya arayüz olmadan paylaşılan durumu paylaşır

Bu kalsiyumlaşmış üç alt sistem:

VLC medya oynatıcı. Ses, video ve çalma listesi, tek bir kilit koruyan bir global oynatma durumu paylaşır. Bir zaman damgası atlamayı isteği, durumu değiştirir ve ses yumağı boşaltır. Video alt sistemi, aynı kiliti bekler ve bekler. Çalma listesi alt sistemi de aynı kiliti bekler ve öniçinlenemeyen. Sonuç: üç bağımsız alt sistem, tek bir durum nesnesi üzerinden seri hale getirilir. Performans maliyeti: N = alt sistemlerin sayısına bağlı olan ve operasyon gecikme süresine orantılı olan O(N) kilit çekişmesi.

Redis olay döngüsü. AOF fsync (disk yazma), replication (ağ yazma) ve komut yürütme (CPU) tekli olay döngüsü tarafından paylaşılır. Her biri: izolasyonunda doğru. Yavaş fsync, komut yürütme'yi durdurur. Replication gecikme, yazma yükü altında artar. Kombineleşme noktası: farklı gecikme profillerine sahip operasyonlar tarafından paylaşılan tek bir yürütme bağlamı.

LevelDB VersionSet. Yaz yolu (memtable flush) ve arka plandaki kompaksiyon paylaşılır. Bir kompaksiyon işi, yüzlerce milisaniye boyunca kiliti tutar. Yaz yolunu durdurur. Her iki işlem: gerekli. Kombineleşme: yapısal, değil zamanlama.

Eleştirel Farklılık

Karılmış Örüntü, yapısal kombineleşme değil, zamanlama sorunu. İki thread, eşzamanlı olarak paylaşılan durumu erişir. Çözüm: bir mutex ekleyin.

Karılmış Örüntü: İki alt sistem, tasarımı tarafından paylaşılan durumu paylaşır. Bir mutex eklemek, erişimini seri hale getirmez. Alt sistemler hala durumu paylaşır. Sızıntı sıkılaştırır.

VLC Karılmış Örüntüsüne bir mutex eklemek, durumu daha kötü hale getirir: Şimdi ses, video ve çalma listesi, tek bir kilit için bekleşir. Yapısal çözüm: Her alt sisteme kendi durumu verin. Faz-snapshot: Paylaşılan durumu faz sınırında dondurun, her alt sistem bağımsız olarak snapshot'ı okuyun ve sonunda yazmaları birleştirin.

Yapısal vs Zamanlama

Bir İntertangle için ana tanısal soru: bir mutex eklemek sorunu çözecek mi, yoksa durumu daha kötü hale getirecek mi?

Bir race condition: bir mutex eklemek sorunu çözer. Doğru erişim sıralaması korrupsiyonu ortadan kaldırır.

Bir İntertangle: bir mutex erişimi seri hale getirir ancak yapısal koppelajı korur. Alt sistemler hala paylaşılan state paylaşır. Yük altında, birbirlerini bloke etmeye devam eder. Engelle daha daralan.

İki alt sistem nasıl birleşebilir? Bu, sadece bir race condition mıdır ve neden yapısal değil?

Bir İntertangle Nasıl Bulunur

Üç algılama sinyali:

1. Alt sistemler arasında paylaşılan değiştirilebilir alanlar. Bir tanrı nesnesi, daha fazla alt sistem tarafından okunup yazılan alanlar. Etkilenen bir alt sistemin alan erişiminin kaldırılması, başka bir alt sistemi etkilerse, state paylaşır.

2. Farklı işlemler için aynı kilit koruyan tek kilit. Ses boşaltma ve video kodlama ve play list alma ile ilgili üç alt sistem, hepsi birbirini bekliyor. Kilit adı altında benzer olmayan işlemler kokusu.

3. Yük eklediğinde performans gerilemesi. İşlem A'nın latency'i, paralel olarak çalıştırılan işlem B'nin çalıştığı zaman artar, A ve B bağımsız görünen. Bağımsız değil: state paylaşır.

Faz Senkronizasyon Çözümü

Faz senkronizasyon düzeni:

# ÖNCE: alt sistemler doğrudan paylaşılan state'ı okuyup yazır
class GameWorld:
    position = {}  # paylaşılan değiştirilebilir
    velocity = {}  # paylaşılan değiştirilebilir

def physics_tick(world):
    for entity in world.entities:
        dünya pozisyonu[entity] += dünya hızı[entity]  # döngü ortasında paylaşılan durumu yazdır
# SONRA: örnekleme aşamasında dondurulmuş; yazmalar bir sonraki_state bufferına gider
def fizik_tik(world):
    örnek = world.don()  # değişmez görünüm
    next_state = {}
    for entity in örnek.entityler:
        next_state[entity] = örnek.pozisyon[entity] + örnek.hız[entity]
    world.birleştir(next_state)  # aşama sınırında atomik bir birleştirme

Her alt sistem örneği okur. Hiçbir alt sistem ona yazamaz. Yazmalar bir tamponda birleştirilir ve aşama sınırında atomik olarak birleştirilir. Alt sistemler şimdi bağımsız olarak çalışır: hiçbir kilit tutma, hiçbir sıralama bağımlılığı, hiçbir gizli koppelaj.

Ekleme Yap

Bir ekip, oyun motorlarının animasyon sistemi ve çarpışma sistemi, her ikisi de ortak bir entity transform nesneye yazdığını bildirdi. Her ikisi de aynı tikte çalıştırılınca, çarpışma sonuçlarının animasyonun önce mi yoksa sonra mı çalıştığına bağlı olduğunu gördüler. Mutex ekleyerek düzeni düzelttiler, ancak şimdi animasyon, geniş faz atılımı sırasında çarpışma çalıştırırken beklemeye alındı.

Eksik sınıf adını belirleyin. Mutex eklemenin çözüm olmadığını açıklayın. Yapısal düzeltmeyi tanımlayın.