目前我做的:
while [ -d "/proc/$PID" ]; do
sleep 1
done
等待进程退出。如果我将其替换为:
tail --pid=$PID -f /dev/null
这对 CPU 来说会更有效率吗?还是
tail
只是在幕后使用相同的轮询?
假设
$PID
运行10秒...
while
循环进行 10 次测试并调用 sleep
二进制文件 10 次tail
二进制文件或单个 wait
内置函数我希望
tail
和 wait
操作更“高效”。
如果没有查看
tail
的源代码,我们可以运行一些简单的测试 ...
$ cat testme.1
#!/bin/bash
sleep $1 &
pid=$!
while [ -d /proc/$pid ]; do sleep 1; done
$ cat testme.2
#!/bin/bash
sleep $1 &
pid=$!
tail --pid $pid -f /dev/null
$ cat testme.3
#!/bin/bash
sleep $1 &
wait
10 秒测试时间:
$ /usr/bin/time testme.1 10
0.07user 0.21system 0:10.36elapsed 2%CPU (0avgtext+0avgdata 98392 maxresident)k
^^ ^^ ^^^^^ ^^^^^
0inputs+0outputs (26228 major+0minor)pagefaults 0swaps
^^^^^
$ /usr/bin/time testme.2 10
0.01user 0.03system 0:10.11elapsed 1%CPU (0avgtext+0avgdata 27060 maxresident)k
^^ ^^ ^^^^^ ^^^^^
0inputs+0outputs (7207 major+0minor)pagefaults 0swaps
^^^^
$ /usr/bin/time testme.3 10
0.01user 0.01system 0:10.05elapsed 0%CPU (0avgtext+0avgdata 18484 maxresident)k
^^ ^^ ^^^^^ ^^^^^
0inputs+0outputs (4904 major+0minor)pagefaults 0swaps
^^^^
注意事项:
cygwin/bash v.4.4.12
下运行testme.1
- 10 次运行显示 2%CPU 和 3%CPU(称之为 2.5% CPU)各 5 次testme.2
- 10 次运行显示 9x 0%CPU 和 1x 1%CPU(称之为 0.1% CPU)testme.3
- 10 次运行显示 9x 0%CPU 和 1x 1%CPU(称之为 0.1% CPU)testme.3
(又名wait
)如果等待其他进程的子进程完成则不是一个有效的选项while/sleep
循环的开销随着时间显着增加,而我们看到 tail
和 wait
选项的开销几乎没有增加;例如,60 秒测试:
$ /usr/bin/time testme.1 60
0.34user 1.16system 1:01.02elapsed 2%CPU (0avgtext+0avgdata 488804 maxresident)k
^^ ^^^^ ^^^^^ ^^^^^^
0inputs+0outputs (131123 major+0minor)pagefaults 0swaps
^^^^^^
$ /usr/bin/time testme.2 60
0.03user 0.07system 1:00.34elapsed 0%CPU (0avgtext+0avgdata 26356 maxresident)k
^^ ^^ ^^^^^ ^^^^^
0inputs+0outputs (7200 major+0minor)pagefaults 0swaps
^^^^
$ /usr/bin/time testme.3 60
0.00user 0.03system 1:00.06elapsed 0%CPU (0avgtext+0avgdata 18328 maxresident)k
^^ ^^ ^^^^^ ^^^^^
0inputs+0outputs (4917 major+0minor)pagefaults 0swaps
^^^^