İplik güvenliğini kanıtlamak mümkün mü?


10

Bu değişkenleri değiştiren değişkenlerden ve talimatlardan oluşan bir program ve bir senkronizasyon ilkesi (bir monitör, muteks, java senkronize veya C # kilidi) göz önüne alındığında, böyle bir programın iş parçacığı açısından güvenli olduğunu kanıtlamak mümkün müdür?

İplik güvenliği veya yarış koşulları gibi şeyleri tanımlamak için resmi bir model bile var mı?


2
Evet, ancak gerçek dünya dilleri, eşzamanlı semantikleri her zaman iyi tanımlanmamış / sabit olmadığı için eşek için bir acı olabilir. Ayrıca, her modelde her şey karar verilemez. Geniş bir alan; bir izlenim edinmek için Google "Eşzamanlılık Teorisi". Özellikle Petri ağlarını içeren zengin bir teori vardır.
Raphael

Yanıtlar:


10

Bir programın "iş parçacığı açısından güvenli" olduğunu kanıtlamak zordur. Bununla birlikte, "veri ırkı" terimini somut ve resmi olarak tanımlamak mümkündür. Ve bir programın belirli bir çalışmasının yürütme izinin, izin boyutuyla orantılı olarak bir veri yarışına sahip olup olmadığını belirlemek mümkündür. Bu tür analizler en azından 1988'e kadar uzanır: Barton P. Miller, Jong-Deok Choi, "Paralel Programların Etkin Hata Ayıklama Mekanizması", Conf. Prog. Lang. DSGN. ve Impl. (PLDI-1988): 135-144 .

Bir yürütme izi verildiğinde , öncelikle izdeki olaylar arasında kısmi sıradan önce gerçekleşen bir olay tanımlarız . Aynı iş parçacığında meydana gelen iki olay ve sonra veya . (Aynı evre üzerindeki olaylar, programlama dilinin sıralı anlambilimi tarafından verilen toplam bir emri oluşturur.) Senkronizasyon olayları (örneğin, muteks edinme ve bırakma olabilir), kısmi sıradan önce ek bir evreler arası olay verir. ( iş parçacığı bir muteksi serbest bırakır ve sonra iş parçacığı bu muteksi elde ederse, sürümün edinmeden önce gerçekleştiğini söyleriz.)birbbir<bb<birST

Sonra iki Verilen veri erişimleri (olan değişkenlere okur veya yazar değil eşitleme değişkenleri) ve farklı parçacığı tarafından ve ya aynı bellek konumuna olduklarını, ancak veya bir veriye olduğunu söylemek yazma işlemidir veya değilse ve arasında yarış .birbbirbbirbbir<bb<bir

C ++ 11 standart iyi bir örnektir. (İlgili bölüm, çevrimiçi kullanılabilen taslak özelliklerde 1.10'dur.) C ++ 11, senkronizasyon nesneleri (muteksler ve bir türle bildirilen değişkenler atomic<>) ve diğer tüm veriler arasında ayrım yapar . C ++ 11 spesifikasyonu, programlayıcının çok iş parçacıklı bir programın izindeki veri erişimleri hakkında, veri erişimlerinin tümü veri yarışından bağımsızsa sıralı olarak tutarlı olduğunu söyleyebilir.

Helgrind aracı (Valgrind'in bir parçası), çeşitli ticari araçlar gibi (örneğin, Intel Inspector XE) olduğu gibi, bu tür bir olaydan önce veri tabanlı algılama gerçekleştirir. Modern araçlardaki algoritmalar, her iş parçacığı ve senkronizasyonla ilişkili vektör saatlerini tutmaya dayanır. nesne. I düşünmek veri yarış tespiti için vektör saatler kullanarak bu teknik öncülük Michiel Ronsse; Koen De Bosschere: "RecPlay: tam entegre bir pratik kayıt / tekrar oynatma sistemi", ACM Trans. Comput. Sist. 17 (2): 133-152,1999 .


6

Pratik açıdan , C programlarının iplik güvenliğini resmi olarak kanıtlamak için kullanılabilecek bir doğrulama sistemi VCC vardır.

Bu web sitesinden yapılan bir alıntıdır:

VCC eşzamanlılığı destekler - hem kaba taneli hem de ince taneli eşzamanlılık kullanan programları doğrulamak için VCC'yi kullanabilirsiniz. Eşzamanlılık kontrolü ilkellerinizi doğrulamak için bile kullanabilirsiniz. Bir fonksiyonun doğrulanması, fonksiyonları ve veri yapıları üzerindeki sözleşmelere saygı duyan eşzamanlı herhangi bir ortamda iplik güvenliğini garanti eder.


2
O nasıl çalışır? Altta yatan resmi model nedir? OP'nin (sadece) bir alet istemediğini unutmayın!
Raphael

1

Bu, yarış koşullarını, bir çeşit paralel işlemenin "aşil topuğunu" dışladığı sürece programın doğruluğunu sağlamak için çok zor bir alandır. Program doğruluğu için en iyi yaklaşım genellikle düşük seviyeli ilkellerden kaçınmak ve iplik senkronizasyonunu sağlayan daha yüksek seviyeli tasarım desenleriyle (örn. Kütüphanelerden) çalışmaktır. Hoare tarafından ardışık süreçleri ileten ve geliştiricilerin kendilerini "çerçeve" ile sınırlandırdıkları göz önüne alındığında bazı doğruluk kanıtlarına sahip bir model CSP vardır. Her ne kadar sığınak (henüz?) İkisi arasında doğrudan bir bağlantı bulmasına rağmen, "boruları ve filtreleri" birleştirmek için bazı kavramsal benzerlik ve kronolojik oluşum / örtüşme vardır .

Tasarım örüntüleri aracılığıyla paralelleştirme doğruluğunu geliştirmeye çalışan ve bu amaçla standart / bilinen algoritmaların / tasarım örüntülerinin çoğuna sahip olan diğer iki çerçeve:


1
Bu iyi (programlama) bir tavsiye olabilir, ancak (CS) sorusuna hiç cevap vermez.
Raphael

1
?!? eleştiri hiç belli değil
vzn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.