Słyszałem historię, jak Douglas Mcllroy wpadł na pomysł i jak Ken Thompson wdrożył go w ciągu jednej nocy.
O ile rozumiem, potok jest wywołaniem systemowym, które dzieli część pamięci między dwoma procesami, w których jeden proces pisze, a drugi czyta.
Jako ktoś, kto nie jest zaznajomiony z elementami wewnętrznymi i koncepcjami systemu operacyjnego, zastanawiałem się, czym dokładnie jest „geniusz” w tej historii? Czy to pomysł dwóch procesów dzielących pamięć? A może to wdrożenie? Lub obydwa?
PS: Zdaję sobie sprawę z użyteczności potoku lub jak go używać w powłoce. Pytanie dotyczy koncepcji i wdrożenia|
history
unix
process
pipelining
słaby
źródło
źródło
pipe()
syscall i|
operatora powłoki (Ref Mcilroy ). Lub, jak powiedziałby Voltaire, „ gdyby [stdio] nie istniało, konieczne byłoby wymyślenie [go]. ” :-)Odpowiedzi:
W rzeczywistości nie dotyczy to pamięci współdzielonej. Czytnik i pisarz NIE współużytkują żadnej części swojej przestrzeni adresowej i nie używają żadnej wyraźnej synchronizacji.
Procesy odczytywania i zapisywania są wywoływane
read
iwrite
wywoływane przez system dokładnie tak , jak gdyby odczytywały / zapisywały do pliku. TO jest geniusz ... innowacja: pojęcie, że (prosta) komunikacja międzyprocesowa i plikowe I / O mogą być obsługiwane w ten sam sposób ... z perspektywy programisty aplikacji i użytkownika.Po skonfigurowaniu potoku system operacyjny (nie kod aplikacji lub biblioteki w przestrzeni użytkownika) zajmuje się buforowaniem i koordynacją. Transparentnie
Natomiast przed wynalezieniem koncepcji potoku, jeśli trzeba było wykonać przetwarzanie „potokowe”, zwykle jedna aplikacja zapisuje dane wyjściowe do pliku, a następnie po zakończeniu uruchamia drugą aplikację do odczytu z pliku plik.
Alternatywnie, jeśli chcesz prawdziwego potoku, możesz zakodować obie aplikacje, aby skonfigurować (rzeczywisty) segment pamięci dzielonej i użyć semaforów (lub czegoś innego) do koordynowania odczytu / zapisu. Skomplikowane ... i w konsekwencji rzadko wykonywane.
źródło
Moim zdaniem genialność pomysłu „fajki” polega na prostocie użytkowania.
Nie musisz wykonywać żadnych wywołań systemowych, alokować pamięci, nic skomplikowanego. W powłoce, należy użyć pojedynczego znaku:
|
. Daje to niezwykłą moc w kombinacji prostych (lub złożonych) narzędzi do danego zadania.Wykonuj typowe codzienne zadania, takie jak porządne sortowanie tekstu. Możesz mieć polecenie, które wyświetla całą grupę nazw. (W moim przykładzie użyję pliku zawierającego kilka nazw, dzięki uprzejmości listofrandomnames.com.) Za pomocą potoków możesz wykonać następujące czynności:
To tylko przykład; są tysiące. Aby zapoznać się z kilkoma innymi konkretnymi zadaniami, które są znacznie łatwiejsze dzięki zastosowaniu potoków, zobacz sekcję „The Unix Philosophy” na tej stronie .
Aby podkreślić tę odpowiedź, zobacz slajdy od 4 do 9 prezentacji „Dlaczego Zsh jest chłodniejszy od twojej powłoki”.
Wiem, że powyższe polecenie zawiera kod UUOC . Daję temu spokój, ponieważ jest symbolem zastępczym dowolnego polecenia generującego tekst.
źródło
sort -u
może wykonać zadaniesort | uniq
szybciej.cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Możesz się do tego przyzwyczaić, ale wcale nie nazwałbym tego prostym. Zwłaszczaawk
część.Próbowałem więc trochę zbadać to, szukając instrukcji PDP-10 / TOPS-10, aby dowiedzieć się, jaki jest stan techniki przed wprowadzeniem rur. Znalazłem to , ale TOPS-10 jest niezwykle trudny do znalezienia w Google. Istnieje kilka dobrych referencji na temat wynalezienia potoku: wywiad z McIlroy , historia i wpływ UNIX .
Musisz umieścić to w kontekście historycznym. Istniało niewiele nowoczesnych narzędzi i udogodnień, które uważamy za coś oczywistego.
PDP-7 wygląda tak . Zwróć uwagę na brak interaktywnego wyświetlacza lub dysku twardego. „System plików” byłby przechowywany na taśmie magnetycznej. Pamięć programów i danych zawierała do 64 KB.
W tym środowisku programiści zwykle zwracali się bezpośrednio do sprzętu, na przykład wydając polecenia, aby podkręcić taśmę i przetwarzać znaki jeden po drugim odczytywane bezpośrednio z interfejsu taśmy. UNIX zapewnił abstrakcje na ten temat, aby zamiast „czytać z teletype” i „czytać z taśmy” jako oddzielne interfejsy, zostały one połączone w jeden, z kluczowym dodaniem potoku „odczyt z wyjścia innego programu bez przechowywania tymczasowej kopii na dysku” lub taśma ”.
Oto McIlroy na temat wynalazku
grep
. Myślę, że dobrze to podsumowuje ilość pracy wymaganej w środowisku starszym niż UNIX.Porównaj pierwszą część tego
cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
przykładu. Jeśli twoimi opcjami jest „budowanie linii poleceń” kontra „napisz program specjalnie do tego celu, ręcznie, w asemblerze”, to warto zbudować linię poleceń. Nawet jeśli zajmie to kilka godzin przeczytanie instrukcji (papierowych). Następnie możesz zapisać go do wykorzystania w przyszłości.źródło
Geniusz Pipe polega na tym, że łączy w sobie trzy ważne pomysły.
Po pierwsze, rury są praktyczną implementacją „wspólnych procedur”, terminu wymyślonego przez Conwaya w 1958 roku, który był obiecujący, ale nie znalazł praktycznego zastosowania przed rurami.
Po drugie, implementując rury w języku powłoki, Thompson i in. Wymyślili pierwszy prawdziwy „język kleju”.
Te dwa punkty umożliwiają wydajne opracowanie komponentów oprogramowania wielokrotnego użytku w zoptymalizowanym języku niskiego poziomu, a następnie sklejenie ze sobą w celu uzyskania znacznie większej, bardziej złożonej funkcjonalności. Nazwali to „Programowaniem na dużą skalę”.
Po trzecie, implementacja potoków przy użyciu tych samych wywołań systemowych, które były używane do dostępu do plików, umożliwiła pisanie programów z uniwersalnymi interfejsami. Pozwoliło to na prawdziwie uniwersalne rozwiązania problemów z oprogramowaniem, z których można korzystać interaktywnie, wykorzystując dane z plików oraz jako część większych systemów oprogramowania, wszystko bez jednej zmiany w komponentach oprogramowania. Bez kompilacji, bez konfiguracji, tylko kilka prostych poleceń powłoki.
Jeśli chcesz przejść przez krzywą uczenia się, oprogramowanie UNIX jest dziś równie przydatne, jak 40 lat temu. Nieustannie odkrywamy rzeczy, które już znali i opracowaliśmy rozwiązania. Kluczowym przełomem była prosta rura. Jedyną prawdziwą innowacją po tym było stworzenie Internetu w latach 80-tych. Dramatycznie UNIX spartaczył tę implementację, tworząc osobny interfejs API. Nadal ponosimy konsekwencje ... Och, tak, było coś z wyświetlaczy wideo i myszy, które stały się popularne pod koniec lat 80-tych. Ale to dotyczy WIMP.
źródło