Il convient de noter que dans les premiers matériels (avant 1960), les E/S étaient beaucoup plus simples. Vous pouviez lire une carte, perforer une carte ou imprimer une ligne sur l'imprimante, chaque fois avec une seule instruction : la taille de la mémoire tampon était fixe, et souvent l'adresse de la mémoire tampon l'était aussi.
Même au début des années 60, avec des processeurs plus sophistiqués (par exemple le 7090), on pouvait encore lire ou perforer des cartes avec une petite routine (environ 20 instructions), qui était facilement copiée dans chaque programme.
L'ordinateur étant entièrement dédié à une seule tâche, il importait peu que le processeur soit inactif en attendant que le lecteur de cartes soit prêt à lire la carte suivante ou que l'imprimante de ligne alimente la ligne suivante.
En fait, c'est important, parce que le temps de calcul coûte cher. C'est pourquoi on a inventé le multiprocessus, le partage du temps, les E/S asynchrones, les interruptions, les pilotes de périphériques et les systèmes d'exploitation. Les interfaces matérielles sont devenues plus complexes, pour le programmeur, en donnant accès à des registres d'E/S de niveau inférieur, ce qui exigeait une plus grande complexité de la part des pilotes de périphériques. Le coût de cette complexité (mémoire, temps de programmation) a été amorti sur plusieurs programmes utilisant les périphériques "simultanément", multiplexés par le système d'exploitation.
Encore dans les années 80, j'utilisais un ordinateur à microprocesseur, émulant l'un de ces anciens systèmes. Les instructions machine avaient un format uniforme sur 80 bits (10 octets), et l'instruction pour lire le premier secteur du premier disque dur et le stocker dans la mémoire à l'adresse 0 était très pratique : 0000000000. La procédure de démarrage consistait donc chaque matin à taper cette instruction sur le terminal, qui la stockait à l'adresse 0 et l'exécutait, qui chargeait ensuite le secteur de démarrage et poursuivait l'exécution à l'instruction suivante (à l'adresse 10). Le système de fichiers consistait en une table statique associant des "noms" de fichiers à des plages de secteurs, qui étaient alloués manuellement ! Les E/S étaient effectuées en assembleur sur ces fichiers en lisant ou en écrivant directement les secteurs, avec pour décalage la position du fichier sur le disque dur qui était récupérée par la routine "open".