提高进程的优先级

进程优先级概念

如上图:应用程序wim-rudp有两个重要的参数

  • PRI:80

  • NI:0

进程的真正优先级为

PRI = PRI(old) + NI

注意:

  • PRI范围:【60~99】

  • NI范围:【-20~19】

  • 且上面公式中提到的PRI(old)值,是程序启动的时候值,并不是上次的值,例如old一直是上图中的80。

进程优先级队列

如何调整进程优先级

方案1:直接top命令下修改

  1. sudo top 命令

  2. 按下【R/r】键,会显示下面的提示

    PID to renice [default pid = x]
    
  3. 输入我们的进程PID:151190

  4. 输入要修改的NI值:我们这里输入-20

  5. 查看调整后的进程优先级

方案2:renice命令修改

renice -n <nice值> -p <进程ID>

例如下面的

renice -n -10 -p 151190

如下图所示:

方案3:Linux C代码修改

在wim-rudp代码中修改

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
 
 // Highest nice value, -20 to 19
int set_nice(int who,int niceval) 
{
    int ret = setpriority(PRIO_PROCESS, who, niceval);
    if (ret == -1) {
        perror("setpriority");
        return -1;
    }
    printf("Nice value set to %d\n", niceval);
    return 0;
}

函数介绍

#include <sys/resource.h>
int setpriority(int which, int who, int priority);
  • which参数指定是要修改进程、进程组、用户的优先级:

    • PRIO_PROCESS:修改进程的优先级。

    • PRIO_PGRP:修改进程组的优先级。

    • PRIO_USER:修改用户的默认优先级。

  • who参数指定是要修改当前进程、进程ID为who的进程、进程组ID为who的进程组或者用户ID为who的所有进程。

  • priority参数是优先级值,范围通常是-2019,数值越小表示越高的优先级。

  • 返回值:成功时返回0,失败时返回-1并设置errno

获取进程优先级函数:

#include <sys/resource.h>
int getpriority(int which,int who);
  • 函数说明 getpriority()可用来取得进程、进程组和用户的进程执行优先权。

  • 参数 which有三种数值,参数who 则依which值有不同定义

    • PRIO_PROCESS :who 为进程识别码

    • PRIO_PGRP: who 为进程的组识别码

    • PRIO_USER :who 为用户识别码

  • 此函数返回的数值介于-20 至19,代表进程执行优先权,即NI值