Brian Kernighan wyjaśnia w tym filmie, że wczesna atrakcja Bell Labs dla małych języków / programów opiera się na ograniczeniach pamięci
Duża maszyna miałaby 64 k-bajtów - K, a nie M lub G - a więc oznaczało to, że żaden indywidualny program nie mógł być bardzo duży, a więc naturalną tendencją było pisanie małych programów, a następnie mechanizmu potoku, w zasadzie przekierowanie danych wejściowych, umożliwiło połączenie jednego programu z drugim.
Ale nie rozumiem, w jaki sposób mogłoby to ograniczyć zużycie pamięci, biorąc pod uwagę fakt, że dane muszą być przechowywane w pamięci RAM, aby przesyłać je między programami.
Z Wikipedii :
W większości systemów uniksowych wszystkie procesy potoku są uruchamiane w tym samym czasie [moje podkreślenie], z ich strumieniami odpowiednio połączonymi i zarządzanymi przez program planujący wraz ze wszystkimi innymi procesami uruchomionymi na komputerze. Ważnym aspektem tego, odróżniającym potoki uniksowe od innych implementacji potoków, jest koncepcja buforowania: na przykład program wysyłający może wytwarzać 5000 bajtów na sekundę, a program odbierający może akceptować tylko 100 bajtów na sekundę, ale nie dane zostały utracone. Zamiast tego dane wyjściowe programu wysyłającego są przechowywane w buforze. Gdy program odbierający jest gotowy do odczytu danych, następny program w potoku czyta z bufora. W systemie Linux rozmiar bufora wynosi 65536 bajtów (64 KB). Dostępny jest filtr zewnętrznego źródła o nazwie bfr, który zapewnia większe bufory w razie potrzeby.
To jeszcze bardziej mnie dezorientuje, ponieważ całkowicie przeczy celowi małych programów (choć byłyby one modułowe do pewnej skali).
Jedyne, co mogę wymyślić jako rozwiązanie mojego pierwszego pytania (ograniczenia pamięci są problematyczne w zależności od wielkości danych), to fakt, że duże zbiory danych po prostu nie były wtedy obliczane, a prawdziwym problemem, który miały rozwiązać potoki, było: ilość pamięci wymagana przez same programy. Ale biorąc pod uwagę pogrubiony tekst w cytacie z Wikipedii, nawet to mnie dezorientuje: ponieważ jeden program nie jest wdrażany na raz.
Wszystko to miałoby sens, gdyby używane były pliki tymczasowe, ale rozumiem, że potoki nie zapisują na dysku (chyba że zostanie użyta zamiana).
Przykład:
sed 'simplesubstitution' file | sort | uniq > file2
Dla mnie jasne jest, że sed
czyta plik i wypluwa go wiersz po wierszu. Ale sort
, jak stwierdza BK w połączonym wideo, jest to kropka, więc wszystkie dane muszą zostać wczytane do pamięci (czy tak?), A następnie są przekazywane do uniq
, co (moim zdaniem) byłoby jednym -Line-at-a-time program. Ale między pierwszym i drugim potokiem wszystkie dane muszą być w pamięci, nie?
unless swap is used
Zamiana jest zawsze używana, gdy nie ma wystarczającej ilości pamięci RAM