2

enqueue_task_rt関数 in./kernel/sched/rt.cは、タスクを実行キューにキューイングする役割を果たします。enqueue_task_rtcall to enqueue_rt_entitywhich callsが含まれていますdequeue_rt_stack。コードの大部分は論理的に見えますが、関数dequeue_rt_stackが何をするのか理解できないため、少し迷っています。誰かが私が見逃しているロジックが何であるかを教えてもらえますか、または良い読み物を提案できますか.

編集:以下はdequeue_rt_stack関数のコードです

     struct sched_rt_entity *back = NULL;
     /* macro for_each_sched_rt_entity defined as
     for(; rt_se; rt_se = rt_se->parent)*/
     for_each_sched_rt_entity(rt_se) {
             rt_se->back = back;
             back = rt_se;
     }

     for (rt_se = back; rt_se; rt_se = rt_se->back) {
             if (on_rt_rq(rt_se))
                     __dequeue_rt_entity(rt_se);
     }

より具体的には、このコードが必要な理由がわかりません。

     for_each_sched_rt_entity(rt_se) {
             rt_se->back = back;
             back = rt_se;
     }

その関連性は何ですか。

4

2 に答える 2

3

タスクを何らかのキューに追加する場合は、まず現在のキューから削除する必要があります (存在する場合)。

グループ スケジューラでは、タスクは常にツリーの最下位レベルにあり、複数の祖先を持つ場合があります。

       NULL
         ^
         |
+-----parent------+
|                 |
| top-level group |
|                 |
+-----------------+
         ^      ^_____________
         |                    \
+-----parent------+   +-----parent------+
|                 |   |                 |
| mid-level group |   |   other group   |  ...
|                 |   |                 |
+-----------------+   +-----------------+
         ^      ^_____________
         |                    \
+-----parent------+   +-----------------+
|                 |   |                 |
|      task       |   |   other task    |  ...
|                 |   |                 |
+-----------------+   +-----------------+

ツリーからタスクを削除するには、すべてのグループのキューから削除する必要があります。これは、最上位のグループで最初に行う必要があります (そうしないと、スケジューラーが既に部分的に削除されたタスクを実行しようとする可能性があります)。したがって、ポインターをdequeue_rt_stack使用して反対方向のリストを作成します。back

   NULL    back
     ^      |
     |      V
+-parent----------+
|                 |
| top-level group |
|                 |
+----------back---+
     ^      |   ^_____________
     |      V                 \
+-parent----------+   +-----parent------+
|                 |   |                 |
| mid-level group |   |   other group   |  ...
|                 |   |                 |
+----------back---+   +-----------------+
     ^      |   ^_____________
     |      V                 \
+-parent----------+   +-----------------+
|                 |   |                 |
|      task       |   |   other task    |  ...
|                 |   |                 |
+----------back---+   +-----------------+
            |
            V
           NULL

次に、そのbackリストを使用してツリーをたどり、エンティティを正しい順序で削除できます。

于 2012-10-19T13:02:52.997 に答える