Yarış kondisyonu - Race condition

Mantık devresindeki yarış durumu. Burada, ∆t1 ve ∆t2 temsil etmek yayılma gecikmeleri mantık unsurlarının. Giriş değeri Bir düşükten yükseğe değiştiğinde, devre kısa bir süre artışı verir (∆t1 + ∆t2) − ∆t2 = ∆t1.

Bir yarış kondisyonu veya yarış tehlikesi şartı elektronik, yazılım, veya diğeri sistemi sistemin esaslı davranışının diğer kontrol edilemeyen olayların sırasına veya zamanlamasına bağlı olduğu durumlarda. Bir böcek olası davranışlardan biri veya daha fazlası istenmeyen olduğunda.

Dönem yarış kondisyonu 1954 yılında zaten kullanılıyordu, örneğin David A. Huffman doktora tezi "Sıralı anahtarlama devrelerinin sentezi".[1]

Yarış koşulları özellikle mantık devreleri, çok iş parçacıklı veya dağıtılmış yazılım programları.

Elektronik

Bir yarış durumunun tipik bir örneği, bir mantık kapısı aynı kaynaktan farklı yollar boyunca seyahat eden sinyalleri birleştirir. Geçidin girişleri, kaynak sinyalindeki bir değişikliğe yanıt olarak biraz farklı zamanlarda değişebilir. Çıktı, kısa bir süre için, tasarlanan duruma geri dönmeden önce istenmeyen bir duruma geçebilir. Bazı sistemler buna tahammül edebilir aksaklıklar ancak bu çıktı bir saat sinyali Örneğin, bellek içeren diğer sistemler için, sistem tasarlanmış davranışından hızlı bir şekilde ayrılabilir (gerçekte, geçici aksaklık kalıcı bir aksaklık haline gelir).

Örneğin, iki girişli bir VE kapısı bir girişte mantıksal sinyal A ile ve başka bir girişte olumsuzluğu, A DEĞİL, beslenir. Teoride çıktı (A AND NOT A) asla doğru olmamalıdır. Bununla birlikte, eğer A'nın değerindeki değişikliklerin ikinci girdiye yayılması, A yanlıştan doğruya değiştiğinde birinciye göre daha uzun sürerse, her iki girdinin de doğru olduğu kısa bir süre başlayacak ve böylece geçidin çıktısı da doğru olacaktır. .[2]

Gibi tasarım teknikleri Karnaugh haritaları tasarımcıları, sorun yaratmadan önce yarış koşullarını tanımaya ve ortadan kaldırmaya teşvik edin. Sıklıkla mantık fazlalığı bazı ırkları ortadan kaldırmak için eklenebilir.

Bu sorunların yanı sıra, bazı mantık unsurları girebilir yarı kararlı durumlar devre tasarımcıları için daha fazla sorun yaratır.

Kritik ve kritik olmayan formlar

Bir kritik yarış durumu dahili değişkenlerin değiştirildiği sıra, son durumu belirlediğinde oluşur. durum makinesi içinde bitecek.

Bir kritik olmayan yarış durumu dahili değişkenlerin değiştirildiği sıra, durum makinesinin sonunun geleceği nihai durumu belirlemediğinde oluşur.

Statik, dinamik ve temel formlar

Bir statik yarış durumu bir sinyal ve tamamlayıcısı bir araya geldiğinde oluşur.

Bir dinamik yarış durumu yalnızca biri amaçlandığında birden fazla geçişle sonuçlandığında oluşur. Kapılar arasındaki etkileşimden kaynaklanmaktadır. İki seviyeden fazla geçit kullanılmadan ortadan kaldırılabilir.

Bir temel yarış durumu bir girişin toplam geri besleme yayılma süresinden daha kısa sürede iki geçişi olduğunda oluşur. Bazen endüktif kullanılarak iyileştirilirler gecikme hattı bir giriş sinyalinin zaman süresini etkili bir şekilde artırmak için öğeler.

Yazılım

