2017-02-03 5 views
0

리눅스에는 SCHED_FIFO, SCHED_RR, SCHED_OTHER 등과 같은 몇 가지 스케줄링 정책이 있으며, sched_setscheduler 시스템 호출을 사용하여 실시간 프로세스의 스케줄러를 변경할 수 있습니다.리눅스에서 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); 
}