.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/scheduler/sched-arch.rst :翻译: å¸å»¶è…¾ Yanteng Si <siyanteng@loongson.cn> :æ ¡è¯‘: =============================== 架构特定代ç çš„CPU调度器实现æç¤º =============================== Nick Piggin, 2005 ä¸Šä¸‹æ–‡åˆ‡æ¢ ========== 1. è¿è¡Œé˜Ÿåˆ—é” é»˜è®¤æƒ…å†µä¸‹ï¼Œswitch_to arch函数在调用时é”定了è¿è¡Œé˜Ÿåˆ—ã€‚è¿™é€šå¸¸ä¸æ˜¯ä¸€ä¸ªé—®é¢˜ï¼Œé™¤éž switch_toå¯èƒ½éœ€è¦èŽ·å–è¿è¡Œé˜Ÿåˆ—é”。这通常是由于上下文切æ¢ä¸çš„唤醒æ“ä½œé€ æˆçš„。 ä¸ºäº†è¦æ±‚调度器在è¿è¡Œé˜Ÿåˆ—è§£é”的情况下调用switch_toï¼Œä½ å¿…é¡»åœ¨å¤´æ–‡ä»¶ ä¸`#define __ARCH_WANT_UNLOCKED_CTXSW`(通常是定义switch_to的那个文件)。 在CONFIG_SMP的情况下,解é”的上下文切æ¢å¯¹æ ¸å¿ƒè°ƒåº¦å™¨çš„实现åªå¸¦æ¥äº†éžå¸¸å°çš„æ€§èƒ½æŸ 失。 CPU空转 ======= ä½ çš„cpu_idle程åºéœ€è¦éµå®ˆä»¥ä¸‹è§„则: 1. 现在抢å 应该在空闲的例程上ç¦ç”¨ã€‚应该åªåœ¨è°ƒç”¨schedule()æ—¶å¯ç”¨ï¼Œç„¶åŽå†ç¦ç”¨ã€‚ 2. need_resched/TIF_NEED_RESCHED åªä¼šè¢«è®¾ç½®ï¼Œå¹¶ä¸”在è¿è¡Œä»»åŠ¡è°ƒç”¨ schedule() 之剿°¸è¿œä¸ä¼šè¢«æ¸…除。空闲线程åªéœ€è¦æŸ¥è¯¢need_resched,并且永远ä¸ä¼šè®¾ç½®æˆ–清除它。 3. 当cpu_idleå‘现(need_resched() == 'true'),它应该调用schedule()。å¦åˆ™ 它ä¸åº”该调用schedule()。 4. 在检查need_resched时,唯一需è¦ç¦ç”¨ä¸æ–的情况是,我们è¦è®©å¤„ç†å™¨ä¼‘çœ åˆ°ä¸‹ä¸€ä¸ªä¸ æ–(这并ä¸å¯¹need_reschedæä¾›ä»»ä½•ä¿æŠ¤ï¼Œå®ƒå¯ä»¥é˜²æ¢ä¸¢å¤±ä¸€ä¸ªä¸æ–): 4a. è¿™ç§ç¡çœ 类型的常è§é—®é¢˜ä¼¼ä¹Žæ˜¯:: local_irq_disable(); if (!need_resched()) { local_irq_enable(); *** resched interrupt arrives here *** __asm__("sleep until next interrupt"); } 5. 当need_reschedå˜ä¸ºé«˜ç”µå¹³æ—¶ï¼ŒTIF_POLLING_NRFLAGå¯ä»¥ç”±ä¸éœ€è¦ä¸æ–æ¥å”¤é†’它们 的空闲程åºè®¾ç½®ã€‚æ¢å¥è¯è¯´ï¼Œå®ƒä»¬å¿…须定期轮询need_resched,尽管åšä¸€äº›åŽå°å·¥ä½œæˆ– 进入低CPU优先级å¯èƒ½æ˜¯åˆç†çš„。 - 5a. 如果TIF_POLLING_NRFLAGè¢«è®¾ç½®ï¼Œè€Œæˆ‘ä»¬ç¡®å®žå†³å®šè¿›å…¥ä¸€ä¸ªä¸æ–ç¡çœ ,那 ä¹ˆéœ€è¦æ¸…除它,然åŽå‘出一个内å˜å±éšœï¼ˆæŽ¥ç€æµ‹è¯•need_resched,ç¦ç”¨ä¸æ–,如3ä¸è§£é‡Šï¼‰ã€‚ arch/x86/kernel/process.c有轮询和ç¡çœ 空闲函数的例å。 å¯èƒ½å‡ºçŽ°çš„arch/问题 =================== 我å‘现的å¯èƒ½çš„arch问题(并试图解决或没有解决)。: sparc - 在这一点上,IRQ是开ç€çš„(?),把local_irq_save改为_disable。 - 待办事项: 需è¦ç¬¬äºŒä¸ªCPUæ¥ç¦ç”¨æŠ¢å (å‚考 #1)