Bir bilgisayar programının düzgün çalışması için programın sırasına veya zamanlamasına bağlı olduğunda, yazılımda bir yarış koşulu ortaya çıkar. süreçler veya İş Parçacığı. Kritik yarış koşulları geçersiz yürütmeye neden olur ve yazılım hataları. Kritik yarış koşulları genellikle süreçler veya iş parçacıkları bazı paylaşılan duruma bağlı olduğunda ortaya çıkar. Paylaşılan durumlar üzerindeki işlemler şurada yapılır: kritik bölümler bu olmalı birbirini dışlayan. Bu kurala uyulmaması, paylaşılan durumu bozabilir.

Veri yarışı, bir tür yarış durumudur. Veri ırkları, çeşitli resmi biçimlerin önemli parçalarıdır. bellek modelleri. İçinde tanımlanan bellek modeli C11 ve C ++ 11 standartlar, bir veri yarışını içeren bir C veya C ++ programının tanımlanmamış davranış.[3][4]

Bir yarış koşulunun yeniden oluşturulması ve hata ayıklaması zor olabilir çünkü sonuç kararsız ve karışan iplikler arasındaki göreceli zamanlamaya bağlıdır. Bu türden sorunlar bu nedenle hata ayıklama modunda çalışırken, fazladan günlük kaydı eklerken veya bir hata ayıklayıcı eklerken ortadan kalkabilir. Hata ayıklama girişimleri sırasında bu şekilde ortadan kaybolan hatalara genellikle "Heisenbug "Bu nedenle dikkatli bir yazılım tasarımı ile yarış koşullarından kaçınmak daha iyidir.

Misal

İki iş parçacığının her birinin bir küresel tamsayı değişkeninin değerini 1 artırdığını varsayalım. İdeal olarak, aşağıdaki işlem dizisi gerçekleşir:

Konu 1Konu 2Tamsayı değeri
0
değeri oku0
değeri artırmak0
cevap yazmak1
değeri oku1
değeri artırmak1
cevap yazmak2

Yukarıda gösterilen durumda, beklendiği gibi nihai değer 2'dir. Bununla birlikte, iki iş parçacığı kilitleme veya senkronizasyon olmadan aynı anda çalışırsa, işlemin sonucu yanlış olabilir. Aşağıdaki alternatif işlem dizisi bu senaryoyu göstermektedir:

Konu 1Konu 2Tamsayı değeri
0
değeri oku0
değeri oku0
değeri artırmak0
değeri artırmak0
cevap yazmak1
cevap yazmak1

Bu durumda, nihai değer 2'nin doğru sonucu yerine 1'dir. Bunun nedeni, burada artırma işlemlerinin birbirini dışlamamasıdır. Birbirini dışlayan işlemler, bellek konumu gibi bazı kaynaklara erişilirken kesintiye uğratılamayan işlemlerdir.

Veri yarışı

Veri yarışlarının tümü, yarış koşullarının bir alt kümesi olarak görülmez.[5] Veri yarışının kesin tanımı, kullanılan resmi eşzamanlılık modeline özgüdür, ancak tipik olarak, bir iş parçacığındaki bir bellek işleminin, başka bir iş parçacığındaki bir bellek işlemiyle aynı anda bir bellek konumuna erişmeye çalışabileceği bir durumu ifade eder. tehlikeli olduğu bir bağlamda o hafıza konumuna yazmak. Bu, veri yarışlarının olmadığı bir programda, örneğin tüm hafıza erişimlerinin yalnızca kullandığı bir programda bile zamanlamadan dolayı belirsizliğe sahip olabileceğinden, bir veri yarışının yarış durumundan farklı olduğu anlamına gelir. atomik işlemler.

Bu tehlikeli olabilir çünkü birçok platformda, eğer iki iş parçacığı aynı anda bir bellek konumuna yazarsa, bellek konumunun, değerleri temsil eden bitlerin keyfi ve anlamsız bir kombinasyonu olan bir değeri tutması mümkün olabilir. her iş parçacığı yazmaya çalışıyordu; Ortaya çıkan değer hiçbir iş parçacığının yazmaya çalışmadığı bir değerse bu, bellek bozulmasına neden olabilir (bazen buna 'yırtık yazma '). Benzer şekilde, bir iş parçacığı bir konumdan başka bir iş parçacığına yazarken okursa, okuma işleminin, yazma işleminden önce bellek konumunun tuttuğu değeri temsil eden bitlerin keyfi ve anlamsız bir kombinasyonu olan bir değer döndürmesi mümkün olabilir, ve yazılan değeri temsil eden bitler.

