簡體   English   中英

如何在linux中使用宏SCHED_DEADLINE?

[英]How to use the macro SCHED_DEADLINE in linux?

我們知道linux中有幾種調度策略,如SCHED_FIFOSCHED_RRSCHED_OTHER等,可以使用sched_setscheduler系統調用更改實時進程的調度程序。

但是我無法使用SCHED_DEADLINE宏將程序的調度程序更改為Earliest-deadline-first 任何人都可以提出一種如何實現這一目標的方法嗎?

此鏈接具有 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 會返回錯誤。

首先,你需要一個 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM