优先级高的task"/>
bfq如何优先服务新产生的优先级高的task
1. st->active对task的组织
(1). __bfq_activate_entity计算entity→start:
min_vstart = st→vtime;
entity->start = min_vstart;
(2). 随后调用bfq_update_fin_time_enqueue计算entity→finish:
entity->finish = entity->start +
bfq_delta(service, entity→weight);
这里可以看到权重高的task对应的entity->finish会比较小。
(3).调用bfq_active_insert把当前task加到st:
bfq_insert(&st->active, entity);
这里st→active tree以entity->finish为key进行组织,entity->finish小的挂到树左边。
所以权重高的task会挂到st→active tree的左边,进而可以被优先服务。
2. sd->next_in_service成员的更新
当新task开始运行的时候,bfq会调用bfq_update_next_in_service对当前group的next_in_service成员进行更新,其中有一个条件是: bfq_gt(next_in_service->finish,new_entity->finish),也就是说新task的finish成员越小,越有机会抢占别的task拿到IO资源,而finish成员的计算公式正是保证了这一点:
entity->finish = entity->start +
bfq_delta(service, entity→weight);
更多推荐
bfq如何优先服务新产生的优先级高的task
发布评论