Birçok platformda, eşzamanlı erişim için özel bellek işlemleri sağlanır; bu gibi durumlarda, tipik olarak bu özel işlemleri kullanarak eşzamanlı erişim güvenlidir, ancak diğer bellek işlemlerini kullanarak eşzamanlı erişim tehlikelidir. Bazen (eşzamanlı erişim için güvenli olan) bu tür özel işlemlere atomik veya senkronizasyon işlemler, oysa (eşzamanlı erişim için güvenli olmayan) sıradan işlemler veri operasyonlar. Muhtemelen terimin nedeni budur veri yarış; birçok platformda yarış kondisyonu sadece içeren senkronizasyon operasyonlarda, böyle bir yarış belirleyici olmayabilir ancak başka türlü güvenli olabilir; ancak veri yarış, bellek bozulmasına veya tanımsız davranışa neden olabilir.

Belirli eşzamanlılık modellerinde veri ırklarının örnek tanımları

Veri yarışının kesin tanımı, biçimsel eşzamanlılık modellerinde farklılık gösterir. Bu önemlidir, çünkü eşzamanlı davranış genellikle sezgisel değildir ve bu nedenle bazen resmi muhakeme uygulanır.

C ++ standardıtaslak N4296'da (2014-11-19)], veri yarışını bölüm 1.10.23'te (sayfa 14) aşağıdaki gibi tanımlar[6]

İki eylem potansiyel olarak eşzamanlı Eğer

  • farklı iş parçacıkları tarafından gerçekleştirilirler veya
  • sıralanmamışlardır ve en az biri bir sinyal işleyici tarafından gerçekleştirilir.

Bir programın yürütülmesi bir veri yarışı en az biri atomik olmayan potansiyel olarak eşzamanlı çakışan iki eylem içeriyorsa ve aşağıda açıklanan sinyal işleyiciler için özel durum dışında [atlanmıştır]. Bu tür herhangi bir veri yarışı, tanımlanmamış davranışla sonuçlanır.

Bu tanımın sinyal işleyicilerle ilgili kısımları C ++ 'ya özgüdür ve tipik tanımları değildir. veri yarışı.

Kağıt Zayıf Bellek Sistemlerinde Veri Yarışlarını Algılama[7] farklı bir tanım sağlar:

"iki hafıza işlemi fikir ayrılığı aynı konuma erişirlerse ve bunlardan en az biri bir yazma işlemiyse ... "İki bellek işlemi, x ve y, ardışık olarak tutarlı bir yürütmede bir yarış oluşturur 〈x, y〉, iff x ve y çatışır ve yürütmenin hb1 ilişkisi tarafından sıralanmazlar. 〈X, y〉 yarışı bir veri yarışı x veya y'den en az biri bir veri işlemidir.

Burada, aynı konuma erişen, biri yazma olan iki bellek işlemimiz var.

Hb1 ilişkisi makalenin başka bir yerinde tanımlanmıştır ve tipik bir "önce olur "ilişki; sezgisel olarak, bir X bellek işleminin başka bir Y bellek işlemi başlamadan önce tamamlanmasının garanti edildiği bir durumda olduğumuzu kanıtlayabilirsek," X, Y'den önce olur "deriz. Y'den önce ne de "Y olur - X'ten önce olur, o zaman X ve Y'nin" hb1 ilişkisi tarafından sıralanmadığını "söyleriz. Yani cümle" ... ve bunlar hb1 ilişkisine göre sıralanmaz. yürütme "sezgisel olarak" ... ve X ve Y potansiyel olarak eşzamanlıdır "şeklinde tercüme edilebilir.

Kağıt, yalnızca bellek işlemlerinden en az birinin bir "veri işlemi" olduğu durumları tehlikeli olarak değerlendirmektedir; bu makalenin diğer bölümlerinde, makale aynı zamanda bir "senkronizasyon işlemleri "veri işlemlerinin" aksine potansiyel olarak eşzamanlı kullanım için güvenlidir.

