• Linux之sched_setscheduler调度策略总结(六十)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:理解Linux之sched_setscheduler调度策略用法。

    2.Linux之sched_setscheduler调度策略介绍

    • 在Linux操作系统中,sched_setscheduler函数用于设置进程的调度策略和优先级。它属于调度器(scheduler)相关的函数,可用于控制进程在系统中的调度行为。

    函数原型如下:

    int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
    
    • 1

    参数说明:

    • pid:要设置调度策略的进程的进程ID,如果pid为0,则表示当前进程。
    • policy:调度策略,可以是以下值之一:
      • SCHED_OTHER:普通时间共享调度策略
      • SCHED_FIFO:先进先出调度策略
      • SCHED_RR:轮转调度策略
      • SCHED_BATCH:批处理调度策略
      • SCHED_IDLE:空闲调度策略
    • param:结构体指针,包含与特定调度策略相关的参数。

    返回值:

    • 成功时,返回0;
    • 失败时,返回-1,并设置errno来指示错误类型。

    注意事项:

    • 只有具有足够权限(例如具有root权限)的进程才能成功调用sched_setscheduler函数。
    • 调用此函数会仅影响调用进程本身,而不会影响其他进程。

    sched_setscheduler函数的作用是根据给定的调度策略和优先级设置进程的调度方式。它可以用于调整进程在系统中的调度优先级,并影响进程在CPU上的执行顺序。调度策略可以根据进程的需求选择合适的调度算法,不同的调度策略会影响进程的响应性、公平性和实时性。

    需要注意的是,对于实时进程,例如使用SCHED_FIFO或SCHED_RR策略的进程,优先级较高的进程将优先执行,直到它完成或主动让出CPU。而对于普通进程,使用SCHED_OTHER策略的进程将遵循时间片轮转调度算法,按照一定的时间片轮流执行。

    总结:sched_setscheduler函数用于设置进程的调度策略和优先级,允许开发者对进程进行精确的调度控制,以满足不同应用场景的需求。

    3.代码实例

    1.将当前进程设置为SCHED_OTHER调度策略

    #include 
    #include 
    
    int main() {
        struct sched_param param;
        int ret = sched_setscheduler(0, SCHED_OTHER, &param);
        if (ret == -1) {
            std::cout << "Failed to set scheduler!\n";
        } else {
            std::cout << "Successfully set scheduler to SCHED_OTHER\n";
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.将当前进程设置为SCHED_FIFO调度策略

    #include 
    #include 
    
    int main() {
        struct sched_param param;
        int ret = sched_setscheduler(0, SCHED_FIFO, &param);
        if (ret == -1) {
            std::cout << "Failed to set scheduler!\n";
        } else {
            std::cout << "Successfully set scheduler to SCHED_FIFO\n";
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.将当前进程设置为SCHED_RR调度策略

    #include 
    #include 
    
    int main() {
        struct sched_param param;
        int ret = sched_setscheduler(0, SCHED_RR, &param);
        if (ret == -1) {
            std::cout << "Failed to set scheduler!\n";
        } else {
            std::cout << "Successfully set scheduler to SCHED_RR\n";
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.将当前进程设置为SCHED_BATCH调度策略

    #include 
    #include 
    
    int main() {
        struct sched_param param;
        int ret = sched_setscheduler(0, SCHED_BATCH, &param);
        if (ret == -1) {
            std::cout << "Failed to set scheduler!\n";
        } else {
            std::cout << "Successfully set scheduler to SCHED_BATCH\n";
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.将当前进程设置为SCHED_IDLE调度策略

    #include 
    #include 
    
    int main() {
        struct sched_param param;
        int ret = sched_setscheduler(0, SCHED_IDLE, &param);
        if (ret == -1) {
            std::cout << "Failed to set scheduler!\n";
        } else {
            std::cout << "Successfully set scheduler to SCHED_IDLE\n";
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.将指定进程设置为SCHED_OTHER调度策略

    #include 
    #include 
    
    int main() {
        pid_t pid = 1234; // 要设置调度策略的进程ID
        struct sched_param param;
        int ret = sched_setscheduler(pid, SCHED_OTHER, &param);
        if (ret == -1) {
            std::cout << "Failed to set scheduler for process " << pid << "!\n";
        } else {
            std::cout << "Successfully set scheduler to SCHED_OTHER for process " << pid << "\n";
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    Idea执行Pom.xml导入jar包提示sun.misc.BASE64Encoder jar找不到---SpringCloud工作笔记197
    2022年QS排名TOP院校对IB要求盘点
    Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
    SHAP解释模型(二)
    批量、在线学习, 参数、非参数学习
    Linux安装CUDA & 添加环境变量 & 多版本CUDA切换 (软链接)
    java毕业设计疫情防控管理系统Mybatis+系统+数据库+调试部署
    【云原生之Docker实战】使用docker部署nightingale运维监控平台
    ChatGPT4实现前一天
    【精华】Python常用函数方法(Number、String、List、Tuple、Set、Dictionary)
  • 原文地址:https://blog.csdn.net/u010164190/article/details/134193435