linux中的宏SCHED_DEADLINE如何使用?
How to use the macro SCHED_DEADLINE in linux?
我们知道 linux 中有多种调度策略,如 SCHED_FIFO
、SCHED_RR
、SCHED_OTHER
等使用 sched_setscheduler
系统调用的时间进程。
但是我无法使用 SCHED_DEADLINE
宏将程序的调度程序更改为 Earliest-deadline-first
?谁能提出实现此目标的方法?
这个 link 有 EDF 算法的示例代码,即截止时间安排。
http://www.admin-magazine.com/Archive/2015/25/Optimizing-utilization-with-the-EDF-scheduler
sched_setattr() 必须用于截止日期安排,而不是 sched_setscheduler() 可用于调用 sched_rr/sched_fifo/sched_other...等。此外,线程的周期必须足够兼容以适应线程的周期,否则 sched_setattr returns 错误。
首先,你需要一个3.14+ Linux内核。
此外,由于 glibc 尚未提供 API 包装新的调度程序系统调用(即 ),您需要自己包装它们:
#define _GNU_SOURCE
#include <linux/kernel.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <time.h>
#include <linux/types.h>
#include <sched.h>
#include <linux/sched.h>
#include <sys/types.h>
#define SCHED_DEADLINE 6
/* __NR_sched_setattr number */
#ifndef __NR_sched_setattr
#ifdef __x86_64__
#define __NR_sched_setattr 314
#endif
#ifdef __i386__
#define __NR_sched_setattr 351
#endif
#ifdef __arm__
#define __NR_sched_setattr 380
#endif
#ifdef __aarch64__
#define __NR_sched_setattr 274
#endif
#endif
/* __NR_sched_getattr number */
#ifndef __NR_sched_getattr
#ifdef __x86_64__
#define __NR_sched_getattr 315
#endif
#ifdef __i386__
#define __NR_sched_getattr 352
#endif
#ifdef __arm__
#define __NR_sched_getattr 381
#endif
#ifdef __aarch64__
#define __NR_sched_getattr 275
#endif
#endif
struct sched_attr {
__u32 size;
__u32 sched_policy;
__u64 sched_flags;
/* SCHED_NORMAL, SCHED_BATCH */
__s32 sched_nice;
/* SCHED_FIFO, SCHED_RR */
__u32 sched_priority;
/* SCHED_DEADLINE */
__u64 sched_runtime;
__u64 sched_deadline;
__u64 sched_period;
};
int sched_setattr(pid_t pid,
const struct sched_attr *attr,
unsigned int flags)
{
return syscall(__NR_sched_setattr, pid, attr, flags);
}
int sched_getattr(pid_t pid,
struct sched_attr *attr,
unsigned int size,
unsigned int flags)
{
return syscall(__NR_sched_getattr, pid, attr, size, flags);
}
我们知道 linux 中有多种调度策略,如 SCHED_FIFO
、SCHED_RR
、SCHED_OTHER
等使用 sched_setscheduler
系统调用的时间进程。
但是我无法使用 SCHED_DEADLINE
宏将程序的调度程序更改为 Earliest-deadline-first
?谁能提出实现此目标的方法?
这个 link 有 EDF 算法的示例代码,即截止时间安排。
http://www.admin-magazine.com/Archive/2015/25/Optimizing-utilization-with-the-EDF-scheduler
sched_setattr() 必须用于截止日期安排,而不是 sched_setscheduler() 可用于调用 sched_rr/sched_fifo/sched_other...等。此外,线程的周期必须足够兼容以适应线程的周期,否则 sched_setattr returns 错误。
首先,你需要一个3.14+ Linux内核。
此外,由于 glibc 尚未提供 API 包装新的调度程序系统调用(即 ),您需要自己包装它们:
#define _GNU_SOURCE
#include <linux/kernel.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <time.h>
#include <linux/types.h>
#include <sched.h>
#include <linux/sched.h>
#include <sys/types.h>
#define SCHED_DEADLINE 6
/* __NR_sched_setattr number */
#ifndef __NR_sched_setattr
#ifdef __x86_64__
#define __NR_sched_setattr 314
#endif
#ifdef __i386__
#define __NR_sched_setattr 351
#endif
#ifdef __arm__
#define __NR_sched_setattr 380
#endif
#ifdef __aarch64__
#define __NR_sched_setattr 274
#endif
#endif
/* __NR_sched_getattr number */
#ifndef __NR_sched_getattr
#ifdef __x86_64__
#define __NR_sched_getattr 315
#endif
#ifdef __i386__
#define __NR_sched_getattr 352
#endif
#ifdef __arm__
#define __NR_sched_getattr 381
#endif
#ifdef __aarch64__
#define __NR_sched_getattr 275
#endif
#endif
struct sched_attr {
__u32 size;
__u32 sched_policy;
__u64 sched_flags;
/* SCHED_NORMAL, SCHED_BATCH */
__s32 sched_nice;
/* SCHED_FIFO, SCHED_RR */
__u32 sched_priority;
/* SCHED_DEADLINE */
__u64 sched_runtime;
__u64 sched_deadline;
__u64 sched_period;
};
int sched_setattr(pid_t pid,
const struct sched_attr *attr,
unsigned int flags)
{
return syscall(__NR_sched_setattr, pid, attr, flags);
}
int sched_getattr(pid_t pid,
struct sched_attr *attr,
unsigned int size,
unsigned int flags)
{
return syscall(__NR_sched_getattr, pid, attr, size, flags);
}