首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当主线程设置pthread_create调度策略时,sched_deadline返回EAGAIN

当主线程设置pthread_create调度策略时,sched_deadline返回EAGAIN
EN

Stack Overflow用户
提问于 2014-06-18 13:32:53
回答 2查看 870关注 0票数 4

我想让进程在新的Linux SCHED_DEADLINE调度策略下进行调度。同时,这个进程必须创建一些工作线程来执行其他一些工作。但是,当我在成功调用pthread_create之后调用sched_setattr(which是为了设置进程调度策略)时,我得到了一个EAGAIN。我知道在实时进程中创建线程可能有点奇怪。可能会出现“新线程的调度策略将是什么”之类的问题。

尽管如此,在SCHED_DEADLINE进程中是否有创建新线程的方法?

和如何定义新线程的调度策略?

重现我的问题的代码可以在

deadline/

EN

回答 2

Stack Overflow用户

发布于 2018-03-29 10:04:00

在合并SCHED_DEADLINE时,内核社区在列表中显式地讨论了这个主题,并决定不允许SCHED_DEADLINE任务创建其他任务(通过fork()pthread_create())。

因此,目前还没有办法实现这样的行为。您必须在设置SCHED_DEADLINE优先级之前创建这些任务。

关于第二个问题,不幸的是,glibc还没有包装sched_setattr() syscall (尽管已经有4年了)。下面是一些用于创建SCHED_DEADLINE任务的代码:

代码语言:javascript
运行
复制
#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);
}

然后,在任务代码中:

代码语言:javascript
运行
复制
struct sched_attr attr;
attr.size = sizeof(attr);
attr.sched_flags = 0;
attr.sched_nice = 0;
attr.sched_priority = 0;

/* This creates a 10ms/30ms reservation */
attr.sched_policy = SCHED_DEADLINE;
attr.sched_runtime = 10 * 1000 * 1000;
attr.sched_period = attr.sched_deadline = 30 * 1000 * 1000;

if (sched_setattr(0, &attr, flags) < 0) {
       perror("sched_setattr()");
}
票数 2
EN

Stack Overflow用户

发布于 2014-07-10 12:23:33

我认为您会发现新线程的默认调度策略是PTHREAD_INHERIT_SCHED。要覆盖这一点,您需要pthread_attr_init()一组显式属性,使用pthread_attr_setschedpolicy()pthread_attr_setschedparam(),然后在pthread_create()中应用这些属性。

您可以在将进程设置为sched_getscheduler()之前先使用sched_getparam()SCHED_DEADLINE,然后将它们输入pthread_attr以供以后使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24286961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档