(;sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget /mm/zsmallocmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/zh_TW/mm/zsmallocmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/it_IT/mm/zsmallocmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ja_JP/mm/zsmallocmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ko_KR/mm/zsmallocmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/sp_SP/mm/zsmallocmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hzsmalloch]hzsmalloc}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhL/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/mm/zsmalloc.rsthK ubh paragraph)}(hX这个分配器是为与zram一起使用而设计的。因此,该分配器应该在低内存条件下工作良好。特别是, 它从未尝试过higher order页面的分配,这在内存压力下很可能会失败。另一方面,如果我们只 是使用单(0-order)页,它将遭受非常高的碎片化 - 任何大小为PAGE_SIZE/2或更大的对象将 占据整个页面。这是其前身(xvmalloc)的主要问题之一。h]hX这个分配器是为与zram一起使用而设计的。因此,该分配器应该在低内存条件下工作良好。特别是, 它从未尝试过higher order页面的分配,这在内存压力下很可能会失败。另一方面,如果我们只 是使用单(0-order)页,它将遭受非常高的碎片化 - 任何大小为PAGE_SIZE/2或更大的对象将 占据整个页面。这是其前身(xvmalloc)的主要问题之一。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hX3为了克服这些问题,zsmalloc分配了一堆0-order页面,并使用各种"struct page"字段将它 们链接起来。这些链接的页面作为一个单一的higher order页面,即一个对象可以跨越0-order 页面的边界。代码将这些链接的页面作为一个实体,称为zspage。h]hX7为了克服这些问题,zsmalloc分配了一堆0-order页面,并使用各种”struct page”字段将它 们链接起来。这些链接的页面作为一个单一的higher order页面,即一个对象可以跨越0-order 页面的边界。代码将这些链接的页面作为一个实体,称为zspage。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX2为了简单起见,zsmalloc只能分配大小不超过PAGE_SIZE的对象,因为这满足了所有当前用户的 要求(在最坏的情况下,页面是不可压缩的,因此以"原样"即未压缩的形式存储)。对于大于这 个大小的分配请求,会返回失败(见zs_malloc)。h]hX6为了简单起见,zsmalloc只能分配大小不超过PAGE_SIZE的对象,因为这满足了所有当前用户的 要求(在最坏的情况下,页面是不可压缩的,因此以”原样”即未压缩的形式存储)。对于大于这 个大小的分配请求,会返回失败(见zs_malloc)。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX此外,zs_malloc()并不返回一个可重复引用的指针。相反,它返回一个不透明的句柄(无符号 长),它编码了被分配对象的实际位置。这种间接性的原因是zsmalloc并不保持zspages的永久 映射,因为这在32位系统上会导致问题,因为内核空间映射的VA区域非常小。因此,在使用分配 的内存之前,对象必须使用zs_map_object()进行映射以获得一个可用的指针,随后使用 zs_unmap_object()解除映射。h]hX此外,zs_malloc()并不返回一个可重复引用的指针。相反,它返回一个不透明的句柄(无符号 长),它编码了被分配对象的实际位置。这种间接性的原因是zsmalloc并不保持zspages的永久 映射,因为这在32位系统上会导致问题,因为内核空间映射的VA区域非常小。因此,在使用分配 的内存之前,对象必须使用zs_map_object()进行映射以获得一个可用的指针,随后使用 zs_unmap_object()解除映射。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hstath]hstat}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK!ubh)}(h通过CONFIG_ZSMALLOC_STAT,我们可以通过 ``/sys/kernel/debug/zsmalloc/`` 看到zsmalloc内部信息。下面是一个统计输出的例子。::h](h0通过CONFIG_ZSMALLOC_STAT,我们可以通过 }(hjhhhNhNubhliteral)}(h*``/sys/kernel/debug/zsmalloc/``h]h&/sys/kernel/debug/zsmalloc/}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhF 看到zsmalloc内部信息。下面是一个统计输出的例子。:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK#hhhhubh literal_block)}(hX # cat /sys/kernel/debug/zsmalloc/zram0/classes class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage ... ... 9 176 0 1 186 129 8 4 10 192 1 0 2880 2872 135 3 11 208 0 1 819 795 42 2 12 224 0 1 219 159 12 4 ... ...h]hX # cat /sys/kernel/debug/zsmalloc/zram0/classes class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage ... ... 9 176 0 1 186 129 8 4 10 192 1 0 2880 2872 135 3 11 208 0 1 819 795 42 2 12 224 0 1 219 159 12 4 ... ...}hj&sbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1j$hhhK&hhhhubhdefinition_list)}(hhh](hdefinition_list_item)}(h class 索引h](hterm)}(hclassh]hclass}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jAhhhK3hj=ubh definition)}(hhh]h)}(h索引h]h索引}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjSubah}(h]h ]h"]h$]h&]uh1jQhj=ubeh}(h]h ]h"]h$]h&]uh1j;hhhK3hj8ubj<)}(hsize zspage存储对象大小h](jB)}(hsizeh]hsize}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jAhhhK5hjpubjR)}(hhh]h)}(hzspage存储对象大小h]hzspage存储对象大小}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjubah}(h]h ]h"]h$]h&]uh1jQhjpubeh}(h]h ]h"]h$]h&]uh1j;hhhK5hj8hhubj<)}(h>almost_empty ZS_ALMOST_EMPTY zspage的数量(见下文)。h](jB)}(h almost_emptyh]h almost_empty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jAhhhK7hjubjR)}(hhh]h)}(h1ZS_ALMOST_EMPTY zspage的数量(见下文)。h]h1ZS_ALMOST_EMPTY zspage的数量(见下文)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j;hhhK7hj8hhubj<)}(h5almost_full ZS_ALMOST_FULL zspage的数量(见下图)h](jB)}(h almost_fullh]h almost_full}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jAhhhK9hjubjR)}(hhh]h)}(h)ZS_ALMOST_FULL zspage的数量(见下图)h]h)ZS_ALMOST_FULL zspage的数量(见下图)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j;hhhK9hj8hhubj<)}(h&obj_allocated 已分配对象的数量h](jB)}(h obj_allocatedh]h obj_allocated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jAhhhK;hjubjR)}(hhh]h)}(h已分配对象的数量h]h已分配对象的数量}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj>ubah}(h]h ]h"]h$]h&]uh1jQhj,ubeh}(h]h ]h"]h$]h&]uh1j;hhhK=hj8hhubj<)}(h#pages_used 为该类分配的页数h](jB)}(h pages_usedh]h pages_used}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jAhhhK?hj[ubjR)}(hhh]h)}(h为该类分配的页数h]h为该类分配的页数}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjmubah}(h]h ]h"]h$]h&]uh1jQhj[ubeh}(h]h ]h"]h$]h&]uh1j;hhhK?hj8hhubj<)}(h=pages_per_zspage 组成一个zspage的0-order页面的数量 h](jB)}(hpages_per_zspageh]hpages_per_zspage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jAhhhKBhjubjR)}(hhh]h)}(h+组成一个zspage的0-order页面的数量h]h+组成一个zspage的0-order页面的数量}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j;hhhKBhj8hhubeh}(h]h ]h"]h$]h&]uh1j6hhhhhhhNubh)}(hT当n <= N / f时,我们将一个zspage分配给ZS_ALMOST_EMPTYfullness组,其中h]hT当n <= N / f时,我们将一个zspage分配给ZS_ALMOST_EMPTYfullness组,其中}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhhhhubh bullet_list)}(hhh](h list_item)}(hn = 已分配对象的数量h]h)}(hjh]hn = 已分配对象的数量}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h%N = zspage可以存储的对象总数h]h)}(hjh]h%N = zspage可以存储的对象总数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h1f = fullness_threshold_frac(即,目前是4个) h]h)}(h0f = fullness_threshold_frac(即,目前是4个)h]h0f = fullness_threshold_frac(即,目前是4个)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKFhhhhubh)}(h%同样地,我们将zspage分配给:h]h%同样地,我们将zspage分配给:}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhhhhubj)}(hhh](j)}(hZS_ALMOST_FULL when n > N / fh]h)}(hj5h]hZS_ALMOST_FULL when n > N / f}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhj3ubah}(h]h ]h"]h$]h&]uh1jhj0hhhhhNubj)}(hZS_EMPTY when n == 0h]h)}(hjLh]hZS_EMPTY when n == 0}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjJubah}(h]h ]h"]h$]h&]uh1jhj0hhhhhNubj)}(hZS_FULL when n == Nh]h)}(hjch]hZS_FULL when n == N}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjaubah}(h]h ]h"]h$]h&]uh1jhj0hhhhhNubeh}(h]h ]h"]h$]h&]j j!uh1jhhhKLhhhhubeh}(h]statah ]h"]statah$]h&]uh1hhhhhhhhK!ubeh}(h]zsmallocah ]h"]zsmallocah$]h&]uh1hhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN 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}(jjjju nametypes}(jjuh}(jhjhu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.