linux 环境中后台进程的优先级是多少

What is the priority of background processes in linux environment

我想知道 OS 如何优先执行 Linux 中的后台进程。

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

nohup /bin/bash /tmp/kill_loop.sh &

谢谢

Linux 内核中的进程优先级由 NICE 值 给出。 参考link http://en.wikipedia.org/wiki/Nice_(Unix)

nice 值(范围在 -20 到 +19 之间)定义进程优先级,-20 是最高优先级任务。通常 user-space 进程被赋予默认的 nice 值“0”。您可以使用以下命令检查 shell 上 运行 进程的 nice 值。

ps -al

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1039  1268 16889  0  80   0 - 11656 poll_s pts/8    00:00:08 vim
0 S  1047  1566 17683  0  80   0 -  2027 wait   pts/18   00:00:00 arm-linux-andro
0 R  1047  1567  1566 21  80   0 -  9143 ?      pts/18   00:00:00 cc1
0 R  1031  1570 15865  0  80   0 -  2176 -      pts/24   00:00:00 ps
0 R  1031 17357 15865 99  80   0 -  2597 -      pts/24   00:03:29 top

所以从上面的输出中,如果你看到 'NI' 列显示你的 nice 值。当我尝试 运行 一个后台进程时,它也得到了一个很好的值“0”(顶部是 PID 为 17357 的进程)。这意味着,它也将像前台进程一样排队等待,并同样进行调度。

All processes running at the same nice value will get an equal cpu-timeslice.

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

dd if=/dev/zero of=/dev/null bs=1 &
dd if=/dev/zero of=/dev/null bs=1

随后运行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

接下来,如果两个进程都限制在同一个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

随后 运行 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

这两个进程竞争 CPU 时间片并且具有同等优先级。

最后,

kill -SIGINT 1357 &
kill -SIGINT 1358 &
kill -SIGINT 1365 &
kill -SIGINT 1366 &

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

25129255+0 records in
25129255+0 records out
25129255 bytes (25 MB) copied, 34.883 s, 720 kB/s

由于各个进程响应中断信号和停止的确切时间不同,吞吐量可能会出现轻微的差异 运行。


However also note that sched_autogroup_enabled exists.

如果启用sched_autogroup_enabled 可确保 cpu-timeslice 的公平分配现在在各个 shell 之间执行。通过在各个活动 shells.

之间平均分配 cpu

因此,如果 shell 启动 1 个进程 A,
另一个 shell 启动了 2 个进程 B 和 C,
那么 CPU 执行时间片通常会分配为

A <-- 50%  <---- shell1 50% 
B <-- 25%  <-. 
C <-- 25%  <--`- shell2 50%

(尽管所有 3 个进程 A、B 和 C 都 运行 处于相同的 nice 级别。)