Qual é a diferença entre um comboio de bloqueio e contenção de bloqueio/thread?

Aug 18 2020

Da wikipedia no comboio de bloqueio:

Um comboio de bloqueio ocorre quando vários threads de igual prioridade competem repetidamente pelo mesmo bloqueio. Ao contrário das situações de deadlock e livelock, os encadeamentos em um comboio de bloqueio progridem; no entanto, cada vez que um thread tenta adquirir o bloqueio e falha, ele abandona o restante de seu quantum de agendamento e força uma troca de contexto. A sobrecarga de trocas de contexto repetidas e a subutilização dos quanta de agendamento degradam o desempenho geral.

Da wikipedia sobre contenção de bloqueio/contenção de thread:

contenção de bloqueio: ocorre sempre que um processo ou thread tenta adquirir um bloqueio mantido por outro processo ou thread. Quanto mais refinados os bloqueios disponíveis, menor a probabilidade de um processo/thread solicitar um bloqueio mantido pelo outro. (Por exemplo, bloquear uma linha em vez de toda a tabela ou bloquear uma célula em vez de toda a linha.);

Alguém poderia, por favor, elaborar um pouco mais sobre essas duas coisas? Para mim, parece que eles são essencialmente os mesmos, ou se não forem, então certamente a contenção de bloqueio causa um comboio de bloqueio. É esse o caso ou são conceitos separados e independentes? Além disso, não entendo a frase "ele abre mão do restante de seu quantum de agendamento e força uma troca de contexto".

Respostas

1 ajit Sep 03 2020 at 13:30

Existem duas abordagens de bloqueio usadas em algoritmos de bloqueio quando um bloqueio está ocupado . spin wait ou block (vá dormir, libere o processador e espere que o sistema operacional desperte o thread e reprograme). O comboio de bloqueio, conforme mencionado, acontecerá quando a estratégia de bloqueio for usada.
Os encadeamentos de programação do SO em um núcleo são segmentados no tempo . Cada thread recebe o processador por uma fatia de tempo determinada, digamos 2 ms. SO em um round-robinmoda agende todos os fios na fila de pronto um por um. Se digamos que um thread depois de obter o agendamento e iniciar sua execução, digamos depois de 100 nós, peça um bloqueio. Se o bloqueio estiver ocupado, o thread incapaz de obter o bloqueio, bloqueia e desiste do processador. Portanto, a fatia de tempo restante de 1,9 ms (2 ms-100 us) não é usada pelo encadeamento. Mesmo depois de ser ativado pelo sistema operacional quando o bloqueio está livre, o encadeamento precisa aguardar sua vez na fila round-robin. O número de threads ativos pode estar em 100.

Contenção de bloqueio causa efeito de comboio.