.. 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å¯èƒ½éœ€è¦èŽ·å–è¿è¡Œé˜Ÿåˆ—é”。这通常是由于上下文切æ¢ä¸çš„唤醒æ“ä½œé€ æˆçš„ã€‚è§ arch/ia64/include/asm/switch_to.h的例å。 为了è¦æ±‚调度器在è¿è¡Œé˜Ÿåˆ—解é”的情况下调用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问题(并试图解决或没有解决)。: ia64 - safe_halt的调用与ä¸æ–相比,是å¦å¾ˆè’谬? (它ç¡çœ 了å—) (å‚考 #4a) sh64 - ç¡çœ 与ä¸æ–相比,是å¦å¾ˆè’谬? (å‚考 #4a) sparc - 在这一点上,IRQ是开ç€çš„(?),把local_irq_save改为_disable。 - 待办事项: 需è¦ç¬¬äºŒä¸ªCPUæ¥ç¦ç”¨æŠ¢å (å‚考 #1)