c - 找不到 DEADLINE 调度策略

标签 c linux linux-kernel sched-deadline

我想在 C 中实现 DEADLINE 调度策略。我知道该功能自 Linux 3.14.10 开始实现。我正在使用 Ubuntu 14.04 Linux #### 3.17.0-031700-lowlatency #201410060605 SMP PREEMPT这应该是最近的。我使用 Eclipse 开发程序(作为 sudo 启动)。

我已经定义了 _GNU_SOURCE并包括 sched.h而且我仍然无法使用关键字 SCHED_DEADLINE , 定义一个 struct sched_attr或使用类似 sched_getattr 的功能.

#define _GNU_SOURCE
#include <sched.h>

这些关键字和函数都没有在我的 /usr/include/ 中定义文件夹,但我设法在 /usr/src/linux-headers-3.17.0-031700/include/ 中找到了它们. 我试图将此文件夹包含在我的项目的构建选项中,但它似乎会生成链接错误。

我不太习惯 C 开发(我最初是一名 JS 开发人员)所以如果有人能解释我做错了什么以及如何解决这个问题,那就太好了。

/usr/include/linux/sched.h 的内容

#ifndef _LINUX_SCHED_H
#define _LINUX_SCHED_H

/*
 * cloning flags:
 */
#define CSIGNAL     0x000000ff  /* signal mask to be sent at exit */
#define CLONE_VM    0x00000100  /* set if VM shared between processes */
#define CLONE_FS    0x00000200  /* set if fs info shared between processes */
#define CLONE_FILES 0x00000400  /* set if open files shared between processes */
#define CLONE_SIGHAND   0x00000800  /* set if signal handlers and blocked signals shared */
#define CLONE_PTRACE    0x00002000  /* set if we want to let tracing continue on the child too */
#define CLONE_VFORK 0x00004000  /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT    0x00008000  /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD    0x00010000  /* Same thread group? */
#define CLONE_NEWNS 0x00020000  /* New namespace group? */
#define CLONE_SYSVSEM   0x00040000  /* share system V SEM_UNDO semantics */
#define CLONE_SETTLS    0x00080000  /* create a new TLS for the child */
#define CLONE_PARENT_SETTID 0x00100000  /* set the TID in the parent */
#define CLONE_CHILD_CLEARTID    0x00200000  /* clear the TID in the child */
#define CLONE_DETACHED      0x00400000  /* Unused, ignored */
#define CLONE_UNTRACED      0x00800000  /* set if the tracing process can't force CLONE_PTRACE on this clone */
#define CLONE_CHILD_SETTID  0x01000000  /* set the TID in the child */
/* 0x02000000 was previously the unused CLONE_STOPPED (Start in stopped state)
   and is now available for re-use. */
#define CLONE_NEWUTS        0x04000000  /* New utsname group? */
#define CLONE_NEWIPC        0x08000000  /* New ipcs */
#define CLONE_NEWUSER       0x10000000  /* New user namespace */
#define CLONE_NEWPID        0x20000000  /* New pid namespace */
#define CLONE_NEWNET        0x40000000  /* New network namespace */
#define CLONE_IO        0x80000000  /* Clone io context */

/*
 * Scheduling policies
 */
#define SCHED_NORMAL        0
#define SCHED_FIFO      1
#define SCHED_RR        2
#define SCHED_BATCH     3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE      5
/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
#define SCHED_RESET_ON_FORK     0x40000000


#endif /* _LINUX_SCHED_H */

编辑

我想要的文件位于 /usr/src/linux-headers-3.17.0-031700/include/文件夹。无论如何,我尝试使用多种方法将该文件夹添加到我的项目中。首先使用 -I gcc 的标志,接下来使用 C_INCLUDE_PATH环境变量。

两种方式,gcc都优先在默认位置搜索,发现错误<sched.h>文件。我试着用 -nostdinc选项来抑制默认位置,但这更糟......我得到了很多错误。

最佳答案

我实际上已升级到 Ubuntu 16.04 LTS,具有 kernel 4.4.0-21-lowlatency 并且关键字 SCHED_DEADLINE 现在定义为默认。

问题是 struct sched_attr 和方法 sched_getattr()/sched_setattr() 仍然缺失!

经过一些研究(感谢 Google),我发现了这个 article由内核开发者发出。文件最后描述了如何使用deadline调度策略。他们只是自己定义结构并使用 syscall 获取/设置方法。

关于c - 找不到 DEADLINE 调度策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36739005/

相关文章:

linux - PhpStorm 远程 Xdebug

ruby-on-rails - 输出到终端而不是 html 文档

linux - 同步两个本地目录

linux - linux内核模块生成的核心文件

c - Git - 垃圾收集器是否允许并行运行?

c - 与 PIC18F252 上的 ADC 输出作斗争

c - 错误: use of undeclared identifier

c - 指针数组

linux - 在类似 Linux 的系统(Nvidia Jetson TX1)上更改 GPU 时钟速率

c - Linux 中 inet_addr_lst 内核符号的用途是什么?