并发与竞争

概念

概念:多个执行单元并行执行时,如果对共享资源发起访问就容易引起竟态

竟态条件:核与核的进程之间,核与核的中断之间,核中断与核进程之间,核内进程之间,核内进程与中断

编译乱序:打开编译器优化后,汇编码并没有严格按照代码的逻辑顺序

执行乱序:执行也不一定按汇编码顺序,缓存命中率高的访存指令会更容易被执行

内存屏障指令:在DMB之后的显示内存访问执行前,保证DMB指令之前的内存访问完成;等待DSB指令之前的指令完成;在ISB之后的指令都是从缓存或内存中获得的

解决竟态

中断屏蔽:让cpu屏蔽掉中断控制器返回的中断信号,由于只能关闭本cpu的中断但是不能解决多核引起的竟态,所以一般不单独使用

原子操作:保证对整型数据的修改是排他性的,ldrex和strex配对使用,如果有并发的访问,会让先配对的执行完,再执行后面的配对

自旋锁:通过一个原子操作测试并设置一个内存变量,测试是空闲状态,可获得这个锁并执行下面的,否则重复测试,即"自旋";特性:会禁止本核的抢占调度,若调用会引起调度的函数,内核可能或崩溃,搭配中断屏蔽指令可以避免核内死锁

互斥锁:标记占用与否的原子变量,等待该互斥锁的任务链表,用自旋锁保证对链表的访问安全;获取不到锁就放进等待链表;特性:获取不到锁,就会释放CPU,但是会有切换任务上下文的开销

负载均衡

进程负载均衡

平均负载:是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,用top可以看到很多关于cpu,进程,内存相关的信息

load_balance:通过将进程从一个cpu的run_queue迁移到另一个cpu的run_queue,来保持cpu之间的负载均衡

实时进程:N个CPU上分别运行着的也必须是优先级最高的top-N个进程。如果实时进程不足N个,那么剩下的CPU才分给普通进程去使用;通过pull_rt_task和push_rt_task两个函数来完成迁移

普通进程:周期性检查那个核空闲,就给他pull任务(负载大给负载小的pull);某个核进入idle状态,会主动pull任务执行;fork和exec的进程会放到最闲的核

中断负载均衡

设置中断分配的方法很简单,就是修改/proc/irq/IRQ/smp_affinity,这里IRQ前面已经说过可以从/proc/interrupts里面查,上图的例子中eth1对应的IRQ为16,如果我们需要把eth1网卡中断被各个cpu平均处理,只需要执行如下命令:echo ff > /proc/irq/16/ smp_affinity;如果想把eth1对应的中断绑定在cpu2上处理,执行:echo 04 > /proc/irq/16/ smp_affinity

posted on 2022-03-08 22:07  lzd626  阅读(47)  评论(0编辑  收藏  举报