Java Dil Belirtimi[8] farklı bir tanım sağlar:

Aynı değişkene iki erişimin (okunduğu veya yazdığı), erişimlerden en az biri bir yazma ise, çelişkili olduğu söylenir ... Bir program, bir tarafından sıralanmamış iki çakışan erişim (§17.4.1) içerdiğinde ilişkiden önce olur, bir veri yarışı içerdiği söylenir ... bir veri yarışı, bir dizi için yanlış uzunluğu döndürmek gibi yanlış davranışlara neden olamaz.

C ++ yaklaşımı ile Java yaklaşımı arasındaki kritik bir fark, C ++ 'da bir veri yarışının tanımlanmamış bir davranış olması, Java'da ise bir veri yarışının sadece "iş parçacığı arası eylemleri" etkilemesidir.[8] Bu, C ++ 'da, bir veri yarışını içeren bir programı çalıştırma girişiminin (yine de spesifikasyona bağlı kalarak) çökebileceği veya güvensiz veya tuhaf davranışlar sergileyebileceği anlamına gelirken, Java'da, bir veri yarışını içeren bir programı yürütme girişimi ortaya çıkabilir. istenmeyen eşzamanlılık davranışı ancak aksi halde (uygulamanın spesifikasyona bağlı olduğu varsayılarak) güvenlidir.

DRF için SC

Veri yarışlarının önemli bir yönü, bazı bağlamlarda, veri yarışlarından bağımsız bir programın bir sırayla tutarlı tarz, programın eşzamanlı davranışı hakkında akıl yürütmeyi büyük ölçüde kolaylaştırır. Böyle bir garanti sağlayan biçimsel bellek modellerinin bir "SC for DRF" (Veri Irk Özgürlüğü için Sıralı Tutarlılık) özelliği sergilediği söylenir. Bu yaklaşımın yakın zamanda bir fikir birliğine ulaştığı söyleniyor (muhtemelen tüm durumlarda sıralı tutarlılığı garanti eden yaklaşımlarla veya bunu hiç garanti etmeyen yaklaşımlarla karşılaştırıldığında).[9]

Örneğin, Java'da bu garanti doğrudan belirtilir[8]:

Bir program, ancak ve ancak tüm ardışık olarak tutarlı yürütmelerde veri yarışları yoksa doğru şekilde senkronize edilir.

Bir program doğru şekilde senkronize edilirse, programın tüm yürütmeleri sıralı olarak tutarlı görünecektir (§17.4.3).

Bu, programcılar için son derece güçlü bir garantidir. Programcıların, kodlarının veri yarışları içerdiğini belirlemek için yeniden sıralama konusunda akıl yürütmesine gerek yoktur. Bu nedenle, kodlarının doğru bir şekilde senkronize edilip edilmediğini belirlerken yeniden sıralama hakkında akıl yürütmelerine gerek yoktur. Kodun doğru bir şekilde senkronize edildiğine dair belirleme yapıldıktan sonra, programcının yeniden sıralamaların kodunu etkileyeceğinden endişelenmesine gerek yoktur.

Kod yeniden sıralandığında gözlemlenebilecek sezgisel olmayan davranış türlerinden kaçınmak için bir program doğru şekilde senkronize edilmelidir. Doğru senkronizasyonun kullanılması, bir programın genel davranışının doğru olmasını sağlamaz. Bununla birlikte, kullanımı bir programcının bir programın olası davranışları hakkında basit bir şekilde muhakeme yapmasına izin verir; doğru şekilde senkronize edilmiş bir programın davranışı, olası yeniden sıralamalara çok daha az bağlıdır. Doğru senkronizasyon olmadan çok garip, kafa karıştırıcı ve mantıksız davranışlar mümkündür.

Buna karşılık, taslak bir C ++ belirtimi, DRF özelliği için doğrudan bir SC gerektirmez, yalnızca bunu sağlayan bir teoremin var olduğunu gözlemler:

