找不到 DEADLINE 调度策略
DEADLINE scheduling policy not found
我想在 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>
None 这些关键字和函数都在我的 /usr/include/
文件夹中定义,但我设法在 /usr/src/linux-headers-3.17.0-031700/include/
中找到了它们。
我试图将此文件夹包含在我的项目的构建选项中,但它似乎生成了 link 错误。
我不太习惯 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
选项来抑制默认位置,但这更糟...我收到很多错误。
答案可能取决于分布!此示例基于 Debian 8.4
此外,您会发现两个工具在这些情况下很有用 - 都在 debian 的存储库中可用 - ack (ack-grep) 和 locate
ack 将帮助您在所有子目录中找到给定的字符串,locate 将帮助您找到实际文件(在 updatedb
之后)(如果它存在于您的系统中)。例如,您可以从根目录 locate sched.h
开始找到所有像 sched.h 这样的文件
首先你应该 #include 如果你没有这个特定的包含,尝试从存储库下载它,以防你使用的是 Debian - 这个文件可以在(最好是最新的) libc6-dev(注意开发包将包含 includes 和 headers 用于开发目的)或 linux-headers
此外,如果您的编译器无法找到 linux/sched.h,请尝试为编译器提供路径提示,在我的例子中为:gcc - I/usr/include(在这种情况下完全没用 - 这是 linux 中的默认包含目录)
注意 /usr/include/linux/sched.h 和 /usr/include/sched.h 可能略有不同
我实际上已经升级到 Ubuntu 16.04 LTS
kernel 4.4.0-21-lowlatency
并且现在默认定义了关键字 SCHED_DEADLINE
。
问题是 struct sched_attr
,方法 sched_getattr() / sched_setattr()
仍然缺失!
经过一些研究(感谢 Google)我发现这个 article 是由内核开发者发出的。文件最后描述了如何使用deadline调度策略。他们只是自己定义结构并使用 syscall
作为 get/set 方法。
显然,尽管 SCHED_DEADLINE
自三年前成为主线,但 libc 的包含文件仍然缺少截止日期调度程序的接口(即 sched_setattr()
、sched_getattr()
和 sched_attr
,等等)。某种程度上类似于 the time to get libc wrapping the getttid()
syscall.
的行为
因此,目前最好的选择是 download rt-app from GitHub 并使用 libdl 接口。
我想在 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>
None 这些关键字和函数都在我的 /usr/include/
文件夹中定义,但我设法在 /usr/src/linux-headers-3.17.0-031700/include/
中找到了它们。
我试图将此文件夹包含在我的项目的构建选项中,但它似乎生成了 link 错误。
我不太习惯 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
选项来抑制默认位置,但这更糟...我收到很多错误。
答案可能取决于分布!此示例基于 Debian 8.4
此外,您会发现两个工具在这些情况下很有用 - 都在 debian 的存储库中可用 - ack (ack-grep) 和 locate
ack 将帮助您在所有子目录中找到给定的字符串,locate 将帮助您找到实际文件(在 updatedb
之后)(如果它存在于您的系统中)。例如,您可以从根目录 locate sched.h
首先你应该 #include 如果你没有这个特定的包含,尝试从存储库下载它,以防你使用的是 Debian - 这个文件可以在(最好是最新的) libc6-dev(注意开发包将包含 includes 和 headers 用于开发目的)或 linux-headers
此外,如果您的编译器无法找到 linux/sched.h,请尝试为编译器提供路径提示,在我的例子中为:gcc - I/usr/include(在这种情况下完全没用 - 这是 linux 中的默认包含目录)
注意 /usr/include/linux/sched.h 和 /usr/include/sched.h 可能略有不同
我实际上已经升级到 Ubuntu 16.04 LTS
kernel 4.4.0-21-lowlatency
并且现在默认定义了关键字 SCHED_DEADLINE
。
问题是 struct sched_attr
,方法 sched_getattr() / sched_setattr()
仍然缺失!
经过一些研究(感谢 Google)我发现这个 article 是由内核开发者发出的。文件最后描述了如何使用deadline调度策略。他们只是自己定义结构并使用 syscall
作为 get/set 方法。
显然,尽管 SCHED_DEADLINE
自三年前成为主线,但 libc 的包含文件仍然缺少截止日期调度程序的接口(即 sched_setattr()
、sched_getattr()
和 sched_attr
,等等)。某种程度上类似于 the time to get libc wrapping the getttid()
syscall.
因此,目前最好的选择是 download rt-app from GitHub 并使用 libdl 接口。