linux系统进程优先级

一、什么是进程优先级?
       每个进程都会有相应的优先级,优先级决定程序何时运行。优先级值越低,优先级就越高,就越快被调度程序选中。
       另外,优先级还影响分配给进程的时间片长短。重要的进程,应该分配多一些cpu时间片,好让其尽快完成任务。所有的进程都会有机会运行,但高优先级重要的进程会获取更多的cpu执行时间。

二、优先级取值范围
       在linux系统中,进程优先级的取值范围是0-139,而这个值又是由另外两个值组成的,一个是代表实时进程(realtime)优先级范围是[0,99],另外一个是代表非实时进程,取值范围是[100,139]。
       所以,Linux进程实际上实现了140个优先级范围,取值范围是从0-139,这个值越小,优先级越高。

  • 动态优先级:实时进程优先级[0,99],该区间被称为动态优先级,优先级随着进程执行情况的变化而改变,以便获得更好的调度性能。
  • 静态优先级:代表非实时进程优先级[100,139],被称为静态优先级,该值不会随着时间而进行改变,但系统可以通过nice命令来进行修改。

三、PRI值和NICE值

  1. PRI值
           PRI即进程的优先级,此值越小进程的优先级别越高。PRI值越小越快被cpu调度程序执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。由此看出,PRI是根据NICE排序的,规则是NICE越小PRI值越小,其优先级会变高。

  2. NICE值
           它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。它对应于静态优先级的[100,139]这个区间,进程启动后默认的nice值为0,则其对应的优先级为120。
           NICE值虽然不是priority,但是它确实可以影响进程的优先级。

  3. ps和top命令
    查看PRI和NICE值,它们代表什么意思呢?
    ps命令

    [root@centos7 ~]#ps -elf

    F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
    4 S root 1 0 0 80 0 - 32063 ep_pol 14:35 ? 00:00:02 /usr/lib/s
    1 S root 2 0 0 80 0 - 0 kthrea 14:35 ? 00:00:00 [kthreadd]
    1 S root 3 2 0 80 0 - 0 smpboo 14:35 ? 00:00:01 [ksoftirqd
    1 S root 5 2 0 60 -20 - 0 worker 14:35 ? 00:00:00 [kworker/0
    1 S root 6 2 0 80 0 - 0 worker 14:35 ? 00:00:00 [kworker/u
    ......


    top命令

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    1 root 20 0 128252 6804 4176 S 0.0 0.3 0:02.79 systemd
    2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
    3 root 20 0 0 0 0 S 0.0 0.0 0:01.63 ksoftirqd/0
    ......


    总结:
            top中的PR表示优先级,但是跟上述的值不是直接对等的。在top中,实时优先级的[0,99]没有具体的表示。静态优先级和top中的优先级关系为top_PR = static_Priority - 100也就是说,top中的PR取值为[0,39],对应优先级[100,139]。
            ps命令中,ps_PRI = static_priority - 40,PRI的取值范围为[-40,99],也就是说,ps中PRI值为80等价于nice值为0,等价于静态优先级的120。