[Not: Tüm veri yarışlarını önlemek için muteksleri ve memory_order_seq_cst işlemlerini doğru bir şekilde kullanan ve başka hiçbir senkronizasyon işlemi kullanmayan programların, kendi kurucu evreleri tarafından yürütülen işlemler, bir nesnenin her bir değer hesaplaması alınmış gibi basitçe araya sokulmuş gibi davrandığı gösterilebilir. bu serpiştirmedeki nesne üzerindeki son yan etkiden. Buna normal olarak "sıralı tutarlılık" denir. Ancak, bu yalnızca veri yarışından bağımsız programlar için geçerlidir ve veri yarışından bağımsız programlar, tek iş parçacıklı program semantiğini değiştirmeyen çoğu program dönüşümünü gözlemleyemez. Aslında, tek iş parçacıklı program dönüşümlerinin çoğuna izin verilmeye devam edilmektedir, çünkü sonuç olarak farklı davranan herhangi bir program tanımlanmamış bir işlem gerçekleştirmelidir.

C ++ taslak spesifikasyonunun, geçerli olan ancak memory_order_seq_cst dışında bir memory_order ile senkronizasyon işlemlerini kullanan programların olasılığını kabul ettiğine dikkat edin, bu durumda sonuç doğru olan ancak sıralı olarak tutarlılık garantisi verilmeyen bir program olabilir. Diğer bir deyişle, C ++ 'da bazı doğru programlar sıralı olarak tutarlı değildir. Bu yaklaşımın, C ++ programcılarına programları hakkında akıl yürütme kolaylığından vazgeçme pahasına daha hızlı program yürütme özgürlüğü verdiği düşünülmektedir.[9]

Çoğunlukla bellek modelleri biçiminde sağlanan ve çeşitli bağlamlarda verilen DRF garantileri için SC sağlayan çeşitli teoremler vardır. Bu teoremlerin önermeleri tipik olarak hem bellek modeline (ve dolayısıyla uygulama üzerine) hem de programcıya kısıtlamalar koyar; başka bir deyişle, tipik olarak teoremin öncüllerini karşılamayan ve sıralı olarak tutarlı bir şekilde yürütülmesi garanti edilemeyen programların olması durumudur.

DRF1 bellek modeli[10] DRF için SC sağlar ve WO (zayıf sıralama), RCsc (Yayın Tutarlılığı sırayla tutarlı özel işlemler), VAX bellek modeli ve veri yarışsız 0 bellek modelleri. PLpc bellek modeli[11] DRF için SC sağlar ve TSO optimizasyonlarına izin verir (Toplam Mağaza Siparişi ), PSO, PC (İşlemci Tutarlılığı ) ve RCpc (Yayın Tutarlılığı işlemci tutarlılığı özel işlemler) modelleri. DRFrlx[12] gevşemiş atomların varlığında DRF teoremi için bir SC taslağı sağlar.

Bilgisayar Güvenliği

Birçok yazılım yarış koşulu ilişkilendirilmiştir bilgisayar Güvenliği çıkarımlar. Bir yarış durumu, paylaşılan bir kaynağa erişimi olan bir saldırganın, bu kaynağı kullanan diğer aktörlerin arızalanmasına neden olarak, hizmet reddi[13] ve ayrıcalık artırma.[14][15]

Belirli bir tür yarış durumu, bir koşulu kontrol etmeyi içerir (örn. kimlik doğrulama ), daha sonra yüklem üzerinde hareket ederken, durum arasında değişebilir kontrol zamanı ve kullanım zamanı. Ne zaman bu tür böcek güvenliğe duyarlı kodda bulunur, bir güvenlik açığı deniliyor kontrol zamanı kullanım süresi (TOCTTOU) hata oluşturuldu.

Yarış koşulları ayrıca kasıtlı olarak donanım rasgele sayı üreteçleri ve fiziksel olarak klonlanamayan işlevler.[16][kaynak belirtilmeli ] PUF'ler, bir düğüme aynı yollarla devre topolojileri tasarlayarak ve hangi yolların önce tamamlanacağını rastgele belirlemek için üretim varyasyonlarına güvenerek oluşturulabilir. Üretilen her devrenin belirli yarış durumu sonuçlarının ölçülmesiyle, her devre için bir profil toplanabilir ve daha sonra bir devrenin kimliğini doğrulamak için gizli tutulabilir.

Dosya sistemleri

İki veya daha fazla program bir dosya sistemini değiştirme veya bu sisteme erişme girişimlerinde çakışabilir ve bu da veri bozulmasına veya ayrıcalık artışına neden olabilir.[14] Dosya kilitleme yaygın olarak kullanılan bir çözüm sağlar. Daha külfetli bir çözüm, sistemi tek bir süreç olacak şekilde düzenlemeyi içerir ( arka plan programı veya benzeri) dosyaya özel erişime sahiptir ve bu dosyadaki verilere erişmesi gereken diğer tüm işlemler bunu yalnızca o işlemle işlemler arası iletişim yoluyla yapar. Bu, işlem düzeyinde senkronizasyon gerektirir.

İlişkisiz programların disk alanı, bellek alanı veya işlemci döngüleri gibi kullanılabilir kaynakları aniden kullanarak birbirlerini etkileyebileceği dosya sistemlerinde farklı bir yarış durumu biçimi vardır. Bu yarış durumunu önceden tahmin etmek ve ele almak için dikkatlice tasarlanmamış yazılımlar daha sonra tahmin edilemez hale gelebilir. Çok güvenilir görünen bir sistemde böyle bir risk uzun süre göz ardı edilebilir. Ancak sonunda, yeterli veri birikebilir veya bir sistemin birçok parçasını kritik düzeyde kararsız hale getirmek için yeterli sayıda başka yazılım eklenebilir. Buna bir örnek, neredeyse kaybedilen Mars Rover "Ruh" İnişten kısa bir süre sonra. Çözüm, yazılımın bir göreve başlamadan önce ihtiyaç duyacağı tüm kaynakları talep etmesi ve ayırmasıdır; bu istek başarısız olursa, görev ertelenir ve hatanın meydana gelebileceği birçok noktadan kaçınılır. Alternatif olarak, bu noktaların her biri hata işleme ile donatılabilir veya devam etmeden önce tüm görevin başarısı daha sonra doğrulanabilir. Daha yaygın bir yaklaşım, bir göreve başlamadan önce yeterli sistem kaynağının mevcut olduğunu doğrulamaktır; ancak bu yeterli olmayabilir çünkü karmaşık sistemlerde çalışan diğer programların eylemleri tahmin edilemez olabilir.

Ağ oluşturma

Ağ oluştururken, aşağıdaki gibi dağıtılmış bir sohbet ağını düşünün: IRC, bir kanalı başlatan bir kullanıcının otomatik olarak kanal-operatör ayrıcalıklarını elde ettiği yer. Farklı sunuculardaki iki kullanıcı, aynı ağın farklı uçlarında aynı adı taşıyan kanalı aynı anda başlatmaya çalışırsa, her kullanıcının ilgili sunucusu her kullanıcıya kanal operatörü ayrıcalıkları verecektir, çünkü hiçbir sunucu henüz diğer sunucunun o kanalı tahsis ettiğine dair sinyali. (Bu sorun büyük ölçüde çözüldü çeşitli IRC sunucu uygulamaları tarafından.)

Bu bir yarış durumu durumunda, "paylaşılan kaynak ", ağdaki diğer sunuculara değişiklikler hakkında sinyal verdiği sürece her bir sunucunun serbestçe değiştirebileceği ağ durumunu (hangi kanalların mevcut olduğu ve kullanıcıların bunları başlattığı ve dolayısıyla hangi ayrıcalıklara sahip olduğu) kapsar. ağın durumuna ilişkin anlayışlarını güncelleyin. Ancak, gecikme ağ üzerinden tanımlanan yarış koşullarının türünü mümkün kılar. Bu durumda, paylaşılan kaynağa erişim üzerinde bir denetim biçimi empoze ederek yarış koşullarından sapmak - örneğin, kimin hangi ayrıcalıklara sahip olduğunu kontrol etmek için bir sunucu atamak - dağıtılmış ağı merkezi ağa dönüştürmek anlamına gelir (en azından bu tek parça için ağ işleminin).

Yarış koşulları, bir bilgisayar programı ile yazıldığında da mevcut olabilir. tıkanmayan soketler, bu durumda programın performansı ağ bağlantısının hızına bağlı olabilir.

Hayati önem taşıyan sistemler

Yazılımdaki kusurlar yaşamsal kritik sistemler felaket olabilir. Yarış koşulları, Avrupa'daki kusurlar arasındaydı. Therac-25 radyasyon tedavisi makine, en az üç hastanın ölümüne ve birkaç kişinin daha yaralanmasına neden oldu.[17]

Diğer bir örnek ise tarafından sağlanan Enerji Yönetim Sistemidir. GE Enerji ve kullanan Ohio tabanlı FirstEnergy Corp (diğer güç tesisleri arasında). Alarm alt sisteminde bir yarış durumu vardı; Üç sarkan güç hattı aynı anda açıldığında, durum izleme teknisyenlerine uyarıların iletilmesini engelledi ve sorunla ilgili farkındalıklarını geciktirdi. Bu yazılım kusuru sonunda 2003 Kuzey Amerika Kesintisi.[18] GE Energy daha sonra daha önce keşfedilmemiş hatayı düzeltmek için bir yazılım yaması geliştirdi.

Bilgi işlem dışında örnekler

Biyoloji

Nörobilim, ırk koşullarının memeli (sıçan) beyinlerinde de meydana gelebileceğini gösteriyor.[19][20]

Araçlar

Yazılımdaki yarış koşullarının tespit edilmesine yardımcı olacak birçok yazılım aracı mevcuttur. Büyük ölçüde iki gruba ayrılabilirler: statik analiz araçlar ve dinamik analiz araçlar.

İş Parçacığı Güvenliği Analizi, açıklama tabanlı prosedür içi statik analiz için statik bir analiz aracıdır, başlangıçta gcc'nin bir dalı olarak uygulanmıştır ve şimdi Clang, PThreads destekliyor.[21][birincil olmayan kaynak gerekli ]

Dinamik analiz araçları şunları içerir:

  • Intel Müfettişi, C / C ++ ve Fortran uygulamalarının güvenilirliğini, güvenliğini ve doğruluğunu artırmak için bir bellek ve iş parçacığı denetimi ve hata ayıklama aracı; Intel Danışmanı C, C ++, C # ve Fortran yazılım geliştiricileri ve mimarları için örnekleme tabanlı, SIMD vektörleştirme optimizasyonu ve paylaşılan bellek iş parçacığı yardım aracı;
  • İkili kullanan ThreadSanitizer (Valgrind tabanlı) veya kaynak, LLVM tabanlı enstrümantasyon ve PThreads destekler);[22][birincil olmayan kaynak gerekli ] ve Helgrind, a Valgrind POSIX pthreads threading primitiflerini kullanan C, C ++ ve Fortran programlarındaki senkronizasyon hatalarını tespit etmek için bir araç.[23][birincil olmayan kaynak gerekli ]
  • Veri Yarışı Dedektörü[24] Go Programlama dilinde veri yarışlarını bulmak için tasarlanmıştır.

