~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/mm/zsmalloc.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 :Original: Documentation/mm/zsmalloc.rst
  2 
  3 :翻译:
  4 
  5  司延腾 Yanteng Si <siyanteng@loongson.cn>
  6 
  7 :校译:
  8 
  9 ========
 10 zsmalloc
 11 ========
 12 
 13 这个分配器是为与zram一起使用而设计的。因此,该分配器应该在低内存条件下工作良好。特别是,
 14 它从未尝试过higher order页面的分配,这在内存压力下很可能会失败。另一方面,如果我们只
 15 是使用单(0-order)页,它将遭受非常高的碎片化 - 任何大小为PAGE_SIZE/2或更大的对象将
 16 占据整个页面。这是其前身(xvmalloc)的主要问题之一。
 17 
 18 为了克服这些问题,zsmalloc分配了一堆0-order页面,并使用各种"struct page"字段将它
 19 们链接起来。这些链接的页面作为一个单一的higher order页面,即一个对象可以跨越0-order
 20 页面的边界。代码将这些链接的页面作为一个实体,称为zspage。
 21 
 22 为了简单起见,zsmalloc只能分配大小不超过PAGE_SIZE的对象,因为这满足了所有当前用户的
 23 要求(在最坏的情况下,页面是不可压缩的,因此以"原样"即未压缩的形式存储)。对于大于这
 24 个大小的分配请求,会返回失败(见zs_malloc)。
 25 
 26 此外,zs_malloc()并不返回一个可重复引用的指针。相反,它返回一个不透明的句柄(无符号
 27 长),它编码了被分配对象的实际位置。这种间接性的原因是zsmalloc并不保持zspages的永久
 28 映射,因为这在32位系统上会导致问题,因为内核空间映射的VA区域非常小。因此,在使用分配
 29 的内存之前,对象必须使用zs_map_object()进行映射以获得一个可用的指针,随后使用
 30 zs_unmap_object()解除映射。
 31 
 32 stat
 33 ====
 34 
 35 通过CONFIG_ZSMALLOC_STAT,我们可以通过 ``/sys/kernel/debug/zsmalloc/<user name>``
 36 看到zsmalloc内部信息。下面是一个统计输出的例子。::
 37 
 38  # cat /sys/kernel/debug/zsmalloc/zram0/classes
 39 
 40  class  size almost_full almost_empty obj_allocated   obj_used pages_used pages_per_zspage
 41     ...
 42     ...
 43      9   176           0            1           186        129          8                4
 44     10   192           1            0          2880       2872        135                3
 45     11   208           0            1           819        795         42                2
 46     12   224           0            1           219        159         12                4
 47     ...
 48     ...
 49 
 50 
 51 class
 52         索引
 53 size
 54         zspage存储对象大小
 55 almost_empty
 56         ZS_ALMOST_EMPTY zspage的数量(见下文)。
 57 almost_full
 58         ZS_ALMOST_FULL zspage的数量(见下图)
 59 obj_allocated
 60         已分配对象的数量
 61 obj_used
 62         分配给用户的对象的数量
 63 pages_used
 64         为该类分配的页数
 65 pages_per_zspage
 66         组成一个zspage的0-order页面的数量
 67 
 68 当n <= N / f时,我们将一个zspage分配给ZS_ALMOST_EMPTYfullness组,其中
 69 
 70 * n = 已分配对象的数量
 71 * N = zspage可以存储的对象总数
 72 * f = fullness_threshold_frac(即,目前是4个)
 73 
 74 同样地,我们将zspage分配给:
 75 
 76 * ZS_ALMOST_FULL  when n > N / f
 77 * ZS_EMPTY        when n == 0
 78 * ZS_FULL         when n == N

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php