问题
I want to implement the DEADLINE scheduling policy in C. I know the feature is implemented since Linux 3.14.10
and I'm using Ubuntu 14.04 Linux #### 3.17.0-031700-lowlatency #201410060605 SMP PREEMPT
which should be recent enough. I develop the program with Eclipse (launched as sudo).
I've defined _GNU_SOURCE
and included sched.h
and I'm still unable to use the keyword SCHED_DEADLINE
, to define a struct sched_attr
or to use function like sched_getattr
.
#define _GNU_SOURCE
#include <sched.h>
None of these keywords nor functions are defined in my /usr/include/
folder but I've managed to find them in /usr/src/linux-headers-3.17.0-031700/include/
.
I've tried to include this folder in my project's build options but it seems to generate link error.
I'm not really used to C developpment (I'm originally a JS developper) so if someone can explain me what I'm doing wrong and how to fix this, that would be very nice.
Content of the /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 */
EDIT
Files I want are located in the /usr/src/linux-headers-3.17.0-031700/include/
folder. Anyway, I tried to add the folder to my project using several methods. Firstly using -I
flag of gcc and next using the C_INCLUDE_PATH
environment variable.
In both ways, gcc searched in priority in default locations and found the wrong <sched.h>
file. I tried to used -nostdinc
option to suppress default locations but this is even worse... I get a lot of errors.
回答1:
I actually upgraded to Ubuntu 16.04 LTS
with a kernel 4.4.0-21-lowlatency
and the key word SCHED_DEADLINE
is now defined by default.
The problem is struct sched_attr
and methods sched_getattr() / sched_setattr()
are still missing !
After some research (thanks Google) I found this article emitted by the kernel developpers. At the end of the document, it is describe how to use deadline scheduling policy. They simply define by themselves the structure and use syscall
for the get/set methods.
Here is a more readable version of this document : Deadline Task Scheduling.
回答2:
Answer may depend on distribution! this example is based on Debian 8.4
ALso, you will find two tools usefull in those situations - both available on debian's repositories - ack (ack-grep) and locate
ack will help you find given string in all subdirectories, and locate will help you find actual file (after updatedb
) if it exist on your system. For example you can find all files like sched.h starting from root with locate sched.h
firsts of all you should #include if you do not posses this particular include, try to download it from repositories, in case you are using Debian - this file can be found in (prefferably latest) libc6-dev (notice that dev packages will contain includes and headers for development purposes) or linux-headers
Also if your compiler cant find linux/sched.h try to give compiler a path hint, in my case it would be : gcc -I/usr/include (which is in this case completly useless - this is default include dir in linux)
Notice that /usr/include/linux/sched.h and /usr/include/sched.h may differ slightly
回答3:
Apparently, despite SCHED_DEADLINE
being mainline since three years ago, libc's include files are still missing the interface to the deadline scheduler (i.e., sched_setattr()
, sched_getattr()
and sched_attr
, etc.). A behavior that somehow resembles the time to get libc wrapping the getttid() syscall.
Therefore, at the moment, the best option is to download rt-app from GitHub and use the libdl interface.
来源:https://stackoverflow.com/questions/36739005/deadline-scheduling-policy-not-found