ps 命令的 PRI 值和 task_struct 的 prio 值的关系是咋样( 二 )


■网友
泻药,答不上来我是渣

■网友
需要首先简单理解schedule priority的含义。
一个linux task的scheduling policy可以分为两种: realtime time和non-realtime, realtime任务的调度优先级永远高于所有的非realtime任务,也就是说,非实时任务只有在没有任何实时任务运行时才可能被运行。
实时任务调度策略可以分为round-robin和fifo, 而非实时任务就是conventional任务,也叫timeshare任务。 平时说的CFQ之类的调度策略都是对非实时任务的, 实时任务策略就是按照优先级:一个任务只有在没有更高优先级的其他任务运行时才可能被调度到,Roundrobin和FIFO是说相同优先级的任务如何调度。

然后在说task_struct。
task_struct的prio成员取值范围是0~139,值越小,优先级越高,也就是prio为0的task具有最高优先级(idle task)。
prio 为0~99的任务为实时任务,100~139则为非实时任务。 非实时任务的默认值应该是120, 而一个非实时任务的nice值(实时任务没有nice一说),就是其prio的取值同120的差(+19~-20),所以差值为负则其被调度的可能性更高.

然后说用户态程序看到的进程优先级。
ps命令看到的优先级的来源应该是proc文件系统,也就是你看到的task_prio函数返回的值,对应的范围是-100到39.
【ps 命令的 PRI 值和 task_struct 的 prio 值的关系是咋样】 显示为80,实际应该是20,原因在于ps在显示时做了转换,以对应UNIX标准的priority值.

// legal as UNIX "PRI"// "intpri" and "opri" (was 39..79, now -40..99)static int pr_opri(char *restrict const outbuf, const proc_t *restrict const pp){ /* 39..79 */ return snprintf(outbuf, COLWID, "%ld", 60 + pp-\u0026gt;priority);}


推荐阅读