Race Condition
Yarış Durumu
- Türkçe karşılığı
- yarış koşulu
- Okunuşu
- reys kındişın
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Race condition, programın sonucunun paylaşılan veriyi aynı anda kullanan thread, process veya isteklerin öngörülemeyen zamanlamasına bağlı olduğu hatadır.
Race condition (yarış durumu) nedir?
Race condition, iki ya da daha fazla işlem eşzamanlı çalıştığında, aynı veriye veya kaynağa dokunduğunda ve en az biri onu değiştirdiğinde ortaya çıkar; sonuç hangisinin önce çalıştığına bağlıdır. Zamanlama çalıştırmadan çalıştırmaya değiştiği için program binlerce kez doğru çalışıp sonra bir kez başarısız olabilir; bu da race condition'ları yeniden üretilmesi en zor hatalardan biri yapar.
Klasik örnek, aslında üç adım olan counter += 1'dir: değeri oku, bir ekle ve geri yaz. İki thread de 5'i okursa ikisi de 6 yazar ve bir artırma kaybolur. Bir diğer yaygın örüntü, bir dosyanın var olmadığını kontrol edip sonra oluşturmak gibi kontrol et-sonra-uygula (check-then-act) biçimindedir; bu sırada başka bir process araya girip onu oluşturabilir. Buna time-of-check to time-of-use (TOCTOU) denir ve aynı zamanda iyi bilinen bir güvenlik açığı sınıfıdır. Yarışlar thread'lerle sınırlı değildir: son konser biletini alan iki web isteği veya aynı dosyaya yazan iki process de yarışabilir.
Bir banka hesabını paylaşan ve 100 dolarlık bakiyeyi aynı anda iki ATM'de kontrol eden iki kişiyi düşünün. İkisi de yeterli para görür, ikisi de 80 dolar çeker ve koordinasyon olmadan banka ikisine de izin verir. Çözümler arasında mutex'ler ve diğer kilitler, atomik işlemler, uygun bir yalıtım düzeyine ya da iyimser kilitlemeye sahip veritabanı transaction'ları ve değişmez veri veya mesaj geçişi gibi paylaşılan değiştirilebilir durumdan kaçınan tasarımlar vardır. Thread sanitizer'lar ve Go'nun race detector'ı gibi araçlar testler sırasında yarışları bulmaya yardımcı olur.
Race condition'lar çoğu zaman deadlock'larla karıştırılır. Race condition'da program çalışmaya devam eder ama yanlış sonuçlar üretir; deadlock'ta ise ilerlemeyi durdurur. İkisi bağlantılıdır; çünkü bir yarışı düzeltmek için kilit eklemek, kilitler tutarsız sırayla alınırsa deadlock yaratabilir. Mutex'ler ve semaphore'lar araçlardır; race condition ise onların önlediği hatadır.
Bir bakışta
Önemli noktalar
- Race condition, sonucu eşzamanlı işlemlerin zamanlamasına bağımlı kılar.
- Oku-değiştir-yaz ve kontrol et-sonra-uygula dizileri en yaygın nedenlerdir.
- Yarışlar thread'ler, process'ler veya ayrı web istekleri arasında olabilir.
- Kilitler, atomik işlemler ve transaction'lar olağan çözümlerdir.
- Yarış yanlış sonuç verir; deadlock ise ilerlemeyi tamamen durdurur.
Örnek
// Two requests try to buy the last ticket at the same time
async function buyTicket(userId) {
const event = await db.getEvent(1); // both requests read seatsLeft = 1
if (event.seatsLeft > 0) { // both pass the check...
await db.createOrder(userId);
await db.updateEvent(1, { seatsLeft: event.seatsLeft - 1 });
}
}
await Promise.all([buyTicket("ada"), buyTicket("linus")]); // 2 orders, 1 seat
// Fix: make the check and the update one atomic step in the database:
// UPDATE events SET seats_left = seats_left - 1
// WHERE id = 1 AND seats_left > 0
// ...and create the order only if exactly one row was updated.Sık sorulan sorular
Race condition ile deadlock arasındaki fark nedir?
Race condition programın çalışmaya devam etmesine izin verir ancak veriyi bozabilir ya da yanlış sonuçlar üretebilir. Deadlock ise her biri başkasının tuttuğu bir kaynağı beklediği için ilgili thread'leri dondurur.
Tek thread'li JavaScript'te race condition olabilir mi?
Evet. Kod tek bir thread'de hiçbir zaman paralel çalışmaz, ancak her await arada başka görevlerin çalışmasına izin verir; bu yüzden iki asenkron işlem paylaşılan veri ya da harici bir veritabanı etrafında yine de iç içe geçebilir.
Data race ile race condition arasındaki fark nedir?
Data race belirli, alt düzey bir durumdur: iki thread senkronizasyon olmadan aynı belleğe aynı anda erişir ve en az biri yazar. Race condition ise zamanlamaya bağlı sonuçların daha geniş sorunudur ve her tekil erişim düzgün senkronize edilmiş olsa bile var olabilir.
İlgili sayfalar
- Mutexİşletim Sistemleri, s. 21Mutex, kodun kritik bir bölümüne aynı anda yalnızca bir thread'in girmesine izin veren bir kilittir; thread'ler paylaşılan veriyi aynı anda değiştirip bozamaz.
- Deadlockİşletim Sistemleri, s. 7Deadlock, iki ya da daha fazla thread veya process'in kaynakları bırakmaları için birbirini sonsuza dek beklediği ve hiçbirinin ilerleyemediği durumdur.
- EşzamanlılıkProgramlamanın Temelleri, s. 19Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- Threadİşletim Sistemleri, s. 34Thread, işletim sisteminin zamanlayabileceği en küçük yürütme birimidir; bir process içinde çalışır ve o process'in belleğini diğer thread'lerle paylaşır.
- İyimser KilitlemeVeritabanları, s. 15İyimser kilitleme, transaction'ları kilit tutmadan ilerleten ve çakışmaları kayıt anında sürüm numarasına bakarak yakalayan bir eşzamanlılık tekniğidir.
- Flaky TestTest ve Kalite, s. 8Flaky test, koda hiçbir değişiklik yapılmadan bazen geçen bazen başarısız olan ve sonuçlarına güvenmeyi zorlaştıran otomatik bir testtir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin