UNIX'teki bir işlemin kilitlenme nedenlerini pratik olarak nasıl bulunur?

Unix'te, bir süreç sıkışmış, bunun çıkmaza girebileceğinden, çıkma nedenlerini nasıl bulacağınızdan ve nasıl ortadan kaldırılacağından kuşkulandığından şüphe duyuyor musunuz?

Kilitlenme için 4 şartı biliyorum:

  1. Karşılıklı dışlama: Bir kaynak en fazla bir işlemde aynı anda atanabilir (paylaşım yok).

  2. Beklet ve bekle: Kaynak tutan bir işlemin başka bir istekte bulunmasına izin verilir.

  3. Önleme yok: Bir süreç kaynaklarını serbest bırakmalı; alınamazlar.

  4. Dairesel bekleme: Zincirin her bir üyesinin, zincirin bir sonraki üyesi tarafından tutulan bir kaynağı beklemesi için bir süreç zinciri olmalıdır.

Ancak, teorik, pratik olarak unix üzerinde bir çıkmaz nasıl belirlenir? Sadece bir sürecin ilerleme kaydetmediğini görerek? Kodun hangi bölümünün kilitlenme ve nedenlere yol açtığı nasıl bulunur? Alet kullanmanıza izin verilirse, ne kullanılabilir?

Teşekkürler

3
Bu soru çok genel. Eğer kilitlenmemiş bir program hakkında soru soruyorsanız, detay verebilirsiniz.
katma yazar Dietrich Epp, kaynak
"İşlem" kelimesini "iş parçacığı" ile değiştirmenin, sorunuzu daha iyi temsil edeceğini düşünüyor musunuz?
katma yazar qqqqq, kaynak

2 cevap

There is also Valgrind's Helgrind tool: Helgrind: a thread error detector

Helgrind, POSIX pthreads threading ilkellerini kullanan C, C ++ ve Fortran programlarındaki eşitleme hatalarını algılayan bir Valgrind aracıdır.

     

POSIX pthreads öğelerindeki ana özetlemeler şunlardır: ortak bir adres alanını paylaşan bir dizi ileti dizisi, iş parçacığı oluşturma, iş parçacığı birleştirmesi, iş parçacığı çıkışı, muteksler (kilitler), koşul değişkenleri (iş parçacığı olay bildirimleri), okuyucu-yazar kilitleri, spinlock, semafor ve engeller.

     

Helgrind, sonraki üç bölümde ayrıntılı olarak ele alınan üç hata sınıfını tespit edebilir:

     
      
  1. POSIX pthreads API'sinin kötüye kullanımı .

  2.   
  3. Kilitleme sorunlarından kaynaklanan olası kilitlenme .

  4.   
  5. Veri yarışları - belleğe erişim olmadan yeterli kilitleme veya senkronizasyon.

  6.   

Bu gibi problemler genellikle, zamana bağlı olmayan, zamanlamaya bağlı çökmeler, kilitlenmeler ve diğer yanlış davranışlarla sonuçlanır ve başka yollarla bulmak zor olabilir.

Helgrind, tüm pthread soyutlamaların farkındadır ve etkilerini olabildiğince doğru bir şekilde izler. X86 ve amd64 platformlarında, LOCK komut önekinin kullanımından kaynaklanan örtülü kilitlemeyi anlar ve kısmen işler.

Helgrind, uygulamanız yalnızca POSIX pthreads API'sini kullanıyorsa en iyi sonucu verir. Ancak, özel iş parçacığı ilkellerini kullanmak istiyorsanız, Helgrind.h dosyasında tanımlanan ANNOTATE_ * makrolarını kullanarak davranışlarını Helgrind olarak tanımlayabilirsiniz. Bu işlevsellik, Valgrind'in 3.5.0 sürümünde eklendi ve deneysel olarak kabul edildi.