(转)nice值

米俊喆
2023-12-01
  首先,我想用一个简单的命令来引起这个议题。 无论在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:
[root@dbbak root]# ps –l — 这里用的是linux测试
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 20538 20534 0 75 0 – 1063 wait4 pts/2 00:00:00 bash
4 R 0 20663 20538 0 75 0 – 828 – pts/2 00:00:00 ps

我们很容易注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值
这里的前面的三个信息,我们都是比较好容易理解的,但是后面的两个奇怪的信息,一个是PRI,一个是NI,这到底是什么东西?相对而言,PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值。如前面所说,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。

进程在创建时并不是平等的,他们被赋予不同的优先级值,例如有些对计算机本身的操作至关重要的程序必须比其他次要的程序具有更高的优先级(则其有更小的优先级值)。而如前面所说,nice的值是表示进程优先级值可被修正数据值,因此,每个进程都在其计划执行时被赋予一个系统nice值,这样系统就可以根据系统的资源以及具体进程的各类资源消耗情况,主动干预进程的优先级值。这个过程,用户也可手工干预其中,但是要被赋予相应的权限。
在UNIX系统或者LINUX系统中,使用从-20到+19的一个可变数值来表示这个nice值(LINUX和AIX是这种情况,HP-UX系统的值范围是从0到39),并且在通常情况下,子进程会继承父进程的系统nice值。具有最高优先级的程序,其nice值最低,所以在UNIX和LINUX系统中,值-20使得一项任务变得非常重要(HP-UX为0);与之相反,如果任务的 nice 为+19(HP-UX为39),则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的 CPU 时间的更大使用份额,这也就是nice的名称的意会来意。

在系统启动的过程中,init进程会被赋予0(HP-UX系统值会被赋予20),其他所有进程继承了这个nice值(因为其他的进程都是init的子进程)。对于用户,从他们开始登陆初始化进程,其余在其底下衍生出来的子进程也会赋予该nice值。原始用户,只能将其底下的执行进程的nice值变大(相对于其本身nice值而言)而不能变小;若想变小,得要有相应的权限,如root用户可以设置变小,如下:
[oracle@perf_dbc ~]$ nice
0
[oracle@perf_dbc ~]$ nice -n 3 ls
agent bin important_bak logs statistics_import.log TMP_FORUM_STATS.dmp TMP_TAOBAO_STATS.dmp TMP_TBCAT_STATS.dmp top.dmp worksh
[oracle@perf_dbc ~]$
[oracle@perf_dbc ~]$ nice -n -3 ls
nice: cannot set priority: Permission denied

而root用户就可以给其子进程赋予更小的nice值,如下:
[root@dbbak root]# nice
0
[root@dbbak root]# nice -n -3 ls
192.168.205.191.txt anaconda-ks.cfg clariion.log Desktop disk1 emc.sh File_sort install.log install.log.syslog log OPS rhel_os_soft root_link_name

对于后台进程,其nice会在其被显示赋予的值过后再加上4。如“nice 12 command &”命令执行时,则其会以nice=36值来运行程序(HP-UX系统)。这里有个问题,即如果用户设置的nice值超过了nice的边界值(LINUX和AIX为-20到19,HP-UX为0到39)会怎样,则系统就取nice的边界值作为进程的nice值。

与进程的nice相关的命令有2个,分别是nice和renice。
nice命令就是设置一个要执行command进程的nice值,其命令格式是 nice –n adjustment command command_option,这里就设置要执行的command的nice,如果这里不指定adjustment,则默认为10。
renice命令就是设置一个已经在运行的进程的nice值,如假设一运行进程本来nice值为0,renice为3后,则这个运行进程的nice值就为3了。renice的执行必须要有相应的权限方可执行。它可以根据用户、进程ID、进程组来设置进程的nice值。

对nice值一个形象比喻,假设在一个CPU轮转中,有2个runnable的进程A和B,如果他们的nice值都为0(如果是HP-UX则为20),加上内核会给他们每人分配1k个cpu时间片。但是假设进程A的为0,但是B的值为-10,那么此时CPU则会可能分别给A和B分配1k和1.5k的时间片。故可以形象的理解为,nice的值影响了内核分配给进程的cpu时间片的多少,时间片越多的进程,其优先级越高,其优先级值越低。

从使用top、ps等命令看到的nice值,就是进程所拥有的nice值,使用iostat等看到的%nice,就是用户进程空间中改变过优先级的进程的占用CPU的百分比,如上例中就说0.5k/2.5k=1/5=20%。

到目前为止,更需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
 类似资料: