Perché l'I / O è ininterrotto?


11

Qual è la logica alla base del rendere l'I / O ininterrotto? Quali sarebbero le conseguenze negative se un processo che gestisce l'I / O fosse autorizzato a gestire un segnale?


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.
Peter Cordes,

Risposte:


9

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.


5

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:

  1. La parola "ininterrotto" dovrebbe riferirsi a "sonno ininterrotto". Quando un processo è in modalità di sonno ininterrotto, NON può essere svegliato da segnali, né può gestire segnali.
  2. Un processo gestisce i segnali quando: a. è in esecuzione in modalità kernel e sta per tornare alla modalità utente. b. sta per entrare e uscire dallo stato di sonno quando il sonno è interrompibile.
  3. Cosa succede quando un processo di sonno viene svegliato da un segnale? Gestirebbe il segnale, con l'azione predefinita che esce dal processo. Quando un processo è in attesa del completamento dell'I / O, ovviamente non si desidera che esca prematuramente.

2

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.


3
Prova a leggere un CD graffiato.
Giosuè,

1
O montare con sshfs e quindi tirare il cavo di rete. La sospensione ininterrotta si verifica, anche al giorno d'oggi, quando i supporti / archiviazione sottostanti agiscono. E di solito è un dolore sanguinante nel culo da affrontare.
Nubarke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.