当前位置: 首页 > article >正文

Linux笔记---进程:进程优先级

1. 基本概念

  • cpu资源分配的先后顺序,就是指进程的优先级(priority)。
  • 优先级高的进程有优先执行权利。配置进程优先级对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

使用ps -l指令可以查看进程的优先级:

  • PRI:进程的默认优先级,值为80。
  • NI:进程优先级的修正值(又叫nice值),取值范围为[-20,20),进程的实际优先级 = PRI + NI。

注意:优先级数值越低,优先级越高。也就是说,优先级数值越小,进程早执行。

将NI的范围限制在[-20,20)范围的目的是防止发生 "进程饥饿" ,即当各个进程的优先级差值过大时,优先级较低的进程就迟迟拿不到CPU资源。

为什么要有NI值得原因如下:

  • 动态调整:NI值的存在使得进程的优先级可以根据系统的负载和用户的需求进行动态调整。这有助于系统在不同负载条件下保持良好的性能。
  • 用户自定义:NI值允许用户根据自己的需求调整进程的优先级。有些进程得优先级是用户无权更改的,而在区间[60,100)的40种优先级的进程是用户可以自己管理的,所以操作系统以NI的方式将接口放开给用户,方便用户使用。
  • 灵活性:PRI+NI的形式提供了一种灵活的优先级调整方式,用户可以根据实际情况选择调整NI值,而无需直接修改内核中的PRI值。
  • 实时进程:在Linux系统中,实时进程具有更高的优先级。通过将实时进程的优先级设置在较高的范围内,可以确保这些进程能够及时响应外部事件,满足实时性要求。

2. 查看修改进程优先级

修改进程优先级的方式有如下几种:

1. top指令 + "r"

进入top后按"r" ‒> 输入进程PID ‒> 输入新的nice值

2. 使用nice命令

nice命令用于在启动新进程时设置其初始优先级。nice值的范围是从-20(最高优先级)到19(最低优先级)。例如,要以较低优先级启动一个备份任务,可以使用以下命令:

nice -n 5 rsync -avz /source /destination &

这个命令将rsync进程的优先级降低了5个单位,确保它不会过多占用系统资源。

3. 使用renice命令

renice命令用于调整已经运行的进程的优先级。例如,要提高一个关键数据库进程的优先级,可以使用以下命令:

renice -5 -p 1234

这个命令将PID为1234的进程优先级提高了5个单位。

4. 在程序内部调整优先级

Linux提供了setpriority和getpriority系统调用,用于在程序内部调整进程优先级。例如:

#include <stdio.h>
#include <sys/resource.h>
#include <unistd.h>

int main() {
    pid_t pid = getpid();
    printf("当前进程PID: %d\n", pid);
    int nice_value = getpriority(PRIO_PROCESS, pid);
    printf("当前Nice值: %d\n", nice_value);
    if (setpriority(PRIO_PROCESS, pid, 5) == 0) {
        printf("Nice值已设置为5\n");
    } else {
        perror("设置Nice值失败");
    }
    return 0;
}

这段代码获取当前进程的PID和Nice值,并将Nice值设置为5。

5. 设置实时优先级

对于需要更高优先级的实时任务,可以使用SCHED_FIFO或SCHED_RR实时调度策略。例如:

#include <sched.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    struct sched_param param;
    param.sched_priority = 10;
    if (sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
        perror("无法设置调度策略");
        exit(EXIT_FAILURE);
    }
    printf("实时调度策略已设置为SCHED_FIFO,优先级: %d\n", param.sched_priority);
    while (1) {
        // 模拟实时任务
    }
    return 0;
}

这段代码将当前进程的调度策略设置为SCHED_FIFO,并设置优先级为10。

注意事项

  • 普通用户只能降低自己进程的优先级,不能提高。只有超级用户(root)可以提高进程的优先级(即设置负值)。
  • 将进程优先级设置得过高可能导致系统响应缓慢,甚至引发优先级反转问题。
  • nice和renice命令不能用于调整实时进程的优先级。实时进程的优先级通常在创建时固定,并受操作系统特殊保护。


http://www.kler.cn/a/413541.html

相关文章:

  • DAY135权限提升-系统权限提升篇数据库提权PostsqlRedis第三方软件提权密码凭据钓鱼文件
  • 用shell脚本写一个通用的监听程序异常并重启脚本
  • notepad++文件github下载
  • Novai Chain 通证派发策略:重塑区块链生态的新范式
  • 【Webgl_glslThreejs】制作流水效果/毛玻璃效果材质
  • c++(斗罗大陆)
  • 基于深度学习的手势识别算法
  • mysql定位慢查询以及分析原因
  • 搭建AD域服务器
  • 【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)
  • 深入解析下oracle char和varchar2底层存储方式
  • 使用Python实现自动化邮件通知:当长时程序运行结束时
  • Linux环境变量(添加环境变量、修改系统环境变量、内建命令和非内建命令)
  • 51单片机从入门到精通:理论与实践指南入门篇(三)
  • ArraList和LinkedList区别
  • aws服务--机密数据存储AWS Secrets Manager(1)介绍和使用
  • [Unity] 【游戏开发】角色设计3-如何为角色实现响应输入的控制器
  • 数据结构——用链表实现栈和队列
  • git分支管理:release分支内容重置为master
  • 零基础学安全--HTML