Va notato che nei primi hardware (prima del 1960), l'I / O era molto più semplice. È possibile leggere una scheda o perforare una scheda o stampare una riga sulla stampante, ognuna con una singola istruzione: la dimensione del buffer è stata corretta e spesso anche l'indirizzo del buffer è stato corretto.
Anche nei primi anni '60, con processori più sofisticati (ad es. Il 7090), era ancora possibile leggere o perforare le carte con una piccola routine (circa 20 istruzioni), che veniva facilmente copiata in ciascun programma.
Poiché il computer era interamente dedicato a un singolo lavoro, non importava se il processore era inattivo mentre aspettava che il lettore di schede fosse pronto per leggere la scheda successiva o che la stampante di linea potesse alimentare la riga successiva.
Bene, importava, perché in realtà il tempo di elaborazione era costoso. Questo è il motivo per cui le persone hanno inventato l'elaborazione multipla, la condivisione del tempo, l'aggiunta di I / O asincroni, interruzioni e driver di dispositivo e sistemi operativi. Le interfacce hardware del dispositivo sono diventate più complesse, per il programmatore, dando accesso a registri I / O di livello inferiore, che richiedevano maggiore complessità dai driver del dispositivo. Questo costo di complessità (memoria, tempo di programmazione) è stato ammortizzato sui vari programmi utilizzando i dispositivi "contemporaneamente", moltiplicati per il sistema operativo.
Ancora negli anni 80 stavo usando un computer basato su microprocessore, emulando uno di quei sistemi più vecchi. Le istruzioni della macchina avevano un formato uniforme su 80 bit (10 ottetti) e le istruzioni per leggere il primo settore del primo disco rigido e memorizzarlo nella memoria all'indirizzo 0 erano molto convenienti: 0000000000. Quindi la procedura di avvio consisteva ogni mattina digitare questa istruzione sul terminale, che lo ha memorizzato all'indirizzo 0 ed eseguito, che quindi ha caricato il settore di avvio e ha continuato l'esecuzione all'istruzione successiva (all'indirizzo 10). Il file system consisteva in una tabella statica che associava i "nomi" dei file a intervalli di settori, che sono stati allocati manualmente! L'I / O è stato eseguito in assemblatore per quei file leggendo o scrivendo direttamente i settori, compensato dalla posizione del file sul disco rigido che è stato recuperato dal "