Não, o programa não tem controle total sobre a CPU. Se fosse, então há outras coisas que parariam de funcionar, como o teclado, mouse, discos rígidos, et.c ..
Existem linhas de interrupção conectadas à CPU, que informam quando há informações vindas de um dispositivo. Um pressionamento de tecla, por exemplo, causa um sinal de interrupção, que interromperá a execução atual e iniciará um manipulador de interrupções.
Existe também um timer interno que é conectado como um dispositivo, para que o sistema operacional possa configurar o timer para produzir sinais de interrupção a uma taxa específica. Assim, o sistema operacional sempre pode recuperar o controle do processo em execução em intervalos específicos.
O processo usual ao manipular uma interrupção é que o controle retorna ao programa em execução depois que o manipulador de interrupção é concluído, mas o agendador do processo pode salvar o estado de um processo, restaurar um processo diferente e deixar o manipulador de interrupção retornar àquele processo em vez disso.
O agendador também tem outras chances de alternar entre processos. Por exemplo, quando o programa faz uma chamada de sistema para fazer E / S de disco, o agendador permite que a solicitação de E / S passe para o hardware e salva o processo em um estado de espera. Quando o disco está pronto para retornar dados, ele envia uma interrupção, para que o agendador possa voltar ao processo que está aguardando os dados.
(Uma vez eu escrevi um programa que realmente tomava controle total sobre o computador e desabilitava todas as interrupções. Eu tinha que escrever meus próprios manipuladores para entrada de teclado e mouse, e E / S de disco não funcionava naquele estado. )