Outras pessoas responderam. Vou resumir os casos em que você usaria spinlock e regras para usar o spinlock.
1. Quando o spinlock é usado?
Resp: Nas seguintes situações.
- O encadeamento que contém o bloqueio não tem permissão para dormir.
- O encadeamento que está aguardando um bloqueio não dorme, mas gira em um loop apertado.
Quando usado corretamente, o spinlock pode oferecer um desempenho maior que o semáforo.
Ex: Manipulador de intromissão.
2. Quais são as regras para usar spinlocks?
Resposta:
Regra - 1: Qualquer código que contenha o spinlock, não pode abandonar o processador por qualquer motivo, exceto para interromper o serviço (às vezes nem assim). Então, o código segurando spinlock não pode dormir.
Razão: suponha que o seu motorista segurando o spinlock entra no modo de suspensão. Ex: chama a função copy_from_user()
ou copy_to_user()
, ou a preempção do kernel entra em ação, então o processo de prioridade mais alta empurrou seu código para o lado. Efetivamente, o processo abandona a CPU que contém o spinlock.
Agora não sabemos quando o código liberará o bloqueio. Se algum outro thread tentar obter o mesmo bloqueio, ele girará por muito tempo. No pior dos casos, isso resultaria em deedlock.
O caso de preempção do kernel é tratado pelo próprio código de spinlock. Sempre que o código do kernel contém um spinlock, a preempção é desativada no processador relevante. Mesmo o sistema de uniprocessador deve desativar a preempção dessa maneira.
Regra - 2: Desativa as interrupções na CPU local, enquanto o spinlock é mantido.
Razão: Apoiar seu motorista a fazer um spinlock que controle o acesso ao dispositivo e, em seguida, emita uma interrupção. Isso faz com que o manipulador de interrupção seja executado. Agora o manipulador de interrupção também precisa do bloqueio para acessar o dispositivo. Se o manipulador de interrupções for executado no mesmo processador, ele começará a girar. O código do driver também não pode ser executado para liberar o bloqueio. SO o processador girará para sempre.
Regra - 3: Os Spinlocks devem ser mantidos pelo menor tempo possível.
Razão: Longo tempo de bloqueio também mantém o processador atual de agendamento, o que significa que um processo de maior prioridade pode ter que esperar para obter a CPU.
Por isso, afeta a latência do kernel (tempo que um processo pode ter que esperar para ser agendado).
Normalmente, os spinlocks devem ser mantidos pela duração do tempo, menos do que a CPU leva para fazer uma alternância de contexto entre os threads.
Regra -4: se você tiver semáforos e spinlocks a serem pegos. Então, pegue o semáforo primeiro e depois o spinlock.