Браян Керніган пояснює у цьому відео раннє залучення Bell Labs до малих мов / програм, що базується на обмеженні пам'яті
Велика машина мала б 64 кбайт - K, а не M чи G - і це означало, що будь-яка окрема програма не може бути дуже великою, і тому існувала природна тенденція писати невеликі програми, а потім механізм труби, в основному перенаправлення вводу, що дозволило з'єднати одну програму з іншою.
Але я не розумію, як це може обмежити використання пам'яті, враховуючи той факт, що дані повинні зберігатися в оперативній пам’яті для передачі між програмами.
З Вікіпедії :
У більшості Unix-подібних систем усі процеси трубопроводу запускаються одночасно [моє наголос], з їх потоками належним чином підключених та керованих планувальником разом з усіма іншими процесами, що працюють на машині. Важливим аспектом цього, що відрізняє труби Unix від інших реалізацій труб, є концепція буферизації: наприклад, програма відправлення може виробляти 5000 байт в секунду, а приймаюча програма може приймати лише 100 байт в секунду, але ні дані втрачаються. Натомість вихід програми передачі зберігається в буфері. Коли приймаюча програма готова для читання даних, наступна програма в конвеєрі зчитується з буфера. В Linux розмір буфера становить 65536 байт (64 КБ). Сторонній фільтр із відкритим кодом під назвою bfr доступний для надання більших буферів, якщо потрібно.
Це ще більше бентежить мене, оскільки це повністю перешкоджає призначенню малих програм (хоча вони будуть модульними до певного масштабу).
Єдине, що я можу розглянути як своє перше питання (обмеження пам'яті проблематично залежать від даних про розмір) - це те, що великі набори даних тоді просто не були обчислені, і справжні трубопроводи мали бути вирішені. об'єм пам'яті, необхідний самим програмам. Але з огляду на жирний текст у цитаті у Вікіпедії, це навіть мене бентежить: оскільки одна програма не реалізується одночасно.
Все це мало б великий сенс, якби використовувались тимчасові файли, але я розумію, що труби не записуються на диск (якщо не використовується swap).
Приклад:
sed 'simplesubstitution' file | sort | uniq > file2
Мені зрозуміло, що sed
це читання у файлі та виплюнення його по черзі за рядком. Але sort
, як заявляє БК у пов'язаному відео, це повна зупинка, тому всі дані повинні бути прочитані в пам’яті (чи це?), А потім передані в те uniq
, що (на мій погляд) було б одним -лінійна програма. Але між першою та другою трубкою всі дані повинні бути в пам'яті, ні?
unless swap is used
swap завжди використовується, коли не вистачає оперативної пам’яті