Брайан Керниган объясняет в этом видео, что ранние исследования 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
своп всегда используется, когда не хватает оперативной памяти