Controlando a execução do programa
Pergunta
Estou escrevendo um pequeno programa de depuração para aplicativos multithread. Minha idéia é executar o alvo, que está sendo deputado por exemplo, 100 nanosecs, depois pausar e examinar sua memória. No entanto, este (apenas pseudocode)
nanosleep(100); //sleep debuger for 100 nanosec and let a program run
kill(target_app_pid, SIGSTOP); //stop target app
Não funcionaria, porque a troca de processos poderia acontecer logo após a nanossleep e o alvo percorrer mais tempo, conforme necessário. Existe alguma maneira de dar uma fatia de tempo "definida" e depois suspender -a? A única solução que posso imaginar é adicionar chamadas do sistema e corrigir o agendador para alcançar o que eu preciso, mas isso assume grande esforço e muitos bugs. Talvez definir prioridade "em tempo real" para o processo de depurador possa ajudar? Seria uma solução limpa?
Suponha também, que eu possa ser o código -fonte do Target App. É possível configurar algum tipo de timer e dormir todo o processo após um período de tempo (muito pequeno e preciso)?
Solução
Você realmente acha que pode nanosleep
Para 100 nanossegundos? Qual é o HZ
valor em seu kernel? O mais próximo que você chega desta ordem de sono é udelay()
, mas isso está no kernel, onde você pode desativar a preempção, não em terra de usuário. Verificação de saída linux/include/delay.h
e init/calibrate.c
Na fonte do kernel Linux.
Outras dicas
Como o Linux é, na melhor das hipóteses, um sistema operacional "Soft em tempo real" (especialmente trabalhando no espaço do usuário), será difícil obter o tipo de precisão que você procura.
Se você está trabalhando em um processador incorporado, o nanosleep
e microsleep
As chamadas são frequentemente implementadas como um loop de rotação. Durante a inicialização, o processador é caracterizado para "calibrar" esse loop de spin. Ainda assim, no entanto, obter esse tipo de precisão requer uma compreensão muito detalhada da arquitetura do processador e o que está sendo executado (no nível de instrução).
As versões mais recentes do kernel Linux têm algumas implementações de timer de alta velocidade, mas você ainda está analisando a resolução de microssegundos.
Se você está executando em um sistema de desktop, não tenho idéia de por que você precisa desse nível de precisão.