linux优先级 nice 和 priority

nice

        nice就是一个linux上的一个程序,它直接映射到同名的内核调用。一般称之为静态优先级,即进程一旦开始,如果不用renice修改,改进程的nice不会发生变化。nice用于调用具有特定优先级的实用程序或shell脚本,即给了进程比其他进程更多或者更少的CPU时间。nice的值-20是最高优先级,19是最低优先级,就是说,nice值越大,优先级越低,值越小,优先级越大。一个程序默认的nice值是其父进程的nice的值,通常为0.

        当几个进程要求的资源大于CPU能提供的资源时,nice值就会发挥作用。在这种情况下,一个高优先级的进程会得到更多的CPU时间.只有超级管理员,比如root可以任意修改nice的值,在一些其他版本的linux上可以通过/etc/security/limits.conf来允许其他用户或组设置一个更大的nice值,亲测ubuntu 16.04 LTS 是支持的。
为什么其他用户或组(非root)只能设置一个更大的nice呢?
        主要是为了避免一般用户抢占资源,比如一台服务器,你的程序在跑,我的程序再跑。我为了我的程序快一点,就设置一个负的nice,那你的程序可能就比我的程序低优先级了,所以为了避免这种情况,一般用户只能设置比当前更大的nice值。

那nice如何使用呢?
         根据wiki的例子,如果要解压一个文件,又不想让其他程序被减慢速度,例子:

nice -n 19 tar cvzf archive.tgz largefile

niceness具体的影响是由不同操作系统的调度器的具体实现决定的,不同的操作系统,在细节上可能是不一样。一台特定的操作系统也有不同的试探法,这句话就理解为一台特定的操作系统也有不同的实现吧。在top就可以看到进程的nice值,比如下面的NI就是gnome-shell的nice值。

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  1680 tangs     20   0 3430960  89472  39100 S   6.3  2.9  73:13.19 gnome-shell

下面用一个实例说明nice和renice是如果改变进程的niceness的。先开始一个nice为5的bash,写了循环等待的小程序名为nice,然后nice -n 10 ./nice & 以nice 10启动程序,但是程序最后的nice是15,这是因为nice是 设置的nice值+父进程的nice值=最终的nice值,而不是直接指定的。但是renice就是直接指定nice值的,但是必须比当前nice值大,否则 Permission denied, 上面解释了一般用户只能修改为更大的nice值。

tangs@ubuntu:~/test$ nice -n 5 bash
tangs@ubuntu:~/test$ nice
5
tangs@ubuntu:~/test$ nice -n 10 ./nice &
[1] 29493
tangs@ubuntu:~$ ps -elf | grep nice
0 S tangs     29493  29273  0  95  15 -   603 futex_ 18:46 pts/1    00:00:00 ./nice
0 S tangs     29500  29092  0  80   0 -  5384 pipe_w 18:46 pts/2    00:00:00 grep --color=auto nice
tangs@ubuntu:~$ renice -n 16 29493
29493 (process ID) old priority 15, new priority 16

priority

         priority通常称之为动态优先级,它的值是由系统分析之后动态调整的,用户是不能直接修改的。在操作系统中,进程的优先级取值范围通过宏MAX_PRIO定义,值为140,它由表示nice(-20 ~ 19)的宏NICE_WIDTH和表示实时进程优先级的宏MAX_RT_PRIO(max realtime priority, 取值0 ~ 99)组成。linux的优先级为0-139, 其中nice的-20~19对应100 ~ 139。进程默认的优先级为:

#define DEFAULT_PRIO            (MAX_RT_PRIO + NICE_WIDTH / 2)

priority和nice的相关性如下:

PRI(new) = PRI(old) + NI

即如果一个进程的priority=80, nice=10,那这个进程得到新的PRI就为可能90,因为priority是系统动态调整的,它是一个变量,所以可能为90。


参考文章:

  1. https://en.wikipedia.org/wiki/Nice_(Unix)
  2. https://www.cnblogs.com/lcword/p/8267342.html#commentform
  3. http://blog.51cto.com/frankch/1773621
  4. http://linux.vbird.org/linux_basic/0440processcontrol.php#priority
发布了21 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Tangs_/article/details/86622312