您的位置:首页 > 运维架构 > Linux

Linux-进程优先级

2018-03-15 14:56 134 查看

为什么要有优先级

显然,在多任务操作系统中,进程占用cpu必须需要人为能够控制。

原因是因为:有的进程非常重要,有些进程当下来看没有那么重要。

所以就需要有优先级来区分他们。

进程是需要切换的,意味着在同一个调度周期中,优先级高的占用cpu的时间就长,优先级低的占用就短些。

NI and PRI



用ps -l命令可以查看以上字段,对他们都加以说明:

F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser;

S 代表这个程序的状态 (STAT);

UID 代表执行者身份

PID 进程的ID号!底下的 PPID 则父进程的ID;

C CPU 使用的资源百分比

PRI指进程的执行优先权,其值越小越早被执行;

NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值。

ADDR 这个是内核函数,指出该程序在内存的那个部分。如果是个执行的程序,一般就是『 - 』

SZ 使用掉的内存大小;

WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;

TTY 登入者的终端机位置;

TIME 使用掉的 CPU 时间。

CMD 所下达的指令名称

我们这里只对PRI和NI做详解,其他字段以后会说明。

先来解释PRI与NI是什么含义:

PRI:就是进程的优先级,其值越小,优先级越高
NI:即nice值。表示进程可被执行的优先级的修正数值
PRI(new)=PRI(old)+NI
PRI与NI不是一个概念,是两个不同的概念。


修改NI

nice值的取值范围是:-20~19;一共40个级别。

这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。该值是可以命令修改的。

方法一

在程序运行前修改:

#include <stdio.h>
#include <stdlib.h>
int main()
{
while(1)
{
sleep(1);
}

return 0;




使用以上命令,在程序运行之前修改其nice值。



以上可查看到nice与PRI都被改掉了。

方法二:

调整已运行的程序的nice值:renice

查看当前运行中的进程的优先级:



修改正在运行的进程的优先级:



以上可看到nice值和PRI都被修改了。

方法三

用top命令,进入以后按r,输入pid号,在输入修改的nice值。可以看到以及被修改。



注意:虽然我们一直在说nice值,但是nice值并不是优先级,但他却能影响优先级的值。

引用网上的一个例子:(非常形象)

在英语中,如果我们形容一个人nice,那一般说明这个人的人缘比较好。什么样的人人缘好?往往是谦让、有礼貌的人。

比如,你跟一个nice的人一起去吃午饭,点了两个一样的饭,先上了一份后,nice的那位一般都会说:“你先吃你先吃!”,这就是人缘好,这人nice!但是如果另一份上的很晚,那么这位nice的人就要饿着了。

这说明什么?

越nice的人抢占资源的能力就越差,而越不nice的人抢占能力就越强。这就是nice值大小的含义,nice值越低,说明进程越不nice,抢占cpu的能力就越强,优先级就越高。

动态优先级与静态优先级

在原来使用O1调度的Linux上,我们还会把nice值叫做静态优先级,这也基本符合nice值的特点,就是当nice值设定好了之后,除非我们用renice去改它,否则它是不变的。

而priority的值在之前内核的O1调度器上表现是会变化的,所以也叫做动态优先级

在内核中,进程优先级的取值范围是通过一个宏定义的,这个宏的名称是MAX_PRIO,它的值为140。而这个值又是由另外两个值相加组成的,一个是代表nice值取值范围的NICE_WIDTH宏,另一个是代表实时进程(realtime)优先级范围的MAX_RT_PRIO宏。

总结:正常情况下,任何一个进程的优先级都是这个值,即使我们通过nice和renice命令调整了进程的优先级,它的取值范围也不会超出100-139的范围,除非这个进程是一个实时进程,那么它的优先级取值才会变成0-99这个范围中的一个。

详细可查看深入Linux的进程优先级
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: