Linux 与大多数其他 UNIX 实现一样,调度进程使用 CPU 的默认模型是循环时间共享。 在这种模型中,每个进程轮流使用 CPU 一段时间,这段时间被称为时间片或量子

它能够满足 交互式任务 和 后台任务 的使用。

进程优先级(nice值)

   调度进程使用CPU的默认模型是循环时间共享。在循环时间共享算法中,进程无法直接控制何时使用 CPU 以及使用 CPU 的时间。在默认情况下,每个进程轮流使用 CPU 直至时间片被用光或自己自动放弃 CPU(如进行睡眠或执行一个磁盘读取操作)。

   进程特性`nice`值**允许进程间接地影响内核的调度算法**。**每个进程都拥有一个 nice 值**,其取值范围为`−20`(高优先级)~`19`(低优先级),**默认值为 0**。传统上,UNIX中只有特权进程可以给自己高优先级,非特权进程只能降低自己的优先级,如图所示:

Untitled

<aside> 📢 使用 fork()创建子进程时会继承 nice 值并且该值会在 exec()调用中得到保持。

</aside>

getpriority()系统调用服务例程不会返回实际的 nice 值,相反,它会返回一个范围在 **1(低优先级)~40(高优先级)**之间的数字,这个数字是通过公式 unice=20-knice 计算得来的。这样做是为了避免让系统调用服务例程返回一个负值,因为负值一般都表示错误。

nice值的影响方式

进程的调度只是将nice值当作一个权重因素来考虑,它导致内核调度器倾向于调度拥有高优先级的进程。同时,它受内核版本变化影响较大。

系统调用

允许一个进程获取和修改自身或其他进程的 nice 值。

#include <sys/resource.h>

int getpriority(int which, id_t who);
              // Returns (possibly negative) nice value of specified process on success, or-1 on error
int setpriority(int which, id_ .t who, int prio);
              // Returns 0 on success, or - 1 on error

参数 whichwho,用于标识需读取或修改优先级的进程

which 参数确定 who 参数如何被解释。

int main(int argc, char **argv)
{
		int which, who;
		id_t who;
		// 设置 nice 值
		if(setpriority(which, who, prio) == -1)
				errExit("getpriority");

		// 调用getpriority前,errno 需要先清零
		errno = 0;
		prio = getpriority(which, who);
		if(prio == -1 && errno != 0)
				errExit("getpriority");

		printf("nice value = %d\\n", prio);
		exit(EXIT_SUCCESS);
}