我已经阅读了一些内容,从中可以看出,与其使用调度策略来调度任务,不如使用调度策略来调度实体。优点是您可以使用相同的调度策略来调度许多事情。因此,为两个调度策略(CFS 和 RT)定义了两个实体,即 assched_entity
和sched_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:
此外,我真的很难理解数据成员名称的含义。任何人都可以建议阅读理解内核结构的好书,以便我可以轻松地弄清楚这些事情。我花费的大部分时间都浪费在搜索数据成员的含义上。