Kıyaslamalar

Veri yarışı algılama araçlarının etkinliğini değerlendirmek için tasarlanmış birkaç kıyaslama vardır

  • DataRaceBench[25] sistematik ve kantitatif veri yarışı algılama araçlarını değerlendirmek için tasarlanmış bir kıyaslama paketidir. OpenMP.

Ayrıca bakınız

Referanslar

  1. ^ Huffman, David A. "Sıralı anahtarlama devrelerinin sentezi." (1954).
  2. ^ Unger, S.H. (Haziran 1995). "Tehlikeler, Kritik Yarışlar ve Metastabilite". Bilgisayarlarda IEEE İşlemleri. 44 (6): 754–768. doi:10.1109/12.391185.
  3. ^ "ISO / IEC 9899: 2011 - Bilgi teknolojisi - Programlama dilleri - C". Iso.org. Alındı 2018-01-30.
  4. ^ "ISO / IEC 14882: 2011". ISO. 2 Eylül 2011. Alındı 3 Eylül 2011.
  5. ^ Regehr, John (2011-03-13). "Yarış Durumu - Veri Yarışı". Academia'da yerleşik.
  6. ^ "Çalışma Taslağı, Programlama Dili için Standart C ++" (PDF). 2014-11-19.
  7. ^ Adve, Sarita & Hill, Mark & ​​Miller, Barton & H. B. Netzer, Robert. (1991). Zayıf Bellek Sistemlerinde Veri Yarışlarını Algılama. ACM SIGARCH Bilgisayar Mimarisi Haberleri. 19. 234-243. 10.1109 / ISCA.1991.1021616.
  8. ^ a b c "Bölüm 17. İplikler ve Kilitler". docs.oracle.com.
  9. ^ a b Adve, Sarita V .; Boehm, Hans-J. (2010). "Paylaşılan Değişkenlerin Anlamları ve Senkronizasyon (a.k.a. Bellek Modelleri)" (PDF).
  10. ^ Adve, Sarita. (1994). Paylaşılan Bellek Çok İşlemcileri İçin Bellek Tutarlılık Modelleri Tasarlama.
  11. ^ Kourosh Gharachorloo ve Sarita V. Adve ve Anoop Gupta ve John L. Hennessy ve Mark D. Hill, Farklı Bellek Tutarlılık Modelleri için Programlama, PARALEL VE ​​DAĞITILMIŞ BİLGİSAYAR DERGİSİ, 1992, cilt 15, sayfa 399-407
  12. ^ Sinclair, Matthew David (2017). "Bölüm 3: Gevşemiş Atomiklerin Etkin Desteklenmesi ve Değerlendirilmesi" (PDF). Özelleştirilmiş Bellek Hiyerarşileri için Etkin Tutarlılık ve Tutarlılık (Doktora). Urbana-Champaign'deki Illinois Üniversitesi.
  13. ^ "CVE-2015-8461: Soket hatalarını işlerken ortaya çıkan bir yarış durumu, resolver.c'de bir onaylama hatasına yol açabilir". İnternet Sistemleri Konsorsiyumu. Alındı 5 Haziran 2017.
  14. ^ a b "Rmtree () ve remove_tree () 'deki güvenlik açığı: CVE-2017-6512". CPAN. Alındı 5 Haziran 2017.
  15. ^ "güvenlik: durum önbelleği * çok büyük * yarış koşulu follow_symlink devre dışı bırakıldığında önbelleğe alma". lighttpd. Alındı 5 Haziran 2017.
  16. ^ Colesa, Adrian; Tudoran, Radu; Banescu Sebastian (2008). "Yarış Koşullarına Göre Yazılım Rastgele Sayı Üretimi". 2008 10. Uluslararası Bilimsel Hesaplama için Sembolik ve Sayısal Algoritmalar Sempozyumu: 439–444. doi:10.1109 / synasc.2008.36. ISBN  978-0-7695-3523-4. S2CID  1586029.
  17. ^ Leveson, Nancy; Turner, Clark S. "Therac-25 Kazalarının İncelenmesi - I". Courses.cs.vt.edu. Arşivlenen orijinal 2017-12-15 tarihinde.
  18. ^ Poulsen, Kevin (2004-04-07). "Karartma hatasını izleme". Güvenlik Odağı. Alındı 2011-09-19.
  19. ^ "Beyinler Yanlış Hareketleri İptal Etmek İçin Nasıl Yarışıyor". Nöroskeptik. Dergiyi Keşfedin. 2013-08-03.
  20. ^ Schmidt, Robert; Leventhal, Daniel K; Mallet, Nicolas; Chen, Fujun; Berke, Joshua D (2013). "Eylemleri iptal etmek, bazal gangliyon yolları arasındaki bir yarışı içerir". Doğa Sinirbilim. 16 (8): 1118–24. doi:10.1038 / nn.3456. PMC  3733500. PMID  23852117.
  21. ^ "Diş Güvenliği Analizi - Clang 10 belgeleri". clang.llvm.org.
  22. ^ "ThreadSanitizer - Clang 10 belgeleri". clang.llvm.org.
  23. ^ "Helgrind: iş parçacığı hatası algılayıcı". Valgrind.
  24. ^ "Veri Yarışı Dedektörü". Golang.
  25. ^ "Veri yarışı karşılaştırma paketi". 25 Temmuz 2019 - GitHub aracılığıyla.

Dış bağlantılar