2

スケジューリング ポリシーを使用してタスクをスケジュールする代わりに、スケジューリング ポリシーを使用してエンティティをスケジュールする方が良いといういくつかのことを読みました。利点は、同じスケジューリング ポリシーで多くのことをスケジュールできることです。そのため、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 :

また、データメンバーの名前の意味を理解するのに本当に苦労しています。これらのことを少し簡単に理解できるように、カーネル構造を理解するための良い読み物を誰でも提案できますか。私が費やした時間のほとんどは、データ メンバーが何を意味するかを検索するのに浪費されています。

4

1 に答える 1

2

CFS (または RT スケジューラ) が個々のタスクに公平な CPU 時間を提供するだけでなく、タスクのグループにも公平な CPU 時間を提供できるように、グループ スケジューリングを実装するためにスケジューリング エンティティが導入されました。スケジューリング エンティティは、タスクまたはタスクのグループのいずれかです。

struct list_headリンクリストを実装するLinuxの方法です。group_nodeフィールドを投稿したコード では、とrun_listのリストを作成できます。詳細については、こちらをご覧くださいstruct sched_entitystruct sched_rt_entity

これらのlist_headsスケジューリング エンティティを使用すると、特定のスケジューラ関連のデータ構造に格納されます。たとえばcfs_rq.cfs_tasks、エンティティが を使用してキューに入れられたタスクである場合account_entity_enqueue()です。

Linux カーネルの常に最新のドキュメントは、そのソース内にあります。この場合、このディレクトリと、特にCFS を記述するこのファイルを確認する必要があります。タスクグループの説明もあります。

編集: typetask_structのフィールドが含まれています。次に、マクロを使用してオブジェクトへのアドレスを取得すると、オブジェクトへのアドレスを取得できます。 を参照してください。(オブジェクトのアドレス- inのオフセット=オブジェクトのアドレス) これは、この回答で前述したリストの実装でも使用される非常に一般的なトリックです。sestruct sched_entitysched_entitycontainer_oftask_structtask_of()sched_entitysetask_structtask_struct

于 2012-10-07T22:19:14.743 に答える