Essa é uma pergunta tão antiga, vamos tentar. Como eu entendi você está usando o mecanismo anti-deadlock ( this ) para evitar inanição de seus processos normais por causa de seu processo de RT.
Você diz que
I have a simple job that requires no more than a millisecond or so of CPU time per call
É uma tarefa periódica curta ou uma tarefa curta iniciada por uma entrada externa?
Para o primeiro caso ( tarefas de curto período ): você deve saber que no kernel 3.14 do Linux ficou disponível a classe SCHED_DEADLINE
. Isso permite que você defina uma política de programação para seus processos para que eles tenham pelo menos tanto tempo de CPU periodicamente. Dê uma olhada na documentação , você também encontrará um diagrama compreensível no SCHED_DEADLINE
seção em man 7 sched . Se o gatilho for externo (aleatório, não periódico), talvez não seja a solução.
Para o segundo caso ( tarefa esporádica curta ): Se você puder afirmar que seu programa fará apenas um pequeno trabalho toda vez que for necessário, você pode tentar parar de usar prioridades e apenas chamar sched_yield depois que seu trabalho terminar. É uma abordagem ba se ocupado-pooling. Se você realmente precisa de prioridades, talvez possa complementá-lo com sleep , processos não-rt será executado enquanto o processo RT estiver inativo. Você também pode saber que, se ele for acionado por interrupções, talvez você deva usar metades inferiores , abordagem mais difícil.
Mmmm e mais: você deve ter em mente que pode aparecer mais processos em tempo real do que os seus. Por exemplo, existem threads do kernel .
Espero que ajude, com os melhores cumprimentos,
/ Ángel