当一个任务是要添加一些队列,必须首先从它目前是,如果任何队列中删除。
随着group scheduler,任务总是在树的最低水平,并可能有多个祖先:
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列表可以被用来走在树删除以正确的顺序实体。