四象限法进程调度 给出一个不采用任何函数硬调用 “统一合理调度” 所有任务的方法,只需要修改少量代码:
- task_struct 增加 dynamic_prior 表示唤醒后提升到的优先级。
- try_to_wake_up 增加参数 increment,换算到 sched_class 含义后设置 dynamic_prior。
- sched_class 增加 update_prio 回调,每次 tick,preempt 更新 dynamic_prior,比如衰减它。
针对 ksoftirqd 以及任何其它不确定调度造成的 SLA 违约(task 越多,时间份额越小,这太常规,太 Linux 了),可以更大的 increment 唤醒特定 ksoftirqd(如 NET_RX_SOFTIRQ),并更缓慢的 update_prio。
如网卡,键盘等接受外界数据的大都高紧急高优先,否则唤醒消费数据的进程也没用,纯属浪费时间,Linux 虽鄙视键盘鼠标,但它连网卡也一起鄙视了。Linux cfs 已经在 place_entity 的时候赋予被唤醒 task 优先权,但它微弱且 oneshot,很快即泯然众人,需要同时做到两点,increment 表示紧急性,update_prio 的速率表示重要性。百字短文,不多说。
浙江温州皮鞋湿,下雨进水不会胖。