Mühendislik ve bitirme projeleri · 51 / 53
Eşzamanlı yapılar, atomics ve ABA
Anla → iz sür → uygula → gerekçelendir
2 dk okuma · uygulama için ayrıca zaman ayırBir thread için doğru linked list aynı anda güncellenince doğru kalmayabilir. Atomic instruction bütün çok adımlı işlemi atomic yapmaz. Linearizability, her işlemin çağrı ve dönüşü arasında tek noktada gerçekleşmiş gibi görülebilmesini ister. Mutex uygulaması için lock kapsamı, deadlock sırası ve exception-safe release belirlenir.
Lock-free sistemin toplam ilerlemesini; wait-free her işlemin bounded adımda bitmesini hedefler. Bunlar “kilit yoksa hızlı” ile eş anlamlı değildir. CAS döngüleri contention altında tekrar eder. ABA'da adres A→B→A olur; CAS yalnız A'yı gördüğünde aradaki değişimi kaçırabilir. Version tag, hazard pointer veya epoch reclamation seçimi belleğin ne zaman yeniden kullanılacağını da kapsamalı.
Acquire/release ve relaxed atomics farklı görünürlük garantileri verir. Python GIL, bütün compound işlemleri veya farklı Python runtime'larını güvenli yapma sözleşmesi değildir. C# Interlocked ile Volatile aynı API değildir. Concurrent test, stress çalıştırmanın yanında invariant, scheduler/model-checking ve hata enjeksiyonu gerektirir. Bu ders production lock-free kod kopyalatmaz; önce bellek modeli kanıtını öğretir.
Adım adım iz sürme
İki worker eski sayaç 10'u okur, ikisi 11 yazar: bir artış kaybolur. Lock bütün read-modify-write işlemini kapsamalı.
Maliyet ve varsayımlar
Contention ve scheduler gecikmesi sequential Big-O'da görünmez. Latency dağılımını ölç.
Çalıştırılabilir örnek
Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.
from threading import Lock,Thread
lock=Lock(); counter=0
def work():
global counter
for _ in range(1000):
with lock: counter+=1
threads=[Thread(target=work) for _ in range(4)]
for t in threads:t.start()
for t in threads:t.join()
assert counter==4000KAVRADIĞINI KONTROL ET
Sıra sende
Bu testin geçmesi lock-free alternatifin doğru olduğunu kanıtlar mı?
Çözümün mantığını göster
Hayır. Bu kod mutex kullanır; finite stress çalışması bütün interleaving'leri kanıtlamaz.
Bir adım ileri
- Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
- Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
- Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.
Temel kaynaklar ve ders notları
Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.
Pat Morin · Open Data Structures ↗