images/logo.jpg

枕石的个人博客

Linux实时调度策略:SCHED_FIFO、SCHED_RR和SCHED_DEADLINE设置示例

一、前言

Linux 支持多种任务调度策略(Scheduling Policy),其中:

  • 普通任务(SCHED_NORMAL) 是普通分时调度;
  • 实时任务(SCHED_FIFO、SCHED_RR、SCHED_DEADLINE) 适用于对响应延迟、执行周期有严格要求的系统(如工业控制、音视频处理等)。

二、实时调度策略简介

调度策略类型优先级范围时间片机制特点典型应用
SCHED_FIFO实时调度1–99无时间片高优先级任务永不主动让出 CPU,直到阻塞或结束电机控制、传感器采样
SCHED_RR实时调度1–99有时间片(默认 100ms)多个相同优先级任务轮流执行多任务实时控制
SCHED_DEADLINE实时调度无优先级通过 runtime/deadline/period 控制执行预算最严格的周期性任务调度视频渲染、实时信号处理

三、三种调度策略设置代码示例

SCHED_FIFO 测试程序

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/prctl.h>
#include <pthread.h>
#include <sched.h>

int main() {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(0, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) != 0)
        perror("sched_setaffinity");

    // 设置实时调度
    struct sched_param param = { .sched_priority = 80 };
    if (sched_setscheduler(0, SCHED_FIFO, &param) != 0)
        perror("sched_setscheduler");

    printf("Running under SCHED_FIFO with priority %d on CPU 0\n", param.sched_priority);
    while (1) {
        for (volatile int i = 0; i < 100000000; i++);
        printf(".");
        fflush(stdout);
        usleep(500000); // 防止完全占满CPU
    }
}

编译与运行:

Linux内核中的内存分配

在用户空间,当我们谈论内存分配时,malloc() 几乎是唯一的答案。但当我们潜入Linux内核的深海,会发现内存管理的世界远比想象中复杂和精妙。内核代码对性能、稳定性和硬件交互有着极致的要求,因此它提供了一套多样化的工具箱来应对不同的内存需求。今天,我们将聚焦于内核中最核心的四种内存分配机制:kmallocalloc_pagesvmallocdma_alloc_coherent。理解它们的区别和底层原理,是每一位内核开发者和系统工程师的必修课。

详解C语言中的宏定义与使用

在C语言中,宏(Macro)是预处理器的一项强大功能。它允许我们在编译之前对源代码进行文本替换,这为定义常量、创建类函数结构以及实现代码的条件编译提供了极大的灵活性。本文将深入探讨C语言中宏的定义、使用技巧以及一些高级应用。

详解C语言的编译过程

本文将以一个简单的 “Hello, World!” 程序为起点,通过 gcc -v 命令揭示编译过程的神秘面纱,并进一步以一个多文件的项目为例,逐步拆解C语言编译的四大核心步骤:预处理 (Preprocessing)编译 (Compilation)汇编 (Assemble)链接 (Linking)

Linux内核调度系统调用

内核最新的调度策略宏

#define SCHED_NORMAL    0   // 普通时间共享任务(CFS)
#define SCHED_FIFO      1   // 实时 FIFO
#define SCHED_RR        2   // 实时轮转
#define SCHED_BATCH     3   // 批处理任务
#define SCHED_IDLE      5   // 空闲任务
#define SCHED_DEADLINE  6   // 截止期调度

重新梳理 Linux 用户态相关的调度系统调用,包括 作用、参数意义、返回值,以及内核内部逻辑。