Respostas:
Qualquer E / S é tratada por uma chamada do sistema chamada por um processo. Eventualmente, uma chamada do sistema chegará a uma função apropriada de driver de dispositivo de baixo nível para executar a operação de E / S real.
A E / S pode ser complicada - para realmente entrar e sair de dados do dispositivo, várias etapas podem precisar ser seguidas, em ordem e possivelmente com os requisitos de tempo. Se essas etapas não forem concluídas atomicamente, na próxima vez em que forem tentadas, o dispositivo poderá não responder, se comportar mal ou até causar o bloqueio do sistema. Essas etapas podem ser diferentes e exclusivas para cada dispositivo, portanto, por que existem tantos drivers de dispositivo.
Um driver de dispositivo bem escrito deve saber como lidar com o dispositivo que está tentando reparar, portanto, normalmente não deve ter problemas, a menos que haja um bug no driver, você esteja usando o driver errado para o dispositivo ou o dispositivo físico esteja falhando.
Agora que li o livro "O design dos sistemas operacionais Unix", de Maurice Bach, deixe-me responder a essa pergunta sozinho.
Em resumo, tornar a E / S ininterrupta é o objetivo de fazer com que a tarefa de E / S termine o mais rápido possível, sem ser interferida por sinais.
Algum conhecimento relacionado que adquiri com o livro:
Alguns caminhos de código no kernel são marcados como ininterruptos, principalmente porque o código precisa cumprir um tempo estrito (para responder a um dispositivo) ou porque está fazendo algo que não admite interferências. No caso do Linux, a maioria foi direcionada para etapas independentes no kernel, e as segundas foram erradicadas (suspeito principalmente sob pressão das atuais máquinas com várias CPUs). Ou seja, já faz algum tempo que não vejo um processo em sono ininterrupto.
write(2)
tem permissão para retornar mais cedo, retornando a contagem de bytes real gravada, que pode ser menor que o tamanho do buffer passado como o terceiro argumento.