linux 负载均衡 cpu迁移 cpu亲和性设置 之间的联系

  • 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);

}   

static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu)
{
   ……
    if (p->on_rq) {
        deactivate_task(rq_src, p, 0);
        set_task_cpu(p, dest_cpu);
        activate_task(rq_dest, p, 0);
        check_preempt_curr(rq_dest, p, 0);
    }
  ……
}
无论是pull_task还是 __migrate_task 都调用了set_task_cpu 实现指向目标cpu,两者核心功能和实现都一样,
但是__migrate_task加强了验错机制,pull_task在之前调用负载函数时已经 完成了验错任务,所以pull_task只管执行即可

  • cpu亲和性设置的系统调用
进程的cpu亲和性设置后,将会比较进程是否在新的cpu亲和性位图内,如果是的话,就保持原样,否则 立刻进行迁移

cpu亲和性设置的系统调用逻辑图

SYSCALL_DEFINE3(sched_setaffinity, pid_t, pid, unsigned int, len,unsigned long __user *, user_mask_ptr)  -->sys_sched_setaffinity 
sys_sched_setaffinity--> sched_setaffinity -->set_cpus_allowed_ptr-->do_set_cpus_allowed--> migration_cpu_stop  -->  __migrate_task
  • 总结:
    cpu负载均衡和cpu迁移调用本质实现是一样的,cpu亲和性设置后如果进程不符合新的亲和性情况,会立刻进行迁移。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__set_PRIMASK和__disable_irq是CMSIS提供的用来操作中断的接口。__set_PRIMASK用于设置PRIMASK寄存器的值,可以用来开启或关闭中断。__disable_irq是调用了__set_PRIMASK来关闭所有中断。通过调用__disable_irq,CPU将不再响应中断请求,但并不会屏蔽中断的触发。如果在关闭总中断后有中断触发,中断标志将被置位。当调用__enable_irq来开启总中断后,之前触发的中断将会立即被处理。要想禁止所有中断,可以对每个模块的中断进行Disable操作,或者通过清除中断标志或清除寄存器状态的方法来达到目的。这样在__enable_irq开启总中断后,MCU就不会响应之前触发的中断了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32中断相关概念阐述](https://blog.csdn.net/qq153471503/article/details/126177103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32关于开关总中断的问题](https://blog.csdn.net/weixin_42224980/article/details/105654722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值