?Esphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/scheduler/sched-archmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/zh_TW/scheduler/sched-archmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/it_IT/scheduler/sched-archmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ja_JP/scheduler/sched-archmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ko_KR/scheduler/sched-archmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/sp_SP/scheduler/sched-archmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhU/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/scheduler/sched-arch.rsthKubh field_body)}(h'Documentation/scheduler/sched-arch.rst h]h)}(h&Documentation/scheduler/sched-arch.rsth]h&Documentation/scheduler/sched-arch.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hjhhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hhhKubh)}(hhh]h}(h]h ]h"]h$]h&]uh1hhj>ubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h-架构特定代码的CPU调度器实现提示h]h-架构特定代码的CPU调度器实现提示}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjfhhhhhKubh block_quote)}(hNick Piggin, 2005 h]h)}(hNick Piggin, 2005h]hNick Piggin, 2005}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj{ubah}(h]h ]h"]h$]h&]uh1jyhhhKhjfhhubje)}(hhh](jj)}(h上下文切换h]h上下文切换}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjhhhhhKubh)}(h1. 运行队列锁 默认情况下,switch_to arch函数在调用时锁定了运行队列。这通常不是一个问题,除非 switch_to可能需要获取运行队列锁。这通常是由于上下文切换中的唤醒操作造成的。h]h1. 运行队列锁 默认情况下,switch_to arch函数在调用时锁定了运行队列。这通常不是一个问题,除非 switch_to可能需要获取运行队列锁。这通常是由于上下文切换中的唤醒操作造成的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h为了要求调度器在运行队列解锁的情况下调用switch_to,你必须在头文件 中`#define __ARCH_WANT_UNLOCKED_CTXSW`(通常是定义switch_to的那个文件)。h]h为了要求调度器在运行队列解锁的情况下调用switch_to,你必须在头文件 中`#define __ARCH_WANT_UNLOCKED_CTXSW`(通常是定义switch_to的那个文件)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hw在CONFIG_SMP的情况下,解锁的上下文切换对核心调度器的实现只带来了非常小的性能损 失。h]hw在CONFIG_SMP的情况下,解锁的上下文切换对核心调度器的实现只带来了非常小的性能损 失。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id1ah ]h"]上下文切换ah$]h&]uh1jdhjfhhhhhKubje)}(hhh](jj)}(h CPU空转h]h CPU空转}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jihjhhhhhK ubh)}(h/你的cpu_idle程序需要遵守以下规则:h]h/你的cpu_idle程序需要遵守以下规则:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjhhubhenumerated_list)}(hhh](h list_item)}(hk现在抢占应该在空闲的例程上禁用。应该只在调用schedule()时启用,然后再禁用。 h]h)}(hj现在抢占应该在空闲的例程上禁用。应该只在调用schedule()时启用,然后再禁用。h]hj现在抢占应该在空闲的例程上禁用。应该只在调用schedule()时启用,然后再禁用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hneed_resched/TIF_NEED_RESCHED 只会被设置,并且在运行任务调用 schedule() 之前永远不会被清除。空闲线程只需要查询need_resched,并且永远不会设置或清除它。 h]h)}(hneed_resched/TIF_NEED_RESCHED 只会被设置,并且在运行任务调用 schedule() 之前永远不会被清除。空闲线程只需要查询need_resched,并且永远不会设置或清除它。h]hneed_resched/TIF_NEED_RESCHED 只会被设置,并且在运行任务调用 schedule() 之前永远不会被清除。空闲线程只需要查询need_resched,并且永远不会设置或清除它。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hu当cpu_idle发现(need_resched() == 'true'),它应该调用schedule()。否则 它不应该调用schedule()。 h]h)}(ht当cpu_idle发现(need_resched() == 'true'),它应该调用schedule()。否则 它不应该调用schedule()。h]hx当cpu_idle发现(need_resched() == ‘true’),它应该调用schedule()。否则 它不应该调用schedule()。}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hj,ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hX在检查need_resched时,唯一需要禁用中断的情况是,我们要让处理器休眠到下一个中 断(这并不对need_resched提供任何保护,它可以防止丢失一个中断): 4a. 这种睡眠类型的常见问题似乎是:: local_irq_disable(); if (!need_resched()) { local_irq_enable(); *** resched interrupt arrives here *** __asm__("sleep until next interrupt"); } h](h)}(h在检查need_resched时,唯一需要禁用中断的情况是,我们要让处理器休眠到下一个中 断(这并不对need_resched提供任何保护,它可以防止丢失一个中断):h]h在检查need_resched时,唯一需要禁用中断的情况是,我们要让处理器休眠到下一个中 断(这并不对need_resched提供任何保护,它可以防止丢失一个中断):}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjDubjz)}(hX 4a. 这种睡眠类型的常见问题似乎是:: local_irq_disable(); if (!need_resched()) { local_irq_enable(); *** resched interrupt arrives here *** __asm__("sleep until next interrupt"); } h](h)}(h04a. 这种睡眠类型的常见问题似乎是::h]h/4a. 这种睡眠类型的常见问题似乎是:}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjVubh literal_block)}(hlocal_irq_disable(); if (!need_resched()) { local_irq_enable(); *** resched interrupt arrives here *** __asm__("sleep until next interrupt"); }h]hlocal_irq_disable(); if (!need_resched()) { local_irq_enable(); *** resched interrupt arrives here *** __asm__("sleep until next interrupt"); }}hjjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhhK0hjVubeh}(h]h ]h"]h$]h&]uh1jyhhhK.hjDubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hX当need_resched变为高电平时,TIF_POLLING_NRFLAG可以由不需要中断来唤醒它们 的空闲程序设置。换句话说,它们必须定期轮询need_resched,尽管做一些后台工作或 进入低CPU优先级可能是合理的。 - 5a. 如果TIF_POLLING_NRFLAG被设置,而我们确实决定进入一个中断睡眠,那 么需要清除它,然后发出一个内存屏障(接着测试need_resched,禁用中断,如3中解释)。 h](h)}(h当need_resched变为高电平时,TIF_POLLING_NRFLAG可以由不需要中断来唤醒它们 的空闲程序设置。换句话说,它们必须定期轮询need_resched,尽管做一些后台工作或 进入低CPU优先级可能是合理的。h]h当need_resched变为高电平时,TIF_POLLING_NRFLAG可以由不需要中断来唤醒它们 的空闲程序设置。换句话说,它们必须定期轮询need_resched,尽管做一些后台工作或 进入低CPU优先级可能是合理的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubjz)}(h- 5a. 如果TIF_POLLING_NRFLAG被设置,而我们确实决定进入一个中断睡眠,那 么需要清除它,然后发出一个内存屏障(接着测试need_resched,禁用中断,如3中解释)。 h]h bullet_list)}(hhh]j)}(h5a. 如果TIF_POLLING_NRFLAG被设置,而我们确实决定进入一个中断睡眠,那 么需要清除它,然后发出一个内存屏障(接着测试need_resched,禁用中断,如3中解释)。 h]hdefinition_list)}(hhh]hdefinition_list_item)}(h5a. 如果TIF_POLLING_NRFLAG被设置,而我们确实决定进入一个中断睡眠,那 么需要清除它,然后发出一个内存屏障(接着测试need_resched,禁用中断,如3中解释)。 h](hterm)}(h[5a. 如果TIF_POLLING_NRFLAG被设置,而我们确实决定进入一个中断睡眠,那h]h[5a. 如果TIF_POLLING_NRFLAG被设置,而我们确实决定进入一个中断睡眠,那}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]id2ah ]h"] cpu空转ah$]h&]uh1jdhjfhhhhhK ubje)}(hhh](jj)}(h可能出现的arch/问题h]h可能出现的arch/问题}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jihj hhhhhKBubh)}(hG我发现的可能的arch问题(并试图解决或没有解决)。:h]hG我发现的可能的arch问题(并试图解决或没有解决)。:}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhj hhubj)}(hhh]j)}(hsparc - 在这一点上,IRQ是开着的(?),把local_irq_save改为_disable。 - 待办事项: 需要第二个CPU来禁用抢占 (参考 #1)h](j)}(hWsparc - 在这一点上,IRQ是开着的(?),把local_irq_save改为_disable。h]hWsparc - 在这一点上,IRQ是开着的(?),把local_irq_save改为_disable。}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKFhjBubj)}(hhh]j)}(hhh]j)}(h;待办事项: 需要第二个CPU来禁用抢占 (参考 #1)h]h)}(hj\h]h;待办事项: 需要第二个CPU来禁用抢占 (参考 #1)}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjZubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]jjuh1jhhhKGhjTubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhhhKFhj?ubah}(h]h ]h"]h$]h&]uh1jhj hhhNhNubeh}(h]archah ]h"]可能出现的arch/问题ah$]h&]uh1jdhjfhhhhhKBubeh}(h]cpuah ]h"]-架构特定代码的cpu调度器实现提示ah$]h&]uh1jdhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jiN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjjjjjju nametypes}(jjjjuh}(jjfjjjjjj u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages] transformerN include_log]9Documentation/translations/zh_CN/scheduler/sched-arch.rst(NNNNta decorationNhhub.