linux环境中后台进程的优先级是什么

amb*_*air 2 unix shell operating-system process linux-kernel

我想知道操作系统如何优先考虑在Linux中执行后台进程.

假设我有以下命令,它会立即执行,还是OS会优先执行执行顺序.

nohup /bin/bash /tmp/kill_loop.sh &
Run Code Online (Sandbox Code Playgroud)

谢谢

The*_*ist 5

以相同的nice值运行的所有进程将获得相同的cpu-timeslice.

这是一个简单的测试,启动2个进程,都执行完全相同的操作.一个在后台启动,另一个在前台启动.

dd if=/dev/zero of=/dev/null bs=1 &
dd if=/dev/zero of=/dev/null bs=1
Run Code Online (Sandbox Code Playgroud)

随后运行top命令的相关提取

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1366 root      20   0  1576  532  436 R  100  0.0   0:30.79 dd
 1365 root      20   0  1576  532  436 R  100  0.0   0:30.79 dd
Run Code Online (Sandbox Code Playgroud)

接下来,如果两个进程都限制在同一个CPU中,

taskset -c 0 dd if=/dev/zero of=/dev/null bs=1 &
taskset -c 0 dd if=/dev/zero of=/dev/null bs=1
Run Code Online (Sandbox Code Playgroud)

再次从随后运行top命令的相关提取显示

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1357 root      20   0  1576  532  436 R   50  0.0   0:38.74 dd
 1358 root      20   0  1576  532  436 R   50  0.0   0:38.74 dd
Run Code Online (Sandbox Code Playgroud)

这两个进程都在争夺CPU时间片并且同样优先.

最后,

kill -SIGINT 1357 &
kill -SIGINT 1358 &
kill -SIGINT 1365 &
kill -SIGINT 1366 &
Run Code Online (Sandbox Code Playgroud)

导致相似数量的数据复制和吞吐量.

25129255+0 records in
25129255+0 records out
25129255 bytes (25 MB) copied, 34.883 s, 720 kB/s
Run Code Online (Sandbox Code Playgroud)

由于各个过程响应中断信号并停止运行的确切时刻不同,吞吐量可能会出现输出略有差异.


但是也要注意sched_autogroup_enabled存在.

如果启用,则sched_autogroup_enabled确保现在在各个shell之间执行分发cpu-timeslice的公平性.通过在各种活动shell之间平均分配cpu .

因此,如果shell启动1个进程A,
而另一个shell启动2个进程B和C,
则CPU执行时间片通常将分发为

A <-- 50%  <---- shell1 50% 
B <-- 25%  <-. 
C <-- 25%  <--`- shell2 50%
Run Code Online (Sandbox Code Playgroud)

(尽管所有3个进程A,B和C都运行在同一个很好的级别.)