Tail vs sleep 等待进程

问题描述 投票:0回答:1

目前我做的:

while [ -d "/proc/$PID"  ]; do
  sleep 1
done

等待进程退出。如果我将其替换为:

tail --pid=$PID -f /dev/null

这对 CPU 来说会更有效率吗?还是

tail
只是在幕后使用相同的轮询?

bash process sleep pid tail
1个回答
1
投票

假设

$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
                  ^^^^

注意事项:

  • 测试在运行于 i7-1260P 的 Win10 VM
    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
                  ^^^^
© www.soinside.com 2019 - 2024. All rights reserved.