Como evitar que um processo C dependente de tempo mude de contexto

Como evitar que um processo C dependente de tempo mude de contexto

Temos um processo responsável por pesquisar o hardware em intervalos dependentes do tempo. Gostaríamos de dedicar um núcleo de CPU a este processo. Por exemplo, queremos que este processo permaneça executável em todos os momentos.

Nossa primeira tentativa de resolver esse problema foi a seguinte:

# Set process to highest priority
nice -n -20 cmd

# Set thread affinity in C for our hardware sampling thread
pthread_setaffinity_np(...)

Ambas as etapas acima funcionam conforme o esperado. Nosso tópico permanece core3onde o colocamos e niceestá -20no topo.

Quando reexecutar ftracecomopor esta discussãoeesse assunto, geralmente vemos o seguinte:

> cat trace | grep " 3)" | grep " => "
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 

rhd_loc-2735é o nosso processo.

Além do que foi mostrado acima, vemos muitos casos em que kworker-2703switches entram e, às vezes, outros processos de prioridade mais baixa são trocados para o núcleo.

Acreditamos que a razão para as mudanças de contexto é que nosso processo se comunica com SPI(Serial Peripheral Interface) que espera IRQse também SPIfunciona a uma taxa de clock uma ordem de magnitude mais lenta que o núcleo da CPU. Portanto, nosso processo passa grande parte do tempo aguardando SPI/IRQs, por exemplo, não está em um Runnableestado. Independentemente da prioridade ou afinidade, o kernel é livre para atribuir outros processos ao núcleo.

Isso faz com que nossa taxa de amostragem de hardware seja mais variável e menor do que poderia ser, porque nosso núcleo de CPU nem sempre está imediatamente pronto para processar o próximo valor SPIe, em seguida, enviar uma nova solicitação de amostragem.

Pergunta:

Podemos 1) forçar todos os outros processos a ficarem fora do núcleo para que nosso processo possa responder imediatamente às solicitações de interrupção ou 2) manter nosso thread principal Executável para que esteja sempre disponível para processar a próxima solicitação?

informação relacionada