Cum de a găsi motivele de blocare pentru un proces pe UNIX practic?

Pe unix, un proces este blocat, te îndoiești că este posibil să fie blocat, să găsești motivele blocării și cum să o elimini și să o eviți?

Stiu cele 4 conditii pentru impas:

  1. Excluderea reciprocă: o resursă poate fi atribuită cel mult unui proces la un moment dat (fără partajare).

  2. Țineți și așteptați: o prelucrare care deține o resursă este permisă să solicite o altă persoană.

  3. Nicio preemțiune: un proces trebuie să-și elibereze resursele; ele nu pot fi luate.

  4. Circulară așteptare: Trebuie să existe un lanț de procese astfel încât fiecare membru al lanțului să aștepte o resursă deținută de următorul membru al lanțului.

Dar, ele sunt teoretice, cum de a determina un blocaj pe unix practic? Doar prin a vedea că un proces nu face progrese? Cum să găsiți care parte din cod provoacă blocajul și motivele? Dacă vi se permite să folosiți unelte, ce poate fi folosit?

Mulțumiri

3
Această întrebare este prea generală. Dacă întrebați despre un anumit program care a fost blocat, puteți oferi detalii.
adăugat autor Dietrich Epp, sursa
Credeți că înlocuirea "procesului" cu "fir" va reprezenta mai bine întrebarea dvs.?
adăugat autor qqqqq, sursa

2 răspunsuri

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

Helgrind este un instrument Valgrind pentru detectarea erorilor de sincronizare în programele C, C ++ și Fortran care folosesc primitivele threaded pthreads POSIX.

     

Principalele abstracții din pstreadurile POSIX sunt: ​​un set de fire care împărtășesc un spațiu de adresă comun, crearea de fire, îmbinarea firelor, ieșirea thread-ului, mutexuri, variabile de stare (notificări de evenimente inter-thread) spinlocks, semafoare și bariere.

     

Helgrind poate detecta trei clase de erori, care sunt discutate în detaliu în următoarele trei secțiuni:

     
      
  1. Abuzuri ale API-ului pthreads POSIX .

  2.   
  3. Potențiale blocări din cauza problemelor de ordonare a blocării .

  4.   
  5. Cursuri de date - accesarea memoriei fără blocare sau sincronizare adecvată .

  6.   

Probleme ca acestea duc adesea la accidente nereproductibile, în funcție de calendar, în impasuri și alte comportamente greșite și pot fi dificil de găsit prin alte mijloace.

Helgrind este conștient de toate abstracțiile pthread și urmărește efectele lor cât mai exact posibil. Pe platformele x86 și amd64, înțelege și parțial manipulează blocarea implicită care rezultă din utilizarea prefixului de instrucțiuni LOCK.

Helgrind funcționează cel mai bine atunci când aplicația dvs. utilizează numai API-ul pthreads POSIX. Cu toate acestea, dacă doriți să utilizați primitive personalizate de filetare, puteți descrie comportamentul acestora la Helgrind folosind macrocomenzile ANNOTATE_ * definite în helgrind.h. Această funcție a fost adăugată în versiunea 3.5.0 a Valgrind și este considerată experimentală.

5
adăugat
1
adăugat