Qual è la differenza tra un convoglio di lock e una contesa di lock/thread?

Aug 18 2020

Da wikipedia sul convoglio di serrature:

Un lock convoy si verifica quando più thread con uguale priorità si contendono ripetutamente lo stesso lock. A differenza delle situazioni di deadlock e livelock, i thread in un convoglio di lock progrediscono; tuttavia, ogni volta che un thread tenta di acquisire il blocco e fallisce, rinuncia al resto del suo quantum di pianificazione e forza un cambio di contesto. Il sovraccarico dei ripetuti cambi di contesto e il sottoutilizzo dei quanta di pianificazione degradano le prestazioni complessive.

Da wikipedia sulla contesa di lock/thread contesa:

contesa di blocco: si verifica ogni volta che un processo o un thread tenta di acquisire un blocco detenuto da un altro processo o thread. Maggiore è la granularità dei blocchi disponibili, minore è la probabilità che un processo/thread richieda un blocco gestito dall'altro. (Ad esempio, bloccare una riga anziché l'intera tabella o bloccare una cella anziché l'intera riga);

Qualcuno potrebbe per favore approfondire un po 'di più su entrambe queste cose? A me sembra che siano essenzialmente la stessa cosa, o se non lo sono, allora sicuramente la contesa di blocchi provoca un convoglio di blocchi. È così o sono concetti separati e indipendenti? Inoltre, non capisco la frase "rinuncia al resto del suo quantum di programmazione e forza un cambio di contesto".

Risposte

1 ajit Sep 03 2020 at 13:30

Esistono due approcci di blocco utilizzati negli algoritmi di blocco quando un blocco è occupato . spin wait o block (vai a dormire, abbandona il processore e attendi che il sistema operativo riattivi il thread e ripianifichi). Il blocco del convoglio come accennato avverrà quando viene utilizzata la strategia di blocco.
Il sistema operativo pianifica i thread su un core in modo suddiviso nel tempo . Ogni thread ottiene il processore per un intervallo di tempo determinato, diciamo 2 ms. Sistema operativo in un round robinfashion pianifica tutti i thread nella coda pronta uno per uno. Se dì un thread dopo che ottiene la pianificazione e inizia la sua esecuzione, diciamo dopo 100 us, chiedi un blocco. Se il blocco è occupato, il thread non è in grado di ottenere il blocco, blocca e abbandona il processore. Quindi il restante intervallo di tempo di 1,9 ms (2ms-100us) non viene utilizzato dal thread. Anche dopo essere stato risvegliato dal sistema operativo quando il blocco è libero, il thread deve attendere il proprio turno nella coda round-robin. Il numero di thread attivi potrebbe essere in 100.

La contesa di blocco provoca l'effetto convoglio.