Brian Kernighan spiega in questo video la prima attrazione dei Bell Labs per i linguaggi / programmi di piccole dimensioni basati su limiti di memoria
Una grande macchina sarebbe di 64 k-byte - K, non M o G - e ciò significava che ogni singolo programma non poteva essere molto grande, e quindi c'era una naturale tendenza a scrivere piccoli programmi, e quindi il meccanismo di pipe, fondamentalmente input reindirizzamento output, ha reso possibile collegare un programma a un altro.
Ma non capisco come ciò possa limitare l'utilizzo della memoria considerando il fatto che i dati devono essere memorizzati nella RAM per trasmettere tra i programmi.
Da Wikipedia :
Nella maggior parte dei sistemi simili a Unix, tutti i processi di una pipeline vengono avviati contemporaneamente [enfasi mia], con i loro flussi opportunamente connessi e gestiti dallo scheduler insieme a tutti gli altri processi in esecuzione sulla macchina. Un aspetto importante di questo, che distingue le pipe Unix dalle altre implementazioni di pipe, è il concetto di buffering: ad esempio un programma di invio può produrre 5000 byte al secondo e un programma di ricezione può essere in grado di accettare solo 100 byte al secondo, ma no i dati vengono persi. Al contrario, l'output del programma di invio viene mantenuto nel buffer. Quando il programma ricevente è pronto per leggere i dati, il programma successivo nella pipeline legge dal buffer. In Linux, la dimensione del buffer è 65536 byte (64 KB). Un filtro di terze parti open source chiamato bfr è disponibile per fornire buffer più grandi, se necessario.
Questo mi confonde ancora di più, in quanto vanifica completamente lo scopo dei piccoli programmi (anche se sarebbero modulari fino a una certa scala).
L'unica cosa che posso pensare come una soluzione alla mia prima domanda (le limitazioni della memoria sono problematiche a seconda della dimensione dei dati) sarebbe che i grandi set di dati non erano semplicemente calcolati all'epoca e il vero problema che le pipeline del problema dovevano risolvere era il quantità di memoria richiesta dai programmi stessi. Ma dato il testo in grassetto nella citazione di Wikipedia, anche questo mi confonde: poiché un programma non è implementato alla volta.
Tutto ciò avrebbe molto senso se venissero utilizzati file temporanei, ma ho capito che i pipe non scrivono sul disco (a meno che non venga usato lo swap).
Esempio:
sed 'simplesubstitution' file | sort | uniq > file2
È chiaro per me che sed
sta leggendo il file e sputandolo riga per riga. Ma sort
, come afferma BK nel video collegato, è un punto fermo, quindi tutti i dati devono essere letti in memoria (o lo fa?), Quindi vengono passati a uniq
, che (secondo la mia mente) sarebbe uno -programma alla volta. Ma tra la prima e la seconda pipe, tutti i dati devono essere in memoria, no?
unless swap is used
lo swap viene sempre usato quando non c'è abbastanza RAM