As interrupções são tratadas pelo sistema operacional, os encadeamentos (ou processos, no que diz respeito ao assunto) não estão nem mesmo cientes deles.
No cenário que você pinta:
- Seu encadeamento emite uma chamada de sistema
read()
; O kernel obtém o pedido, percebe que o thread não fará nada até que os dados cheguem (bloqueio de chamadas), então o thread é bloqueado. - O kernel aloca espaço para buffers (se necessário) e inicia a dança "localizar o bloco a ser lido, solicitar que o bloco seja lido no buffer".
- O planejador seleciona outro encadeamento para usar a CPU que acabou de ser liberada
- Tudo vai bem, até ...
- ... uma interrupção chega do disco. O kernel assume, vê que isso marca a conclusão da leitura emitida antes e marca o segmento pronto. O controle retorna ao espaço do usuário.
- Tudo vai bem, até ...
- ... alguém cede a CPU por uma de mil razões, e acontece que a CPU acabada de liberar é atribuída ao encadeamento que estava esperando pelos dados.
Algo assim, de qualquer maneira. Não, a CPU não é atribuída ao encadeamento em espera quando uma interrupção acontece para sinalizar a conclusão da transferência. Pode interromper outro thread, e a execução provavelmente retoma esse thread (ou talvez outro possa ser selecionado).