Se um processo em execução bloquear na E / S
Bloquear IO é praticamente equivalente a suspender seu processo. No contexto do kernel do linux, a execução de alguma chamada do sistema de E / S, como read()
fará com que um sysenter
manipulador ou interrupção seja acionado para cuidar dessa E / S, chamando do_sys_read()
finalmente. Aqui, se a solicitação atual não puder ser satisfeita imediatamente, a função chama sched()
e, em seguida, pode executar outro processo.
No contexto de um sistema cooperativo, eu esperaria que, quando você fizer uma chamada de sistema por algum motivo de E / S, se a solicitação não puder ser atendida, o kernel escolherá outra tarefa e a executará. Este documento fornece alguns antecedentes - basicamente, se você esperou no IO, poderia ficar pendurado para sempre esperando por esse IO. A idéia do agendamento cooperativo é que você chama com frequência sched()
ou o método equivalente de renunciar à CPU, se estiver executando tarefas que exigem muita CPU.
As considerações no modo kernel ficam mais interessantes. Nas arquiteturas em que estão disponíveis, como certas plataformas incorporadas , os manipuladores de interrupções ainda serão chamados em resposta a interrupções de hardware ou software. Geralmente, é possível, em termos de implementação, desativar o tratamento de interrupções , mas isso também tem desvantagens.