DEADLINE scheduling policy not found

烂漫一生 提交于 2019-12-23 11:51:30

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!