2017-02-03 22 views
0

SCHED_FIFO,SCHED_RR,SCHED_OTHERなどのようないくつかのスケジューリングポリシーがあり、sched_setschedulerシステムコールを使用してリアルタイムプロセスのスケジューラを変更することができます。LinuxでSCHED_DEADLINEをどのように使用しますか?

しかし、SCHED_DEADLINEマクロを使用して、プログラムのスケジューラをEarliest-deadline-firstに変更することはできませんか?誰もこれを達成する方法を提案することはできますか?

答えて

0

このリンクには、EDFアルゴリズム(期限のスケジューリング)のサンプルコードがあります。
http://www.admin-magazine.com/Archive/2015/25/Optimizing-utilization-with-the-EDF-scheduler

sched_setattrは()の代わりに.... SCHED_RR/SCHED_FIFO/SCHED_OTHER等を呼び出すために使用することができるのみsched_setscheduler()の、デッドラインスケジューリングのために使用されなければなりません。また、スレッドの期間は、スレッドの期間に対応できるだけの互換性がなければなりません。さもなければ、sched_setattrはエラーを返します。

0

まず、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); 
} 
関連する問題