Execute seu segundo aplicativo na classe de prioridade fixa e com a menor prioridade possível. Se já estiver em execução, você pode configurá-lo usando seu pid:
priocntl -c FX -m 0 -p 0 -s -i pid <pid>
Ou faça no momento do lançamento:
priocntl -c FX -m 0 -p 0 -e command [arguments ...]
Editar:
Note que a classe de agendamento FX não deve ser confundida com a classe RT. Embora a classe de prioridade RT (Tempo Real) seja também uma classe de prioridade fixa, os processos que receberem uma prioridade RT anteciparão os encadeamentos do sistema (ou seja, o kernel), portanto, devem ser usados somente com processos com períodos de atividade de computação relativamente curtos. A classe RT não é absolutamente recomendada para um processo que requer 100 threads de CPU por um longo período de tempo como o que você descreve. Esse problema não existe com a classe FX, cujo intervalo de prioridades (padrão) é o mesmo que o de compartilhamento de tempo regular.
Como Yedric observou em sua resposta, definir a prioridade do processo de prioridade baixa como 0 não é suficiente para garantir que ela não seja executada quando a prioridade alta estiver ativa.
O motivo é que o último está na classe de compartilhamento de tempo, o agendador notará que um processo está aguardando há algum tempo, então reduzirá a prioridade real do processo crítico para 0, permitindo pequenas explosões de atividade da baixa prioridade processo.
Para evitar essa situação, você pode definir o processo crítico para a classe FX com uma prioridade mediana. Nesse caso, nunca se renderá ao outro:
priocntl -c FX -m 30 -p 30 -c critical_command ...