Macos 理解管道:读取行和执行顺序
假设我运行命令Macos 理解管道:读取行和执行顺序,macos,bash,pipe,Macos,Bash,Pipe,假设我运行命令 decode_input < input.txt | intermediate_calcs | decode_output > output.txt decode_inputoutput.txt 其中每个程序从stdin读取一行输入,并在stdout上输出一行 操作系统如何运行/管理所有这些操作 1) decode\u input是否首先运行并读取input.txt中的N行,然后所有输出都通过管道传输到中间计算,中间计算读取并处理N行,最后通过管道传输到decod
decode_input < input.txt | intermediate_calcs | decode_output > output.txt
decode_inputoutput.txt
其中每个程序从stdin读取一行输入,并在stdout上输出一行
操作系统如何运行/管理所有这些操作
1) decode\u input
是否首先运行并读取input.txt
中的N行,然后所有输出都通过管道传输到中间计算
,中间计算读取并处理N行,最后通过管道传输到decode\u输出
或:
2) decode\u-input
是否从input.txt
读取一行,对其进行处理,将其输出输送到中间计算
,中间计算再次将其一行输出输送到decode\u-output
,然后将第一行输出写入output.txt
。
然后对input.txt
中的N行重复此过程
因此,如果过程以串行方式进行,如图2),如果中间步骤中的一个比另一个慢得多,这可能会非常慢?例如,如果decode\u input
花费的时间最多,那么其他两个进程必须等待decode\u input
为input.txt?
中的每一行生成输入
谢谢这是根据第2条)。但这实际上取决于每个过程是如何编写的。通常,该进程将使用某种getline()
方法,在该方法中,它将有效地阻塞,直到收到一行输入。但是,可以使用非阻塞I/O或多个线程来编写进程,这些线程将处理输入的每个字符并生成适当的输出
因此,这根本不是O/s问题。管道中的所有命令都是同时启动的。shell使用
pipe()
和fork()
系统调用来相应地设置文件描述符和未命名管道,以便每个进程都可以从stdin
读取和写入stdout
正如您所假设的,管道的速度只能与其最慢的进程一样快,因此在您的示例中,如果decode\u input
很慢,那么其他两个进程将花费大量时间等待输入
但这并不是一件坏事:如果实现正确,几乎不需要CPU时间。它们并行运行。证明:
tail-f文件| grep一些_文本
。在tail完成之前,grep已经开始工作。如果解码输入
很慢,其他进程怎么能不等待它呢?其他进程将在解码输入
输出可用时立即消耗它。例如:如果它们是逐行工作的,解码输入
一打印出一行,中间计算
就会开始读取这些行并自己产生一些输出。你说正确实现是什么意思?你是说我应该如何实现每个单独的程序(解码输入等)还是应该如何发出管道命令?Thanks@luffe当前位置不,这句话更具学术性。几乎所有的程序都是“正确”执行的。我的意思是:一种简单的方法是定期检查循环()中的I/O缓冲区,这将消耗CPU时间。因此,操作系统和大多数编程框架都提供了阻塞read()
操作,这些操作将暂停线程或进程,直到I/O可用为止,因此就是这样做的。