nice
和 renice
命令允许你通过调整进程优先级来优化内核对进程的处理方式。本文将指导你如何在 Linux 和 macOS 等类 Unix 操作系统中使用这两个命令。
进程管理的核心
在你的 Linux 或类 Unix 系统中,即使在你启动任何应用程序之前,就有许多进程在后台运行。 这些进程大部分是 Linux 系统自身的重要组成部分或图形桌面环境的辅助进程。 计算机系统幕后运行着大量的操作。 然而,可用的系统资源和 CPU 时间是有限的。 Linux 内核负责管理所有这些进程。
内核必须决定哪些进程当前应该获得关注和资源,哪些进程需要等待。 内核会不断处理进程及其优先级,以确保计算机尽可能流畅地运行,并且所有进程都能获得适当的资源。 有些进程会获得优先待遇,因为它们对于计算机的正常运行至关重要,所以它们的需求会优先于你的浏览器等其他应用。
理解 Nice 值
内核决定如何处理进程的关键标准之一是 Nice 值。 每个进程都有一个 Nice 值,它是一个介于 -19 到 20 之间的整数。默认情况下,所有新启动的进程的 Nice 值都是零。
关键在于,Nice 值越高,该进程对其他进程就越“友好”。也就是说,较高的 Nice 值告诉内核,该进程可以等待。相反,负的 Nice 值则表示不友好,负值越大,该进程越“自私”,它会尽可能地占用 CPU 时间,而不考虑其他进程的需求。
我们可以使用 nice
命令来设置进程启动时的 Nice 值,也可以使用 renice
命令来调整正在运行的进程的 Nice 值。 你可以点击这里查看 nice
和 renice
命令的详细文档。
nice
命令的用法
nice
命令可以在程序启动时调整其 Nice 值。这使我们可以增加或减少内核赋予该进程的优先级,使其相对于其他进程更受重视或被忽略。
例如,假设一位程序员编写了一个名为 ackermann
的程序,用于计算 阿克曼函数。这个程序是 CPU 和内存密集型的。程序员可以使用以下命令来启动它:
./ackermann
可以使用 top
命令查看正在运行的程序。
top
在 top
的输出中,我们可以看到 ackermann
程序的详细信息。其 Nice 值在“NI 列”中显示,正如预期的那样,它的默认值为零。
现在,让我们重新启动 ackermann
程序,并设置一个更高的 Nice 值,让它对其他进程更“友好”。我们将 ackermann
程序的 Nice 值设置为 15。在命令中,首先输入 nice
,然后是一个空格,然后是 -15
,再一个空格,最后是要启动的程序的名称。在这个例子中,程序员要运行 ./ackermann
。
nice -15 ./ackermann
请注意,这里的 -15
不是负十五,而是正十五。 -
符号用于表示我们正在传递一个参数。如果要表示负数,则必须使用两个 -
字符。
如果我们现在再次运行 top
,我们可以看到 ackermann
程序的行为发生了变化。
top
当 ackermann
的 Nice 值为 15 时,它消耗的 CPU 时间明显减少。GNOME
和 Rhythmbox
等其他进程则消耗了更多的 CPU 时间。通过调整 Nice 值,我们稍微控制了 ackermann
程序的优先级。
现在,让我们反过来,给 ackermann
一个负的 Nice 值。 请注意,我们需要使用两个 -
字符。要让应用程序变得更“自私”和不友好,你需要使用 sudo
命令。任何用户都可以让他们的应用程序更“友好”,但只有超级用户(root)才能让应用程序更“自私”。
sudo nice --10 ./ackermann
再次运行 top
命令,看看有什么不同。
top
现在,ackermann
的 Nice 值是 -10。 它又回到了列表顶部,并且比之前消耗了更多的 CPU 时间。
renice
命令的用法
renice
命令允许我们调整正在运行的进程的 Nice 值。 我们无需停止进程并使用 nice
命令重新启动它,可以即时设置新的 Nice 值。
renice
命令需要进程的进程 ID (PID) 作为命令行参数。我们可以从 top
命令的“PID”列中获取进程 ID,也可以使用 ps
和 grep
命令找到它,如下所示。当然,你需要将 dave
替换为你的用户名,并将 ackermann
替换为你感兴趣的进程名称。
ps -eu dave | grep ackermann
现在我们有了 PID,可以将其与 renice
命令一起使用。例如,我们将 ackermann
进程的 Nice 值设置为 5,使其行为更“友好”。要更改正在运行的进程的 Nice 值,你需要使用 sudo
命令。请注意,在表示正数 5 时,不需要 -
符号。负数只需要一个 -
符号,而不是两个。
sudo renice -n 5 2339
输出显示,renice
命令已经成功更改了 Nice 值。它显示了旧值和新值。
通常,内核在处理进程优先级和分配 CPU 时间和系统资源方面做得很好。但是,如果你要运行一个耗时的 CPU 密集型任务,并且你不太关心它的完成时间,那么为该任务设置一个较高的 Nice 值会让你的计算机运行更流畅,这对每个人都有好处。