Linux 4.16内核下能否同时使用SCHED_DEADLINE与设置CPU亲和性?
在Linux 4.16中同时启用SCHED_DEADLINE与CPU亲和性的可行性
答案是完全可以的,Linux 4.16内核对SCHED_DEADLINE调度策略和CPU亲和性的组合支持没有问题。SCHED_DEADLINE基于EDF(最早截止时间优先)算法,调度器会严格遵守你设置的CPU亲和性约束,只会将任务调度到你指定的CPU核心上。
你的测试代码补充与完整示例
你提供的代码片段还没完成SCHED_DEADLINE参数的设置,我帮你补全并加上CPU亲和性的设置逻辑:
#define _GNU_SOURCE #include <stdio.h> #include <time.h> #include <sys/time.h> #include <sched.h> #include <unistd.h> #include <sys/syscall.h> #include <stdlib.h> #define gettid() syscall(SYS_gettid) int main() { struct sched_attr attr; cpu_set_t cpuset; int ret; long int tid = gettid(); printf("deadline thread started [%ld]\n", tid); // 第一步:设置CPU亲和性,比如绑定到CPU 0和CPU 1 CPU_ZERO(&cpuset); CPU_SET(0, &cpuset); CPU_SET(1, &cpuset); ret = sched_setaffinity(tid, sizeof(cpu_set_t), &cpuset); if (ret != 0) { perror("sched_setaffinity failed"); exit(EXIT_FAILURE); } printf("Successfully set CPU affinity to cores 0 and 1\n"); // 第二步:配置SCHED_DEADLINE参数 attr.size = sizeof(attr); attr.sched_policy = SCHED_DEADLINE; attr.sched_flags = 0; // 设置runtime、deadline、period(单位为纳秒) // 示例:runtime=1ms,deadline=2ms,period=5ms attr.sched_runtime = 1000000; attr.sched_deadline = 2000000; attr.sched_period = 5000000; ret = sched_setattr(tid, &attr, 0); if (ret != 0) { perror("sched_setattr failed"); exit(EXIT_FAILURE); } printf("Successfully set SCHED_DEADLINE scheduling policy\n"); // 这里可以添加你的任务逻辑 while (1) { // 模拟实时任务处理 usleep(500); } return 0; }
关键说明
- 顺序方面:你可以先设置CPU亲和性再设置调度策略,也可以反过来,两种顺序在Linux 4.16中都能正常工作。不过先设置亲和性可以让调度器一开始就知道任务的CPU约束,逻辑上更合理。
- 权限要求:设置SCHED_DEADLINE需要进程拥有
CAP_SYS_NICE权限,所以运行时需要用sudo或者给程序添加相应的能力。 - 资源限制:SCHED_DEADLINE的runtime、deadline、period需要满足
runtime <= deadline <= period,否则sched_setattr会返回错误。
内容的提问来源于stack exchange,提问作者Pringles
相关产品推荐
相关产品推荐

