- cpu迁移和负载均衡
在做cpu迁移和负载均衡的最后一步时,将会将源地址进程移除出rq队列,并重新加载到目标cpu队列中去,其实现函数分别是
__migrate_task 和 pull_task 这两个函数
这两个函数实际的执行操作大同小异:
Ø deactivate_task()从最忙runquene中移除进程
Ø set_task_cpu()更新进程CPU指向
Ø activate_task()把进程重新插入添加到本地CPU
Ø check_preempt_curr()检查是否拥有更高优先权,可以调用resched_task()
cpu migrate 调度的逻辑图
migrate_call --> migrate_tasks--> __migrate_task --> deactive|set_task_cpu|activate
负载均衡的逻辑图
active_load_balance_cpu_stop-->move_one_task--> can_migrate_task |pull_task --> deactive|set_task_cpu|activate
cpu重新指向的逻辑图
deactive_task --> dequeue_task
set_task_cpu --> __set_task_cpu --> |set_task_rq
|task_thread_info(p)->cpu = cpu;
pull_task和__migrate的代码
static void pull_task(struct rq *src_rq, struct task_struct *p,
struct rq *this_rq, int this_cpu)
{
deactivate_task(src_rq, p, 0);
set_task_cpu(p, this_cpu);
activate_task(this_rq, p, 0);
check_preempt_curr(this_rq, p, 0);
}
- cpu亲和性设置的系统调用
- 总结:
cpu负载均衡和cpu迁移调用本质实现是一样的,cpu亲和性设置后如果进程不符合新的亲和性情况,会立刻进行迁移。