.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/scheduler/sched-capacity.rst :翻译: å”艺舟 Tang Yizhou <tangyeechou@gmail.com> :æ ¡è¯‘: 时奎亮 Alex Shi <alexs@kernel.org> ============= 算力感知调度 ============= 1. CPU算力 ========== 1.1 简介 -------- 一般æ¥è¯´ï¼ŒåŒæž„çš„SMPå¹³å°ç”±å®Œå…¨ç›¸åŒçš„CPUæž„æˆã€‚异构的平å°åˆ™ç”±æ€§èƒ½ç‰¹å¾ä¸åŒçš„CPUæž„æˆï¼Œåœ¨è¿™æ ·çš„ å¹³å°ä¸ï¼ŒCPUä¸èƒ½è¢«è®¤ä¸ºæ˜¯ç›¸åŒçš„。 我们引入CPU算力(capacityï¼‰çš„æ¦‚å¿µæ¥æµ‹é‡æ¯ä¸ªCPUèƒ½è¾¾åˆ°çš„æ€§èƒ½ï¼Œå®ƒçš„å€¼ç›¸å¯¹ç³»ç»Ÿä¸æ€§èƒ½æœ€å¼ºçš„CPU åšè¿‡å½’一化处ç†ã€‚异构系统也被称为éžå¯¹ç§°CPUç®—åŠ›ç³»ç»Ÿï¼Œå› ä¸ºå®ƒä»¬ç”±ä¸åŒç®—力的CPU组æˆã€‚ 最大å¯è¾¾æ€§èƒ½ï¼ˆæ¢è¨€ä¹‹ï¼Œæœ€å¤§CPUç®—åŠ›ï¼‰çš„å·®å¼‚æœ‰ä¸¤ä¸ªä¸»è¦æ¥æº: - 䏿˜¯æ‰€æœ‰CPU的微架构都相åŒã€‚ - 在动æ€ç”µåŽ‹é¢‘çŽ‡å‡é™ï¼ˆDynamic Voltage and Frequency Scaling,DVFS)框架ä¸ï¼Œä¸æ˜¯æ‰€æœ‰çš„CPU都 èƒ½è¾¾åˆ°ä¸€æ ·é«˜çš„æ“作性能值(Operating Performance Points,OPP。译注,也就是“频率-电压â€å¯¹ï¼‰ã€‚ Arm大尿 ¸ï¼ˆbig.LITTLEï¼‰ç³»ç»Ÿæ˜¯åŒæ—¶å…·æœ‰ä¸¤ç§å·®å¼‚的一个例åã€‚ç›¸è¾ƒå°æ ¸ï¼Œå¤§æ ¸é¢å‘性能(拥有更多的 æµæ°´çº¿å±‚级,更大的缓å˜ï¼Œæ›´æ™ºèƒ½çš„分支预测器ç‰ï¼‰ï¼Œé€šå¸¸å¯ä»¥è¾¾åˆ°æ›´é«˜çš„æ“ä½œæ€§èƒ½å€¼ã€‚ CPU性能通常由æ¯ç§’百万指令(Millions of Instructions Per Second,MIPS)表示,也å¯è¡¨ç¤ºä¸º per Hz能执行的指令数,故:: capacity(cpu) = work_per_hz(cpu) * max_freq(cpu) 1.2 è°ƒåº¦å™¨æœ¯è¯ -------------- 调度器使用了两ç§ä¸åŒçš„算力值。CPUçš„ ``capacity_orig`` 是它的最大å¯è¾¾ç®—åŠ›ï¼Œå³æœ€å¤§å¯è¾¾æ€§èƒ½ç‰çº§ã€‚ CPUçš„ ``capacity`` 是 ``capacity_orig`` 扣除了一些性能æŸå¤±ï¼ˆæ¯”如处ç†ä¸æ–的耗时)的值。 注æ„CPUçš„ ``capacity`` 仅仅被设计用于CFS调度类,而 ``capacity_orig`` æ˜¯ä¸æ„ŸçŸ¥è°ƒåº¦ç±»çš„。为 简æ´èµ·è§ï¼Œæœ¬æ–‡æ¡£çš„剩余部分将ä¸åŠ åŒºåˆ†çš„ä½¿ç”¨æœ¯è¯ ``capacity`` å’Œ ``capacity_orig`` 。 1.3 å¹³å°ç¤ºä¾‹ ------------ 1.3.1 æ“ä½œæ€§èƒ½å€¼ç›¸åŒ ~~~~~~~~~~~~~~~~~~~~ è€ƒè™‘ä¸€ä¸ªå‡æƒ³çš„åŒæ ¸éžå¯¹ç§°CPUç®—åŠ›ç³»ç»Ÿï¼Œå…¶ä¸ - work_per_hz(CPU0) = W - work_per_hz(CPU1) = W/2 - 所有CPU以相åŒçš„固定频率è¿è¡Œ æ ¹æ®ä¸Šæ–‡å¯¹ç®—力的定义: - capacity(CPU0) = C - capacity(CPU1) = C/2 若这是Arm大尿 ¸ç³»ç»Ÿï¼Œé‚£ä¹ˆCPU0æ˜¯å¤§æ ¸ï¼Œè€ŒCPU1æ˜¯å°æ ¸ã€‚ 考虑一ç§å‘¨æœŸæ€§äº§ç”Ÿå›ºå®šå·¥ä½œé‡çš„å·¥ä½œè´Ÿè½½ï¼Œä½ å°†ä¼šå¾—åˆ°ç±»ä¼¼ä¸‹å›¾çš„æ‰§è¡Œè½¨è¿¹:: CPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time CPU1 work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time CPU0在系统ä¸å…·æœ‰æœ€é«˜ç®—力(C),它使用T个å•使—¶é—´å®Œæˆå›ºå®šå·¥ä½œé‡W。å¦ä¸€æ–¹é¢ï¼ŒCPU1åªæœ‰CPU0ä¸€åŠ ç®—åŠ›ï¼Œå› æ¤åœ¨T个å•使—¶é—´å†…仅完æˆå·¥ä½œé‡W/2。 1.3.2 最大æ“作性能值ä¸åŒ ~~~~~~~~~~~~~~~~~~~~~~~~ 具有ä¸åŒç®—力值的CPU,通常æ¥è¯´æœ€å¤§æ“作性能值也ä¸åŒã€‚考虑上一å°èŠ‚æåˆ°çš„CPU(也就是说, work_per_hz()相åŒï¼‰: - max_freq(CPU0) = F - max_freq(CPU1) = 2/3 * F 这将推出: - capacity(CPU0) = C - capacity(CPU1) = C/3 执行1.3.1节æè¿°çš„工作负载,æ¯ä¸ªCPU按最大频率è¿è¡Œï¼Œç»“果为:: CPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time workload on CPU1 CPU1 work ^ | ______________ ______________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time 1.4 关于计算方å¼çš„æ³¨æ„事项 -------------------------- éœ€è¦æ³¨æ„的是,使用å•一值æ¥è¡¨ç¤ºCPU性能的差异是有些争议的。两个ä¸åŒçš„微架构的相对性能差异应该 æè¿°ä¸ºï¼šX%æ•´æ•°è¿ç®—差异,Y%浮点数è¿ç®—差异,Z%分支跳转差异,ç‰ç‰ã€‚尽管如æ¤ï¼Œä½¿ç”¨ç®€å•è®¡ç®—æ–¹å¼ çš„ç»“æžœç›®å‰è¿˜æ˜¯ä»¤äººæ»¡æ„的。 2. 任务使用率 ============= 2.1 简介 -------- ç®—åŠ›æ„ŸçŸ¥è°ƒåº¦è¦æ±‚æè¿°ä»»åŠ¡éœ€æ±‚ï¼Œæè¿°æ–¹å¼è¦å’ŒCPU算力相关。æ¯ä¸ªè°ƒåº¦ç±»å¯ä»¥ç”¨ä¸åŒçš„æ–¹å¼æè¿°å®ƒã€‚ 任务使用率是CFS独有的æè¿°æ–¹å¼ï¼Œä¸è¿‡åœ¨è¿™é‡Œä»‹ç»å®ƒæœ‰åŠ©äºŽå¼•å…¥æ›´å¤šä¸€èˆ¬æ€§çš„æ¦‚å¿µã€‚ 任务使用率是一ç§ç”¨ç™¾åˆ†æ¯”æ¥æè¿°ä»»åŠ¡åžå率需求的方å¼ã€‚一个简å•的近似是任务的å 空比,也就是说:: task_util(p) = duty_cycle(p) 在频率固定的SMP系统ä¸ï¼Œ100%的利用率æ„味ç€ä»»åŠ¡æ˜¯å¿™ç‰å¾…循环。å之,10%的利用率暗示这是一个 å°å‘¨æœŸä»»åŠ¡ï¼Œå®ƒåœ¨ç¡çœ 上花费的时间比执行更多。 2.2 频率ä¸å˜æ€§ -------------- 一个需è¦è€ƒè™‘的议题是,工作负载的å 空比å—CPUæ£åœ¨è¿è¡Œçš„æ“ä½œæ€§èƒ½å€¼ç›´æŽ¥å½±å“。考虑以给定的频率F 执行周期性工作负载:: CPU work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time å¯ä»¥ç®—出 duty_cycle(p) == 25%。 现在,考虑以给定频率F/2执行 *åŒä¸€ä¸ª* 工作负载:: CPU work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time å¯ä»¥ç®—出 duty_cycle(p) == 50%,尽管两次执行ä¸ï¼Œä»»åŠ¡çš„è¡Œä¸ºå®Œå…¨ä¸€è‡´ï¼ˆä¹Ÿå°±æ˜¯è¯´ï¼Œæ‰§è¡Œçš„å·¥ä½œé‡ ç›¸åŒï¼‰ã€‚ 任务利用率信å·å¯æŒ‰ä¸‹é¢å…¬å¼å¤„ç†æˆé¢‘率ä¸å˜çš„(译注:这里的术è¯ç”¨åˆ°äº†ä¿¡å·ä¸Žç³»ç»Ÿçš„æ¦‚念):: task_util_freq_inv(p) = duty_cycle(p) * (curr_frequency(cpu) / max_frequency(cpu)) 对上é¢ä¸¤ä¸ªä¾‹åè¿ç”¨è¯¥å…¬å¼ï¼Œå¯ä»¥ç®—出频率ä¸å˜çš„任务利用率å‡ä¸º25%。 2.3 CPUä¸å˜æ€§ ------------- CPU算力与任务利用率具有类型的效应,在算力ä¸åŒçš„CPU上执行完全相åŒçš„工作负载,将算出ä¸åŒçš„ å 空比。 考虑1.3.2节æåˆ°çš„系统,也就是说:: - capacity(CPU0) = C - capacity(CPU1) = C/3 æ¯ä¸ªCPU按最大频率执行指定周期性工作负载,结果为:: CPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time CPU1 work ^ | ______________ ______________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time 也就是说, - duty_cycle(p) == 25%,如果任务p在CPU0上按最大频率è¿è¡Œã€‚ - duty_cycle(p) == 75%,如果任务p在CPU1上按最大频率è¿è¡Œã€‚ 任务利用率信å·å¯æŒ‰ä¸‹é¢å…¬å¼å¤„ç†æˆCPU算力ä¸å˜çš„:: task_util_cpu_inv(p) = duty_cycle(p) * (capacity(cpu) / max_capacity) å…¶ä¸ ``max_capacity`` æ˜¯ç³»ç»Ÿä¸æœ€é«˜çš„CPU算力。对上é¢çš„例åè¿ç”¨è¯¥å…¬å¼ï¼Œå¯ä»¥ç®—出CPU算力ä¸å˜ 的任务利用率å‡ä¸º25%。 2.4 任务利用率ä¸å˜é‡ -------------------- 频率和CPU算力ä¸å˜æ€§éƒ½éœ€è¦è¢«åº”用到任务利用率的计算ä¸ï¼Œä»¥ä¾¿æ±‚出真æ£çš„ä¸å˜ä¿¡å·ã€‚ ä»»åŠ¡åˆ©ç”¨çŽ‡çš„ä¼ªè®¡ç®—å…¬å¼æ˜¯åŒæ—¶å…·å¤‡CPU和频率ä¸å˜æ€§çš„,也就是说,对于指定任务p:: curr_frequency(cpu) capacity(cpu) task_util_inv(p) = duty_cycle(p) * ------------------- * ------------- max_frequency(cpu) max_capacity 也就是说,任务利用率ä¸å˜é‡å‡å®šä»»åŠ¡åœ¨ç³»ç»Ÿä¸æœ€é«˜ç®—力CPU上以最高频率è¿è¡Œï¼Œä»¥æ¤æè¿°ä»»åŠ¡çš„è¡Œä¸ºã€‚ 在接下æ¥çš„ç« èŠ‚ä¸æåˆ°çš„ä»»ä½•ä»»åŠ¡åˆ©ç”¨çŽ‡ï¼Œå‡æ˜¯ä¸å˜é‡çš„å½¢å¼ã€‚ 2.5 利用率估算 -------------- 由于预测未æ¥çš„æ°´æ™¶çƒä¸å˜åœ¨ï¼Œå½“ä»»åŠ¡ç¬¬ä¸€æ¬¡å˜æˆå¯è¿è¡Œæ—¶ï¼Œä»»åŠ¡çš„è¡Œä¸ºå’Œä»»åŠ¡åˆ©ç”¨çŽ‡å‡ä¸èƒ½è¢«å‡†ç¡®é¢„测。 CFS调度类基于实体负载跟踪机制(Per-Entity Load Tracking, PELT)维护了少é‡CPU和任务信å·ï¼Œ å…¶ä¸ä¹‹ä¸€å¯ä»¥ç®—出平å‡åˆ©ç”¨çŽ‡ï¼ˆä¸Žçž¬æ—¶ç›¸å)。 è¿™æ„味ç€ï¼Œå°½ç®¡è¿ç”¨â€œçœŸå®žçš„â€ä»»åŠ¡åˆ©ç”¨çŽ‡ï¼ˆå‡å€Ÿæ°´æ™¶çƒï¼‰å†™å‡ºç®—力感知调度的准则,但是它的实现将åªèƒ½ 用任务利用率的估算值。 3. 算力感知调度的需求 ===================== 3.1 CPU算力 ----------- 当å‰ï¼ŒLinuxæ— æ³•å‡è‡ªèº«ç®—出CPUç®—åŠ›ï¼Œå› æ¤å¿…é¡»è¦æœ‰æŠŠè¿™ä¸ªä¿¡æ¯ä¼ 递给Linux的方å¼ã€‚æ¯ä¸ªæž¶æž„å¿…é¡»ä¸ºæ¤ å®šä¹‰arch_scale_cpu_capacity()函数。 armã€arm64å’ŒRISC-Væž¶æž„ç›´æŽ¥æŠŠè¿™ä¸ªä¿¡æ¯æ˜ 射到arch_topology驱动的CPU scalingæ•°æ®ä¸ï¼ˆè¯‘注:å‚考 arch_topology.hçš„percpuå˜é‡cpu_scale),它是从capacity-dmips-mhz CPU bindingä¸è¡ç”Ÿè®¡ç®— 出æ¥çš„。å‚è§Documentation/devicetree/bindings/cpu/cpu-capacity.txt。 3.2 频率ä¸å˜æ€§ -------------- 如2.2节所述,算力感知调度需è¦é¢‘率ä¸å˜çš„任务利用率。æ¯ä¸ªæž¶æž„必须为æ¤å®šä¹‰ arch_scale_freq_capacity(cpu)函数。 å®žçŽ°è¯¥å‡½æ•°è¦æ±‚计算出æ¯ä¸ªCPU当å‰ä»¥ä»€ä¹ˆé¢‘率在è¿è¡Œã€‚å®žçŽ°å®ƒçš„ä¸€ç§æ–¹å¼æ˜¯åˆ©ç”¨ç¡¬ä»¶è®¡æ•°å™¨ï¼ˆx86çš„ APERF/MPERF,arm64çš„AMU),它能按CPU当å‰é¢‘率动æ€å¯æ‰©å±•地å‡é™é€’增计数器的速率。å¦ä¸€ç§æ–¹å¼æ˜¯ 在cpufreq频率å˜åŒ–时直接使用钩åå‡½æ•°ï¼Œå†…æ ¸æ¤æ—¶æ„ŸçŸ¥åˆ°å°†è¦è¢«åˆ‡æ¢çš„频率(也被arm/arm64实现了)。 4. 调度器拓扑结构 ================= 在构建调度域时,调度器将会å‘现系统是å¦è¡¨çŽ°ä¸ºéžå¯¹ç§°CPU算力。如果是,那么: - sched_asym_cpucapacity陿€é”®ï¼ˆstatic key)将使能。 - SD_ASYM_CPUCAPACITY_FULLæ ‡å¿—ä½å°†åœ¨å°½é‡æœ€ä½Žè°ƒåº¦åŸŸå±‚级ä¸è¢«è®¾ç½®ï¼ŒåŒæ—¶è¦æ»¡è¶³æ¡ä»¶ï¼šè°ƒåº¦åŸŸæ°å¥½ å®Œæ•´åŒ…å«æŸä¸ªCPU算力值的全部CPU。 - SD_ASYM_CPUCAPACITYæ ‡å¿—å°†åœ¨æ‰€æœ‰åŒ…å«éžå¯¹ç§°CPU的调度域ä¸è¢«è®¾ç½®ã€‚ sched_asym_cpucapacity陿€é”®çš„设计æ„å›¾æ˜¯ï¼Œä¿æŠ¤ä¸ºéžå¯¹ç§°CPU算力系统所准备的代ç 。ä¸è¿‡è¦æ³¨æ„çš„ 是,这个键是系统范围å¯è§çš„。想象下é¢ä½¿ç”¨äº†cpusetçš„æ¥éª¤:: capacity C/2 C ________ ________ / \ / \ CPUs 0 1 2 3 4 5 6 7 \__/ \______________/ cpusets cs0 cs1 å¯ä»¥é€šè¿‡ä¸‹é¢çš„æ–¹å¼åˆ›å»ºï¼š .. code-block:: sh mkdir /sys/fs/cgroup/cpuset/cs0 echo 0-1 > /sys/fs/cgroup/cpuset/cs0/cpuset.cpus echo 0 > /sys/fs/cgroup/cpuset/cs0/cpuset.mems mkdir /sys/fs/cgroup/cpuset/cs1 echo 2-7 > /sys/fs/cgroup/cpuset/cs1/cpuset.cpus echo 0 > /sys/fs/cgroup/cpuset/cs1/cpuset.mems echo 0 > /sys/fs/cgroup/cpuset/cpuset.sched_load_balance 由于“这是â€éžå¯¹ç§°CPU算力系统,sched_asym_cpucapacity陿€é”®å°†ä½¿èƒ½ã€‚然而,CPU 0--1对应的 调度域层级,算力值仅有一个,该层级ä¸SD_ASYM_CPUCAPACITY未被设置,它æè¿°çš„æ˜¯ä¸€ä¸ªSMP区域,也 应该被以æ¤å¤„ç†ã€‚ å› æ¤ï¼Œâ€œå…¸åž‹çš„â€ä¿æŠ¤éžå¯¹ç§°CPU算力代ç è·¯å¾„çš„ä»£ç æ¨¡å¼æ˜¯ï¼š - 检查sched_asym_cpucapacity陿€é”® - å¦‚æžœå®ƒè¢«ä½¿èƒ½ï¼ŒæŽ¥ç€æ£€æŸ¥è°ƒåº¦åŸŸå±‚级ä¸SD_ASYM_CPUCAPACITYæ ‡å¿—ä½æ˜¯å¦å‡ºçް 5. 算力感知调度的实现 ===================== 5.1 CFS ------- 5.1.1 算力适应性(fitness) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ CFS最主è¦çš„算力调度准则是:: task_util(p) < capacity(task_cpu(p)) 它通常被称为算力适应性准则。也就是说,CFSå¿…é¡»ä¿è¯ä»»åŠ¡â€œé€‚åˆâ€åœ¨æŸä¸ªCPU上è¿è¡Œã€‚如果准则被è¿å, ä»»åŠ¡å°†è¦æ›´é•¿åœ°æ¶ˆè€—该CPU,任务是CPUå—é™çš„(CPU-bound)。 æ¤å¤–,uclampå…许用户空间指定任务的最å°å’Œæœ€å¤§åˆ©ç”¨çŽ‡ï¼Œè¦ä¹ˆä»¥sched_setattr()的方å¼ï¼Œè¦ä¹ˆä»¥ cgroup接å£çš„æ–¹å¼ï¼ˆå‚阅Documentation/admin-guide/cgroup-v2.rst)。如其åå—æ‰€æš—示,uclamp å¯ä»¥è¢«ç”¨åœ¨å‰ä¸€æ¡å‡†åˆ™ä¸é™åˆ¶task_util()。 5.1.2 被唤醒任务的CPU选择 ~~~~~~~~~~~~~~~~~~~~~~~~~ CFS任务唤醒的CPU选择,éµå¾ªä¸Šé¢æè¿°çš„算力适应性准则。在æ¤ä¹‹ä¸Šï¼Œuclamp被用æ¥é™åˆ¶ä»»åŠ¡åˆ©ç”¨çŽ‡ï¼Œ 这令用户空间对CFS任务的CPU选择有更多的控制。也就是说,CFS被唤醒任务的CPU选择,æœç´¢æ»¡è¶³ä»¥ä¸‹ æ¡ä»¶çš„CPU:: clamp(task_util(p), task_uclamp_min(p), task_uclamp_max(p)) < capacity(cpu) 通过使用uclamp,举例æ¥è¯´ï¼Œç”¨æˆ·ç©ºé—´å¯ä»¥å…许忙ç‰å¾…循环(100%使用率)在任æ„CPU上è¿è¡Œï¼Œåªè¦ç»™ 它设置低的uclamp.max值。相å,uclamp能强制一个å°çš„周期性任务(比如,10%利用率)在最高性能 çš„CPU上è¿è¡Œï¼Œåªè¦ç»™å®ƒè®¾ç½®é«˜çš„uclamp.min值。 .. note:: CFS的被唤醒的任务的CPU选择,å¯è¢«èƒ½è€—感知调度(Energy Aware Scheduling,EAS)覆盖,在 Documentation/scheduler/sched-energy.rstä¸æè¿°ã€‚ 5.1.3 è´Ÿè½½å‡è¡¡ ~~~~~~~~~~~~~~ 被唤醒任务的CPUé€‰æ‹©çš„ä¸€ä¸ªç—…ç†æ€§çš„ä¾‹åæ˜¯ï¼Œä»»åŠ¡å‡ ä¹Žä¸ç¡çœ ï¼Œé‚£ä¹ˆä¹Ÿå‡ ä¹Žä¸å‘生唤醒。考虑:: w == wakeup event capacity(CPU0) = C capacity(CPU1) = C / 3 workload on CPU0 CPU work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time w w w workload on CPU1 CPU work ^ | ____________________________________________ | | +----+----+----+----+----+----+----+----+----+----+-> w 该工作负载应该在CPU0上è¿è¡Œï¼Œä¸è¿‡å¦‚果任务满足以下æ¡ä»¶ä¹‹ä¸€ï¼š - 一开始å‘生ä¸åˆé€‚的调度(ä¸å‡†ç¡®çš„åˆå§‹åˆ©ç”¨çŽ‡ä¼°è®¡ï¼‰ - 一开始调度æ£ç¡®ï¼Œä½†çªç„¶éœ€è¦æ›´å¤šçš„处ç†å™¨åŠŸçŽ‡ 则任务å¯èƒ½å˜ä¸ºCPUå—é™çš„,也就是说 ``task_util(p) > capacity(task_cpu(p))`` ï¼›CPU算力 调度准则被è¿å,将ä¸ä¼šæœ‰ä»»ä½•唤醒事件æ¥ä¿®å¤è¿™ä¸ªé”™è¯¯çš„CPU选择。 è¿™ç§åœºæ™¯ä¸‹çš„任务被称为“ä¸åˆé€‚çš„â€ï¼ˆmisfit)任务,处ç†è¿™ä¸ªåœºæ™¯çš„æœºåˆ¶åŒæ ·ä¹Ÿä»¥æ¤å‘½å。Misfit 任务è¿ç§»å€ŸåŠ©CFSè´Ÿè½½å‡è¡¡å™¨ï¼Œæ›´æ˜Žç¡®çš„说,是主动负载å‡è¡¡çš„部分(用æ¥è¿ç§»æ£åœ¨è¿è¡Œçš„任务)。 当å‘生负载å‡è¡¡æ—¶ï¼Œå¦‚果一个misfit任务å¯ä»¥è¢«è¿ç§»åˆ°ä¸€ä¸ªç›¸è¾ƒå½“å‰è¿è¡Œçš„CPU具有更高算力的CPU上, 那么misfit任务的主动负载å‡è¡¡å°†è¢«è§¦å‘。 5.2 实时调度 ------------ 5.2.1 被唤醒任务的CPU选择 ~~~~~~~~~~~~~~~~~~~~~~~~~ 实时任务唤醒时的CPU选择,æœç´¢æ»¡è¶³ä»¥ä¸‹æ¡ä»¶çš„CPU:: task_uclamp_min(p) <= capacity(task_cpu(cpu)) åŒæ—¶ä»ç„¶å…许接ç€ä½¿ç”¨å¸¸è§„的优先级é™åˆ¶ã€‚如果没有CPUèƒ½æ»¡è¶³è¿™ä¸ªç®—åŠ›å‡†åˆ™ï¼Œé‚£ä¹ˆå°†ä½¿ç”¨åŸºäºŽä¸¥æ ¼ 优先级的调度,CPU算力将被忽略。 5.3 æœ€åŽæœŸé™è°ƒåº¦ ---------------- 5.3.1 被唤醒任务的CPU选择 ~~~~~~~~~~~~~~~~~~~~~~~~~ æœ€åŽæœŸé™ä»»åŠ¡å”¤é†’æ—¶çš„CPU选择,æœç´¢æ»¡è¶³ä»¥ä¸‹æ¡ä»¶çš„CPU:: task_bandwidth(p) < capacity(task_cpu(p)) åŒæ—¶ä»ç„¶å…许接ç€ä½¿ç”¨å¸¸è§„çš„å¸¦å®½å’Œæˆªæ¢æœŸé™é™åˆ¶ã€‚如果没有CPU能满足这个算力准则,那么任务ä¾ç„¶ 在当å‰CPU队列ä¸ã€‚