スケジューリング ポリシーを使用してタスクをスケジュールする代わりに、スケジューリング ポリシーを使用してエンティティをスケジュールする方が良いといういくつかのことを読みました。利点は、同じスケジューリング ポリシーで多くのことをスケジュールできることです。そのため、2 つのスケジューリング ポリシー (CFS と RT) に対して定義された 2 つのエンティティ、つまり と がsched_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 :
また、データメンバーの名前の意味を理解するのに本当に苦労しています。これらのことを少し簡単に理解できるように、カーネル構造を理解するための良い読み物を誰でも提案できますか。私が費やした時間のほとんどは、データ メンバーが何を意味するかを検索するのに浪費されています。