调度策略和调度优先级是由内核确定的。进程可用通过调整 nice 值选择以更低优先级运行(通过调整 nice 值降低他对 CPU 的占有,因此该进程是“友好的”)。只有特权进程允许提高调度权限。
Single UNIX Specification 中 nice 值得范围在 0 ~ (2*NZERO) - 1 之间,有些实现支持 0 ~ 2*NZERO。nice 值越小,优先级越高,这意思是:你越友好,你的调度优先级就越低。NZERO 是系统默认得 nice 值。
函数 nice 获取或更改它得 nice 值
#include <unistd.h>
int nice(int incr);
//返回值:若成功,返回 -NZERO ~ NZERO - 1 之间得nice值;若出错,返回-1
使用这个函数,进程只能影响自己得 nice 值,不能影响任何其他进程的 nice 值。
incr 参数被增加到调用进程的 nice 值上。如果 incr 太大,系统直接把它降到最大合法值,不给出提升。类似地,如果 incr 太小,系统也会无声无息地把它提高到最小合法值。
函数 getpriority
#include <sys/resource.h>
int getpriority(int which, id_t who);
//返回值:若成功,返回 -NZERO ~ NZERO - 1 之间的nice值;若出错,返回-1
getpriority 函数可用像 nice 函数那样用于获取进程的 nice 值,但是 getpriority 还可以获取一组相关进程的 nice 值。
which 参数可以取以下三个值之一:PRIO_PROCESS 表示进程,PRIO_PGRP 表示进程组,PRIO_USER 表示用户 ID。
which 参数控制 who 参数是如何解释的,who 参数选择感兴趣的一个或多个进程。
- 如果 who 参数位 0,表示调用进程、进程组或者用户。
- 当 which 设为 PRIO_USER 并且 who 为 0 时,使用调用进程的实际用户 ID。
- 如果 which 参数作用于多个进程,则返回所有作用进程中优先级最高的。
函数 setpriority
#include <sys/resource.h>
int setpriority(int which, id_t who, int value);
//返回值:若成功,发返回0;若出错,返回-1
setpriority 函数可用于为进程、进程组和属于特定用户 ID 的所有进程设置优先级。
参数 which 和 who 与 getpriority 函数中相同。value 增加到 NZERO 上,然后变为新的 nice 值。