Linux内存管理机制简单分析(2)

Linux Buddy System是为了解决以Page为单位的内存分配导致外内存碎片问题:即系统缺少连续的Page页导致需要连续Page页的内存申请无法得到满足。原理很简单,将不同个数的连续Pages组合成Block进行分配,Block按2的幂次方个Pages划分为11个Block链表,分别对应1,2,4,8,16,32,64,128,256,512和1024个连续的Pages。调用Buddy System进行内存分配时,根据申请的大小找最合适的Block。
 如下所示为各个Zone上的Buddy System基本信息,后面11列为11个Block链表里可用的Block个数。

[root@localhost ~]# cat /proc/buddyinfo
Node 0, zone      DMA      0      0      1      0      1      1      1      0      0      1      3
Node 0, zone    DMA32    102    79    179    229    230    166    251    168    107    78    169
Node 0, zone  Normal  1328    900  1985  1920  2261  1388    798    972    539    324  2578
Node 1, zone  Normal    466  1476  2133  7715  6026  4737  2883  1532    778    490  2760

Slab

Buddy System的内存都是大块申请,但是大多数应用需要的内存都很小,比如常见的几百个Bytes的数据结构,如果也申请一个Page,将会非常浪费。为了满足小而不规则的内存分配需求,Linux设计了Slab分配器。原理简单说就是为特定的数据结构建立memcache,从Buddy System里申请Pages,将每个Page按数据结构的大小划分为多个Objects,使用者从memcache里申请数据结构时分配一个Object。
 如下所示为Linux查看slab信息的方法:

[root@localhost ~]# cat /proc/slabinfo
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
fat_inode_cache      90    90    720  45    8 : tunables    0    0    0 : slabdata      2      2      0
fat_cache              0      0    40  102    1 : tunables    0    0    0 : slabdata      0      0      0
kvm_vcpu              0      0  16576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kvm_mmu_page_header      0      0    168  48    2 : tunables    0    0    0 : slabdata      0      0      0
ext4_groupinfo_4k  4440  4440    136  30    1 : tunables    0    0    0 : slabdata    148    148      0
ext4_inode_cache  63816  65100  1032  31    8 : tunables    0    0    0 : slabdata  2100  2100      0
ext4_xattr          1012  1012    88  46    1 : tunables    0    0    0 : slabdata    22    22      0
ext4_free_data    16896  17600    64  64    1 : tunables    0    0    0 : slabdata    275    275      0

通常我们都是通过slabtop命令查看排序后的slab信息:

OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                 
352014 352014 100%    0.10K  9026  39    36104K buffer_head
 93492  93435  99%    0.19K  2226  42    17808K dentry
 65100  63816  98%    1.01K  2100  31    67200K ext4_inode_cache
 48128  47638  98%    0.06K    752  64  3008K kmalloc-64
 47090  43684  92%    0.05K    554  85  2216K shared_policy_node
 44892  44892 100%    0.11K  1247  36  4988K sysfs_dir_cache
 43624  43177  98%    0.07K    779  56  3116K Acpi-ParseExt
 43146  42842  99%    0.04K    423  102  1692K ext4_extent_status

kmalloc

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12730.html