Brian Kernighan在此视频中解释了贝尔实验室基于内存限制而对小语言/程序的早期吸引力
一台大机器将是64 k字节,即K,而不是M或G,这意味着任何单个程序都不会太大,因此自然会倾向于编写小程序,然后编写管道机制,基本上是输入输出重定向,因此可以将一个程序链接到另一个程序。
但是考虑到数据必须存储在RAM中才能在程序之间传输,因此我不理解这如何限制内存使用。
来自维基百科:
在大多数类似Unix的系统中,管道的所有进程都是同时启动的[强调我的],并适当地连接它们的流,并由调度程序以及计算机上运行的所有其他进程进行管理。其中一个重要方面是将Unix管道与其他管道实现区分开来,它是缓冲的概念:例如,发送程序每秒可以产生5000个字节,而接收程序每秒只能接受100个字节,但没有。数据丢失。而是将发送程序的输出保存在缓冲区中。当接收程序准备读取数据时,管道中的下一个程序将从缓冲区读取数据。在Linux中,缓冲区的大小为65536字节(64KB)。如果需要,可以使用称为bfr的开源第三方过滤器来提供更大的缓冲区。
这使我更加困惑,因为这完全破坏了小程序的目的(尽管它们会在一定程度上模块化)。
作为第一个问题(内存限制取决于大小数据的问题),我唯一能想到的解决方案是,那时根本就不会计算大型数据集,而真正的问题管道本应解决的是程序本身所需的内存量。但是考虑到Wikipedia引号中的粗体字,即使这样也使我感到困惑:因为一次不会执行一个程序。
如果使用了临时文件,那么所有这些都将非常有意义,但是据我了解,管道不会写入磁盘(除非使用交换)。
例:
sed 'simplesubstitution' file | sort | uniq > file2
对我来说sed
很明显,正在读取文件并逐行吐出。但是sort
,正如BK在链接的视频中指出的那样,它是一个句号,因此必须将所有数据读入内存(或对吗?),然后将其传递给uniq
,(我认为)这将是一个一次在线程序。但是在第一个和第二个管道之间,所有数据都必须存储在内存中,不是吗?
unless swap is used
内存不足时总是使用swap