Brian Kernighan explique dans cette vidéo l'attrait des débuts des Bell Labs pour les petits langages / programmes basés sur des limitations de mémoire
Une grosse machine aurait 64 ko - K, pas M ou G - et cela signifiait que tout programme individuel ne pouvait pas être très grand, et il y avait donc une tendance naturelle à écrire de petits programmes, puis le mécanisme de canal, En gros, la redirection des sorties d’entrée permettait de relier un programme à un autre.
Mais je ne comprends pas comment cela pourrait limiter l'utilisation de la mémoire compte tenu du fait que les données doivent être stockées dans la RAM pour pouvoir être transmises entre programmes.
De Wikipedia :
Dans la plupart des systèmes de type Unix, tous les processus d'un pipeline sont démarrés en même temps., avec leurs flux correctement connectés et gérés par le planificateur ainsi que tous les autres processus en cours d'exécution sur la machine. Le concept de mise en mémoire tampon est un aspect important qui distingue les pipes Unix des autres implémentations de pipes: par exemple, un programme d’envoi peut produire 5 000 octets par seconde, et un programme récepteur ne peut accepter que 100 octets par seconde. les données sont perdues. Au lieu de cela, la sortie du programme d'envoi est conservée dans la mémoire tampon. Lorsque le programme récepteur est prêt à lire les données, le programme suivant du pipeline est lu dans la mémoire tampon. Sous Linux, la taille du tampon est de 65 536 octets (64 Ko). Un filtre tiers open source appelé bfr est disponible pour fournir des tampons plus volumineux si nécessaire.
Cela me confond encore plus, car cela va complètement à l'encontre de l'objectif des petits programmes (même s'ils seraient modulaires jusqu'à une certaine échelle).
La seule chose à laquelle je puisse penser comme une solution à ma première question (les limites de mémoire étant problématiques en fonction de la taille des données) serait que les grands ensembles de données n’étaient tout simplement pas calculés à l’époque et que le véritable problème que les pipelines étaient censés résoudre était la résolution. quantité de mémoire requise par les programmes eux-mêmes. Mais étant donné le texte en gras dans la citation de Wikipédia, même cela me perturbe: un programme n’est pas mis en œuvre à la fois.
Tout cela aurait beaucoup de sens si des fichiers temporaires étaient utilisés, mais je comprends que les tubes n’écrivent pas sur le disque (sauf si l’échange est utilisé).
Exemple:
sed 'simplesubstitution' file | sort | uniq > file2
Il est clair pour moi que sed
lire dans le fichier et le cracher ligne par ligne. Mais sort
, comme BK l'indique dans la vidéo liée, est un arrêt complet, de sorte que toutes les données doivent être lues en mémoire (ou le fait-il?), Puis elles sont transmises à uniq
, ce qui (à mon avis) serait un programme en ligne à la fois. Mais entre le premier et le deuxième canal, toutes les données doivent être en mémoire, non?
unless swap is used
swap est toujours utilisé quand il n'y a pas assez de RAM