说我运行命令
decode_input < input.txt | intermediate_calcs | decode_output > output.txt
其中每个程序从stdin读取一行输入,并在stdout上输出一行。
操作系统如何运行/管理所有这些操作?
1)decode_input
首先运行并从input.txt
读取N行,然后所有输出都通过管道传输到intermediate_calcs
,它读取并处理N行,最后通过管道传递给{ {1}}?
OR:
2)decode_output
是否从decode_input
读取一行行,处理它,将其输出通过管道传输到input.txt
,再次管道其一行输出到intermediate_calcs
的行,然后第一行输出写入decode_output
。
然后对output.txt
?
因此,如果进程是串行进行的,如2),如果其中一个中间步骤比另一个慢得多,这可能会非常慢?例如。如果input.txt
花费的时间最多,则其他2个流程必须等待decode_input
为decode_input
谢谢
答案 0 :(得分:1)
按照2)。但这实际上取决于每个流程的编写方式。通常,该过程将使用某种getline()
方法,它将有效阻止,直到它收到一行输入值。但是,可以使用非阻塞I / O或多个线程来编写进程,这些线程将处理输入的每个字符并生成适当的输出。
因此,根本不是O / S问题。
答案 1 :(得分:1)
管道中的所有命令都是同时启动的。 shell使用pipe()
和fork()
系统调用来相应地设置文件描述符和未命名的管道,以便每个进程可以从stdin
读取并写入stdout
。
就像你假设的那样,管道只能和最慢的流程一样快,所以在你的例子中,如果decode_input
很慢,其他两个进程将花费很多时间等待输入。
但这不是一件坏事:如果正确实施,几乎不会花费任何CPU时间。