未找到DEADLINE调度策略

时间:2016-04-20 09:11:48

标签: 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等函数1}}。

#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/文件夹中。无论如何,我尝试使用几种方法将文件夹添加到我的项目中。首先使用gcc的-I标志,然后使用C_INCLUDE_PATH环境变量。

在两种方式中,gcc在默认位置优先搜索并找到错误的<sched.h>文件。我尝试使用-nostdinc选项来抑制默认位置,但这更糟糕......我收到了很多错误。

3 个答案:

答案 0 :(得分:1)

我实际上已使用Ubuntu 16.04 LTS升级到kernel 4.4.0-21-lowlatency,现在默认定义了关键字SCHED_DEADLINE

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

经过一些研究(感谢Google),我发现内核开发人员发现了这个article。在文档的最后,描述了如何使用截止日期调度策略。它们只是自己定义结构并使用syscall来获取/设置方法。

以下是本文档的更易读的版本:Deadline Task Scheduling

答案 1 :(得分:0)

答案可能取决于分发!这个例子基于Debian 8.4

另外,在这些情况下你会发现两个有用的工具 - 都可以在debian的存储库中找到 - ack( ack-grep )和找到 ack将帮助您在所有子目录中找到给定的字符串,并且locate将帮助您查找实际文件(在updatedb之后),如果它存在于您的系统中。例如,您可以使用locate sched.h

从root开始查找sched.h等所有文件

如果你不拥有这个特殊的包含,你应该#include #include,尝试从存储库下载它,以防你使用Debian - 这个文件可以找到(最好是最新的) libc6-dev < / strong>(请注意,dev软件包将包含用于开发目的的包含和标头)或 linux-headers

此外,如果您的编译器无法找到 linux / sched.h ,请尝试为编译器提供路径提示,在我的情况下,它将是: gcc -I / usr / include (在这种情况下完全没用 - 这是默认包括linux中的dir)

请注意 /usr/include/linux/sched.h /usr/include/sched.h 可能略有不同

答案 2 :(得分:0)

显然,尽管三年前SCHED_DEADLINE是主线​​,但libc的包含文件仍然缺少截止日程安排程序的界面(即sched_setattr()sched_getattr()和{ {1}}等)。这种行为在某种程度上类似于the time to get libc wrapping the getttid() syscall

因此,目前最好的选择是download rt-app from GitHub并使用 libdl 界面。