# 提高进程的优先级 ## 进程优先级概念 ![](media/image-20240830085532940.png) 如上图:应用程序wim-rudp有两个重要的参数 - PRI:80 - NI:0 进程的真正优先级为 ``` PRI = PRI(old) + NI ``` 注意: - PRI范围:【60~99】 - NI范围:【-20~19】 - 且上面公式中提到的`PRI(old)`值,是程序启动的时候值,并不是上次的值,例如old一直是上图中的80。 ## 进程优先级队列 ![](media/43944fd085ba22da3c7adc96f2acee6b.png) ## 如何调整进程优先级 ### 方案1:直接top命令下修改 1. `sudo top` 命令 2. 按下【R/r】键,会显示下面的提示 ``` PID to renice [default pid = x] ``` 3. 输入我们的进程PID:`151190` ![](media/image-20240830090652112.png) 4. 输入要修改的NI值:我们这里输入-20 ![](media/image-20240830090718485.png) 5. 查看调整后的进程优先级 ![](media/image-20240830090916530.png) ### 方案2:renice命令修改 ``` renice -n -p <进程ID> ``` 例如下面的 ``` renice -n -10 -p 151190 ``` 如下图所示: ![](media/image-20240830092116257.png) ### 方案3:Linux C代码修改 在wim-rudp代码中修改 ```c #include #include #include // 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; } ``` 函数介绍 ```c #include int setpriority(int which, int who, int priority); ``` - `which`参数指定是要修改进程、进程组、用户的优先级: - `PRIO_PROCESS`:修改进程的优先级。 - `PRIO_PGRP`:修改进程组的优先级。 - `PRIO_USER`:修改用户的默认优先级。 - `who`参数指定是要修改当前进程、进程ID为`who`的进程、进程组ID为`who`的进程组或者用户ID为`who`的所有进程。 - `priority`参数是优先级值,范围通常是`-20`到`19`,数值越小表示越高的优先级。 - 返回值:成功时返回0,失败时返回-1并设置`errno`。 获取进程优先级函数: ``` #include int getpriority(int which,int who); ``` - 函数说明 getpriority()可用来取得进程、进程组和用户的进程执行优先权。 - 参数 which有三种数值,参数who 则依which值有不同定义 - `PRIO_PROCESS` :who 为进程识别码 - `PRIO_PGRP`: who 为进程的组识别码 - `PRIO_USER` :who 为用户识别码 - 此函数返回的数值介于-20 至19,代表进程执行优先权,即NI值