O provedor plockstat disponibiliza os testes que podem ser usados para observar o comportamento dos primitivos de sincronização no nível do usuário e manter as horas. O comando plockstat(1M) é um consumidor do DTrace que usa o provedor plockstat para colher dados nos eventos de bloqueio no nível do usuário.
O provedor plockstat disponibiliza testes para os seguintes tipos de evento:
Esses testes correspondem à contenção em um primitivo de sincronização no nível do usuário, e são acionados quando um segmento é forçado a aguardar que um recurso se torne disponível. O Solaris é geralmente otimizado para o caso de não-contenção, sendo assim, a contenção prolongada não é esperada; esses testes devem ser usados para o entendimento desses casos onde acontece a contenção. Como a contenção é criada para ser (relativamente) rara, a ativação dos testes de evento de contenção geralmente não possui um efeito de teste sério; os testes podem ser ativados sem preocupação de afetar substancialmente o desempenho.
Esses testes correspondem a adquirir, liberar ou manipular um primitivo de sincronização no nível do usuário. Como tal, esses testes podem ser usados para responder a questões arbitrárias sobre a forma em que os primitivos de sincronização no nível do usuário são manipulados. Como os aplicativos geralmente adquirem e liberam os primitivos de sincronização muito freqüentemente, a ativação dos testes de evento de manutenção pode ter um maior efeito de teste do que os testes de evento de contenção. Enquanto o efeito de teste induzido pela ativação deles pode ser substancial, ele não é patológico; eles ainda podem ser ativados com confiança em aplicativos de produção.
Esses testes correspondem a qualquer tipo de comportamento anômalo encontrado ao adquirir ou liberar um primitivo de sincronização no nível do usuário. Estes eventos podem ser usados para detectar erros encontrados enquanto um segmento está bloqueando um primitivo de sincronização no nível do usuário. Os eventos de erro devem ser extremamente incomuns, sendo assim, ativá-los não deve induzir um efeito de teste sério.
Mutexes reforçam a exclusão mútua em seções críticas. Quando um segmento tentar adquirir um mutex mantido por outro segmento usando o mutex_lock(3C) ou pthread_mutex_lock(3C), ele determinará se o segmento proprietário está sendo executado em uma CPU diferente. Se for o caso, o segmento de aquisição irá girar por um curto período esperando que o mutex se torne disponível. Se o proprietário não estiver sendo executado em outra CPU, o segmento de aquisição será bloqueado.
Os quatro testes plockstat pertencentes aos mutexes estão listados na Tabela 31–1. Para cada teste, arg0 contém um ponteiro para a estrutura mutex_t ou pthread_mutex_t (estes são tipos idênticos) que representa o mutex.
Tabela 31–1 Testes de mutex
mutex-acquire |
Teste de evento de manutenção que é acionado imediatamente depois que um mutex é adquirido. arg1 contém um valor booleano que indica se a aquisição foi recursiva em um mutex recursivo. arg2 indica o número de iterações que o segmento de aquisição gastou girando neste mutex. arg2 será diferente de zero somente se o teste mutex-spin foi acionado nesta aquisição do mutex. |
mutex-block |
Teste de evento de contenção que é acionado antes de um segmento ser bloqueado em um mutex mantido. mutex-block e mutex-spin devem ser acionados por uma aquisição de bloqueio simples. |
mutex-spin |
Teste de evento de contenção que é acionado antes de um segmento começar a girar em um mutex mantido. mutex-block e mutex-spin devem ser acionados por uma aquisição de bloqueio simples. |
mutex-release |
Teste de evento de manutenção que é acionado imediatamente depois que um mutex é liberado. arg1 contém um valor booleano que indica se o evento corresponde a uma liberação recursiva em um mutex recursivo. |
mutex-error |
Teste de evento de erro que é acionado quando um erro é encontrado em uma operação de mutex. arg1 é o valor errno do erro encontrado. |
Os bloqueios de leitor/gravador permitem que vários leitores ou um único gravador, mas não ambos, existam em uma seção crítica de cada vez. Esses bloqueios são geralmente usados para estruturas que são pesquisadas mais freqüentemente do que modificadas, ou quando os segmentos gastam tempo substancial em uma seção crítica. Os usuários interagem com bloqueios de leitor/gravador usando as interfaces rwlock(3C) ou POSIX pthread_rwlock_init(3C) do Solaris .
Os testes que pertencem aos bloqueios de leitores/gravador estão na Tabela 31–2. Para cada teste, arg0 contém um ponteiro para a estrutura rwlock_t ou pthread_rwlock_t(estes são tipos idênticos) que representa o bloqueio adaptativo. arg1 contém um valor booleano que indica se a operação foi um gravador.
Tabela 31–2 Testes de bloqueio de leitores/gravador
rw-acquire |
Teste de evento de manutenção que é acionado imediatamente depois que um bloqueio de leitores/gravador é adquirido. |
rw-block |
Teste de evento de contenção que é acionado antes que um segmento seja bloqueado ao tentar adquirir um bloqueio. Se ativado, o teste rw-acquire ou o teste rw-error será acionado depois de rw-block. |
rw-release |
Teste de evento de manutenção que é acionado imediatamente depois que um bloqueio de leitor/gravador é liberado |
rw-error |
Teste de evento de erro que é acionado quando um erro é encontrado durante uma operação de bloqueio de leitor/gravador. arg1 é o valor errno do erro encontrado. |
O provedor plockstat usa o mecanismo de estabilidade do DTrace para descrever suas estabilidades, conforme mostrado na tabela seguinte. Para obter mais informações sobre o mecanismo de estabilidade, consulte o Capítulo 39Estabilidade.
Elemento |
Estabilidade de nome |
Estabilidade de dados |
Classe de dependência |
---|---|---|---|
Provedor |
Desenvolvendo |
Desenvolvendo |
ISA |
Módulo |
Privada |
Privada |
Desconhecida |
Função |
Privada |
Privada |
Desconhecida |
Nome |
Desenvolvendo |
Desenvolvendo |
ISA |
Argumentos |
Desenvolvendo |
Desenvolvendo |
ISA |