Guia de rastreamento dinâmico Solaris

Testes de bloqueio de giro

Os segmentos não podem ser bloqueados em alguns contextos no kernel, tais como contexto de interrupção de alto nível e qualquer estado do distribuidor de manipulação de contexto. Nestes contextos, esta restrição impede o uso de bloqueios adaptativos. Bloqueios de giro são usados para realizar exclusão mútua de seções críticas nestes contextos. Como o nome sugere, o comportamento destes bloqueios na presença de contenção é gerar até que o bloqueio seja liberado por seu segmento proprietário. Os três testes que pertencem aos bloqueios de giro estão na Tabela 18–2.

Tabela 18–2 Testes de bloqueio de giro

spin-acquire

Teste de evento de manutenção que é acionado imediatamente depois que um bloqueio de giro é adquirido. 

spin-spin

Teste de evento de contenção que é acionado depois que um segmento girado em um bloqueio de giro mantido adquiriu o bloqueio de giro com êxito. Se ambos os testes forem ativados, spin-spin é acionado antes de spin-acquire. arg1 de spin-spin contém o tempo dos giros: a quantidade de nanossegundos gasta no estado do giro antes que o bloqueio fosse adquirido. A contagem de giros tem pouca importância, mas pode ser usada para comparar tempos de giro.

spin-release

Teste de evento de manutenção que é acionado imediatamente depois que um bloqueio de giro é liberado. 

Os bloqueios adaptativos são muito mais comuns que os bloqueios de giro. O script seguinte exibe os totais de ambos os tipos de bloqueio para fornecer dados que dêem suporte a esta observação.

lockstat:::adaptive-acquire
/execname == "date"/
{
	@locks["adaptive"] = count();
}

lockstat:::spin-acquire
/execname == "date"/
{
	@locks["spin"] = count();
}

Execute este script em uma janela e o comando date(1) em outra. Quando terminar o script do DTrace, você verá uma saída semelhante ao exemplo seguinte:


# dtrace -s ./whatlock.d
dtrace: script './whatlock.d' matched 5 probes 
^C
spin                                                             26
adaptive                                                       2981

Como esta saída indica, mais de 99% dos bloqueios adquiridos na execução do comando date são bloqueios adaptativos. Talvez seja surpreendente que tantos bloqueios sejam adquiridos quando se faz algo tão simples como executar o comando date. O grande número de bloqueios é um artefato natural do bloqueio refinado requerido de um sistema extremamente escalável como o kernel do Solaris.