任督二脉之进程管理(4)

一、大纲

二、负载均衡

1)

原来是nice+/-5的改变。

例子:两个死循环子线程:real为自然时间,sys内核态时间和user用户态时间 因为两个线程是在两个核上面运行所以 sys+user = 2* real。

 四核运行环境:

RT:

普通进程:

  • 周期性闲时其他核负载达到一定程度拖过来跑,
  • IDLE时负载均衡时拖过来跑,
  • fork和exec(数据段和代码段替换)推到其他闲的核上面跑。

push到最闲的核和闲时pull到本核。

2)task的亲和力 affinity

函数:

工具:taskset -a 所有 -p  01/02/03是cpu掩码

三、中断负载均衡 特指硬中断

1)一个网卡的4个中断队列分给4个核

2)有时候中断做不了负载均衡,比如只有一个中断队列,cpu0里IRQ里面调度softIRQ,softIRQ也会运行在cpu0,这样cpu0比较忙,RPS补丁可以做软中断负载均衡,帮助把软中断借用ipi中断派发到其他核,(ipi中断:先发中断,在中断抛软中断)。

四、cgroup

1)分群调度,群间和群内都是cfs调度算法。

 RT进程能不能放进cgroup,和普通进程放一个group???

创建cgroup:

加进程到cgroup:下面是把整个进程加到group里面,也可以把单个线程放到group里面修改task

修改group的权重,默认值为1024

quota:-1表示不限制,在cpu.cfs_period_us时间里面最多跑cpu.cfs_quota_us。

Android对cgroup的应用

docker也有使用cgroup

 

五、硬实时

硬实时是可预期,有截止期限。

工具测试调度抖动,应该唤醒到实际唤醒的时间差。

六、linux调度

1)红色为不可抢占的区间:

最后一个为打上RT补丁后的效果。

2)四类区间

第四类为可调度的进程上下文。spin_lock可以有好几种api,默认是关本cpu的调度,也可以用另一个api关中断。

软中断里面可以再软中断,中断里面不可以再中断,不能嵌套。软中断可以被中断打断,spin_lock可以被中断抢占。

例子:IRQ1为软中断,

 

3)RT补丁,把linux改造为一个hard real-time系统。

  1. spin_lock是关中断自旋,改为mutex睡眠,让渡CPU。
  2. 优先级继承是解决优先级反转问题。
  3. 中断线程化:把中断服务程序放到一个线程里面执行,变为第四类区间,只有在中断到来和线程之间不可抢占。
  4. 软中断线程化:也变为第四类区间。

 七、答疑

  1. 不能嵌套中断,正在执行中断,中断控制器会pending 后来的中断。硬件有可能会丢中断。
  2. FIQ能打断IRQ,一般linux说的IRQ不是FIQ。
  3. 实时操作系统不是所有进程都是实时的,
  4. 一句话中断不能抢,time tick中断不能抢因为不能线程化,raw_spin_lock不能抢。
  5. spin_lock_irq 、spin_lock_irqsave 是既关调度又关中断,spin_lock_irqsave会保存调用前的中断开/关状态。
原文地址:https://www.cnblogs.com/shihuvini/p/8419167.html