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);

参数说明:

  • 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 <iostream>
#include <sched.h>

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;
}

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

#include <iostream>
#include <sched.h>

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;
}

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

#include <iostream>
#include <sched.h>

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;
}

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

#include <iostream>
#include <sched.h>

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;
}

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

#include <iostream>
#include <sched.h>

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;
}

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

#include <iostream>
#include <sched.h>

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值