Linux
系统中,进程得以执行,必须获得 CPU
的控制权,即进程必须得到 CPU
的处理。然而一个进程往往并不能一直获得 CPU
的“青睐”。如果一个进程一直响应任务不退出,并一直占有 CPU
的控制权,这将是一件很“可怕”的事情。因此, Linux
系统通常采用一些调度策略来实现 CPU
控制权的合理分配。
Linux
和大多数其他 UNIX
实现一样,调度进程使用 CPU
的默认模型是循环时间共享算法。在这种模型下,每个进程轮流使用 CPU
一段时间,这段时间被称为时间片。循环时间共享算法满足了交互式多任务系统两个重要需求。
- 公平性:每个进程都有机会用到
CPU
。 - 响应性:一个进程在使用
CPU
之前无需等待太长时间。
在循环时间共享算法中,进程无法直接控制何时使用 CPU
以及使用 CPU
的时间。在默认情况下,每个进程轮流使用 CPU
知道时间片被用光或自己主动放弃 CPU
(如进程睡眠)。如果所有进程都试图尽可能多地使用 CPU
,那么它们使用 CPU
的时间差不多是相等的。
进程的特性 nice
值允许进程间接地影响内核的调度算法。每个进程都有一个 nice
值,其取值范围为 -20
(高优先级)到 19
(低优先级),默认值为 0
。在传统的 UNIX
实现中,只有特权进程才能够赋给自己(或其他进程)一个负(高)优先级。非特权进程只能降低自己的优先级,即赋一个大于默认值 0
的 nice
值。这样做之后它们就对其他进程“友好( nice
)”了,这个特性的名字也由此而来。
nice
值是一个权重因素,它导致内核调度器倾向于调度拥有更高优先级的进程。给一个进程赋一个低优先级(高 nice
值),并不会导致它完全无法用到 CPU
,但会导致它使用 CPU
的时间变少。 nice
值对进程调度的影响程度则依据 Linux
内核版本的不同而不同。
getpriority()
函数和 setpriority()
函数允许一个进程获取和修改自身或其他进程的 nice
值。
#include <sys/time.h> #include <sys/resource.h> int getpriority(int which, int who); int setpriority(int which, int who, int prio);点击复制复制失败已复制
参数 which
和 who
,用于标识需要被读取或修改优先级的进程。 which
参数需要结合 who
参数来确定需要被读取或修改 nice
值的进程。具体参数如下所示:
which参数 | who参数 | 操作的进程对象 |
PRIO_PROCESS | who(非0) | 进程号为who的进程 |
0 | 调用进程 | |
PRIO_PGRP | who(非0) | 进程组ID为who的进程组中的所有进程 |
0 | 调用进程所属进程组中的所有进程 | |
PRIO_USER | who(非0) | 所有用户ID为who的进程 |
0 | 与调用进程相同用户ID的所有进程 |
getpriority()
函数返回由 which
和 who
指定的进程的 nice
值。如果有多个进程符合指定的标准(当 which
为 PRIO_PGRP
和 PRIO_USER
时会出现这种情况),那么将返回优先级最高的进程 nice
值。
setpriority()
函数会将有 which
和 who
指定的进程 nice
值设置为参数指定的值 prio
。如果将 nice
值设置为一个超出允许范围的值时会直接将 nice
值设置为边界值,即 -20
或 19
。