什么概率分布可以模拟这种竞争状况?


10

请看下面的命令: bash -c "echo x; cat 1" | tee 1

我的理解是,它将分叉到新的shell,写入xstdout,写入file 1 not foundstderr,退出并将控制权返回给父进程,以及写入xstdout和1。因此,我希望最终输出为x,并且该文件1正好包含string x

然而,这种情况并非如此。实际上,文件1通常包含的至少两个实例x,有时包含数千行x。在运行命令一万次的批处理测试中,x写入文件的s 的平均数为52.3,中位数为1。什么概率分布可以模拟这种行为?我怀疑它是有条件的几何形状,否则是统一的。


3
它与流水线左右两侧的执行时间有关。两者同时启动或接近启动。如果tee在打开文件进行cat读取之前已经打开了文件进行写入x,则文件中可能会有很多-es。在这种情况下,只要cat读取速度快于tee写入速度,“循环”就会结束,到达文件末尾。
库萨兰达

根据此处的有限测试,x写入文件的s 的平均数量为4.35。我想这将在很大程度上取决于机器负载。
雷南'18

Answers:


1

这是一个很好奇的问题,因此我尝试在strace的帮助下进行调查。循环执行您的命令1000次:

mkdir {000..999}
for i in {000..999}; do
echo $i
(cd $i; strace -f -o trace.log bash -c 'bash -c "echo x; cat 1" | tee 1 >/dev/null'; )
done

找到行数最多的文件(wc -l */1 | sort -nr | head -n2),并检查了相应的trace.log。我当然可以看到很多:

7567  <... read resumed> "x\n", 8192)   = 2
7567  write(1, "x\n", 2)                = 2
7567  write(3, "x\n", 2)                = 2
7567  read(0,  <unfinished ...>
7568  read(3, "x\n", 131072)            = 2
7568  write(1, "x\n", 2)                = 2
7567  <... read resumed> "x\n", 8192)   = 2
7567  write(1, "x\n", 2)                = 2
7567  write(3, "x\n", 2)                = 2
7567  read(0,  <unfinished ...>
7568  read(3, "x\n", 131072)            = 2
7568  write(1, "x\n", 2)                = 2
7567  <... read resumed> "x\n", 8192)   = 2
7567  write(1, "x\n", 2)                = 2
7567  write(3, "x\n", 2)                = 2
7567  read(0,  <unfinished ...>

7567 tee 1和7568 在哪里cat 1。两者肯定是交替的,因此,是的,正如您所怀疑的,这完全与两个命令的执行时间有关(我想像是上下文切换)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.