Risposte:
Qualsiasi I / O viene gestito da una chiamata di sistema invocata da un processo. Alla fine, una tale chiamata di sistema scenderà fino ad alcune appropriate funzioni del driver di dispositivo di basso livello per eseguire l'operazione I / O effettiva.
L'I / O può essere complicato: per ottenere effettivamente i dati dentro e fuori dal dispositivo, potrebbe essere necessario seguire vari passaggi, in ordine e possibilmente con i requisiti di temporizzazione. Se questi passaggi non vengono completati atomicamente, al successivo tentativo, il dispositivo potrebbe non rispondere, comportarsi in modo errato o persino causare il blocco del sistema. Questi passaggi possono essere diversi e unici per ogni dispositivo, quindi perché ci sono così tanti driver di dispositivo.
Un driver di dispositivo ben scritto dovrebbe sapere come gestire il dispositivo che sta cercando di riparare, quindi normalmente non dovrebbe riscontrare problemi a meno che non ci sia un bug del driver, non si stia utilizzando il driver sbagliato per il dispositivo o il dispositivo fisico non funzioni.
Ora che ho letto il libro "Il design dei sistemi operativi Unix" di Maurice Bach, vorrei rispondere a questa domanda da solo.
In breve, rendere l'I / O ininterrotto ha lo scopo di far terminare il task I / O al più presto, senza essere disturbato dai segnali.
Alcune conoscenze correlate che ho acquisito dal libro:
Alcuni percorsi di codice nel kernel sono contrassegnati ininterrottamente, principalmente perché il codice deve rispettare un tempismo rigoroso (per rispondere a un dispositivo) o perché sta facendo qualcosa che non ammette interferenze. Nel caso di Linux, la maggior parte dei primi è stata spostata su gradini indipendenti nel kernel, mentre i secondi sono stati per lo più sradicati (sospetto per lo più sotto pressione dalle attuali macchine multi-CPU). Cioè, è da un po 'di tempo che non vedo un processo in sonno ininterrotto.
write(2)
è consentito restituire in anticipo, restituendo il conteggio dei byte effettivi scritto, che può essere inferiore alla lunghezza del buffer passata come terzo argomento.