Um bloqueio de rotação é uma forma de proteger um recurso compartilhado de ser modificado por dois ou mais processos simultaneamente. O primeiro processo que tenta modificar o recurso "adquire" o bloqueio e continua seu caminho, fazendo o que precisava com o recurso. Quaisquer outros processos que subseqüentemente tentam adquirir o bloqueio são interrompidos; Dizem que eles "giram no lugar" esperando que a fechadura seja liberada pelo primeiro processo, portanto, o nome "spin lock".
O kernel do Linux usa bloqueios de giro para muitas coisas, como ao enviar dados para um periférico específico. A maioria dos periféricos de hardware não é projetada para lidar com várias atualizações de estado simultâneas. Se duas modificações diferentes tiverem que acontecer, uma tem que seguir estritamente a outra, elas não podem se sobrepor. Um bloqueio de giro fornece a proteção necessária, garantindo que as modificações ocorram uma de cada vez.
Os bloqueios de rotação são um problema porque a rotação impede que o núcleo da CPU do encadeamento faça qualquer outro trabalho. Embora o kernel do Linux forneça serviços multitarefa para programas de espaço do usuário executados sob ele, esse recurso multitarefa de propósito geral não se estende ao código do kernel.
Esta situação está mudando e tem sido a maior parte da existência do Linux. Através do Linux 2.0, o kernel era quase exclusivamente um programa de tarefa única: sempre que a CPU executava o código do kernel, apenas um núcleo da CPU era usado, porque havia um único bloqueio de rotação protegendo todos os recursos compartilhados, chamado Big Kernel Lock (BKL ). Começando com o Linux 2.2, a BKL está sendo lentamente dividida em muitos bloqueios independentes, cada um protegendo uma classe de recurso mais focada. Hoje, com o kernel 2.6, o BKL ainda existe, mas é usado apenas por códigos realmente antigos que não podem ser facilmente movidos para um bloqueio mais granular. Agora é bem possível que uma caixa multicore tenha cada CPU executando código de kernel útil.
Há um limite para a utilidade de dividir o BKL porque o kernel do Linux não possui multitarefa geral. Se um núcleo da CPU ficar bloqueado girando em um bloqueio de rotação do kernel, ele não poderá ser submetido novamente, para fazer outra coisa até que o bloqueio seja liberado. Ele apenas fica e gira até que a trava seja liberada.
Os bloqueios de giro podem efetivamente transformar uma caixa de 16 núcleos de monstro em uma caixa de núcleo único, se a carga de trabalho for tal que cada núcleo esteja sempre à espera de um único bloqueio de giro. Este é o principal limite para a escalabilidade do kernel do Linux: dobrar os núcleos da CPU de 2 para 4 provavelmente irá quase dobrar a velocidade de uma caixa Linux, mas duplicá-la de 16 para 32 provavelmente não, com a maioria das cargas de trabalho. >