2

我已经阅读了一些内容,从中可以看出,与其使用调度策略来调度任务,不如使用调度策略来调度实体。优点是您可以使用相同的调度策略来调度许多事情。因此,为两个调度策略(CFS 和 RT)定义了两个实体,即 assched_entitysched_rt_entity。CFS 实体的代码是(从 v3.5.4 开始)

struct sched_entity {
    struct load_weight  load;       /* for load-balancing */
    struct rb_node      run_node;
    struct list_head    group_node;
    unsigned int        on_rq;

    u64         exec_start;
    u64         sum_exec_runtime;
    u64         vruntime;
    u64         prev_sum_exec_runtime;

    u64         nr_migrations;


#ifdef CONFIG_SCHEDSTATS
    struct sched_statistics statistics;
#endif

#ifdef CONFIG_FAIR_GROUP_SCHED
    struct sched_entity *parent;
    /* rq on which this entity is (to be) queued: */
    struct cfs_rq       *cfs_rq;
    /* rq "owned" by this entity/group: */
    struct cfs_rq       *my_q;
#endif
};

对于 RT(实时)实体是

struct sched_rt_entity {
     struct list_head run_list;
     unsigned long timeout;
     unsigned int time_slice;

     struct sched_rt_entity *back;
     #ifdef CONFIG_RT_GROUP_SCHED
     struct sched_rt_entity  *parent;
     /* rq on which this entity is (to be) queued: */
     struct rt_rq            *rt_rq;
     /* rq "owned" by this entity/group: */
     struct rt_rq            *my_q;
     #endif
};

这两个都使用list_head定义的结构./include/linux/types.h

struct list_head {
     struct list_head *next, *prev;
};

老实说,我不明白如何安排这样的事情。谁能解释这是如何工作的。

PS

此外,我真的很难理解数据成员名称的含义。任何人都可以建议阅读理解内核结构的好书,以便我可以轻松地弄清楚这些事情。我花费的大部分时间都浪费在搜索数据成员的含义上。

4

1 回答 1

2

为了实现组调度,引入了调度实体,以便 CFS(或 RT 调度程序)将为单个任务提供公平的 CPU 时间,同时也为任务组提供公平的 CPU 时间。调度实体可以是一个任务或一组任务。

struct list_head只是实现链表的Linux方式。在您发布字段的代码中, group_noderun_list允许创建struct sched_entity和的列表struct sched_rt_entity。更多信息可以在这里找到。

使用这些list_heads调度实体存储在某些与调度程序相关的数据结构中,例如,cfs_rq.cfs_tasks如果实体是使用account_entity_enqueue().

始终可以在其源代码中找到 Linux 内核的最新文档。在这种情况下,您应该检查这个目录,尤其是这个描述 CFS 的文件。还有对任务组的解释

编辑: task_struct包含一个se类型的字段struct sched_entity。然后,sched_entity使用container_of宏获得对象的地址,就可以检索task_struct对象的地址,请参阅task_of()。(对象地址- in =对象地址的sched_entity偏移量)这是我在此答案前面提到的列表的实现中也使用的非常常见的技巧。setask_structtask_struct

于 2012-10-07T22:19:14.743 回答