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
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,线程优先级可以通过sched_param结构体中的sched_priority字段来设置。可以使用pthread_attr_setschedparam函数来设置线程的优先级,传入的参数为一个指向pthread_attr_t结构体的指针和一个指向sched_param结构体的指针。通过设置sched_param结构体中的sched_priority字段来设置线程的优先级优先级范围为0~99,其中0为普通优先级,数值越大优先级越高。 此外,Linux中的线程优先级可以分为静态优先级和动态优先级。静态优先级范围为0~99,其中0级为普通优先级,1~99级为实时线程。动态优先级是指在静态优先级为0时,通过nice值来区分优先级,nice值范围为-19~20,nice值越大,优先级越低。例如,如果有两个静态优先级为0的线程p1和p2,p1的nice值为20,p2的nice值为-10,则p2的优先级比p1更高。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 线程调度与优先级](https://blog.csdn.net/modi000/article/details/125077677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Linux-线程调度与优先级](https://blog.csdn.net/u014583317/article/details/109413059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值