linux中/proc/buddyinfo的作用

本文介绍了Linux内核中如何通过buddy算法进行内存管理以减少内存碎片的产生。文章详细解释了buddy算法的基本原理,以及如何根据PAGE_SIZE进行内存分配。同时,文章提供了查看系统内存资源的/proc/buddyinfo文件的具体内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在应用程序设计过程中,内存是很重要的资源,而计算机主机的内存资源时有限的。一般而言我们可以申请到的内存是有限的,并不是想申请多大就有多大就可以申请多大的。/proc/buddyinfo文件里,就记录着系统的内存资源。

linux内核中使用了buddy算法来管理内存以减少内存碎片的产生,buddy算法管理最小的单一为PAGE_SIZE,一般情况下大小为4K。以2的N次幂一次增加。如下图表示,在normal区中,还有8921个2^0 * PAGE_SIZE可以分配。可以看出如果代码中一次性要申请2^9 * 4K内存,就会分配失败。在g++低版本的编译器会申请结果会返回NULL,高版本会抛出异常。所以当服务需要分配大内存的时候,需要特别注意一次能分配的最大连续内存的大小为2^10 * PAGE_SIZE,其中PAGE_SIZE可以使用getconf PAGESIZE。用C语言可以用 int getpagesize(void)函数获取,需要包含头文件#include

eg:
wuzm@ubuntu:~/GoCode$ cat /proc/buddyinfo 
Node 0, zone      DMA      0      0      0      0      2      1      1      0      1      1      3 
Node 0, zone    DMA32    727   1296   1964   1055   1029    413    293    148     29     17     40 
Node 0, zone   Normal   8921   3539   1236    962    489    132     86     14      1      0      0 
wuzm@ubuntu:~/GoCode$ getconf PAGESIZE
4096
### 回答1: `/proc/zoneinfo`是一个针对Linux内存管理的虚拟文件系统,它提供了对系统内存分配、使用和释放的详细信息。该目录下的文件或目录含义如下: - `numa_info`:此文件提供有关NUMA(非一致性内存访问)的信息,如节点数量、最大节点ID等。 - `buddyinfo`:此文件提供关于伙伴系统的信息,伙伴系统是一种用于分配内存的算法。它显示了每个优先级可用的空闲页面数量,以及它们的物理地址。 - `vmstat`:此文件提供了有关内存使用情况的信息,如内存总量、空闲内存、缓存、交换、页错误等。 - `zoneinfo`:此目录包含了每个内存区域的详细信息,每个内存区域都包含了一个或多个页面。 - `/proc/zoneinfo/lowmem_reserve_ratio`:此文件包含了用于低内存保留的比率。 - `/proc/zoneinfo/watermark_scale_factor`:此文件包含了用于内存水印标记的比率。 - `/proc/zoneinfo/min_unmapped_ratio`:此文件包含了用于未映射页面的最小比率。 - `/proc/zoneinfo/lowmem_reserve_pfn`:此文件包含了用于低内存保留的页面帧编号。 - `/proc/zoneinfo/zone_name`:此文件包含了内存区域的名称。 - `/proc/zoneinfo/pages_scanned`:此文件包含了用于扫描内存页面的数量。 - `/proc/zoneinfo/active_anon`:此文件包含了活动匿名页面的数量。 - `/proc/zoneinfo/inactive_anon`:此文件包含了非活动匿名页面的数量。 - `/proc/zoneinfo/active_file`:此文件包含了活动文件页面的数量。 - `/proc/zoneinfo/inactive_file`:此文件包含了非活动文件页面的数量。 - `/proc/zoneinfo/unevictable`:此文件包含了不能被清除的页面数量。 - `/proc/zoneinfo/mapped`:此文件包含了被映射的页面数量。 - `/proc/zoneinfo/present_pages`:此文件包含了内存区域中的页面数量。 - `/proc/zoneinfo/managed_pages`:此文件包含了管理的页面数量。 - `/proc/zoneinfo/lowmem_reserve`:此文件包含了低内存保留的页面数量。 - `/proc/zoneinfo/pagesets`:此目录包含了有关页面集的信息,如活动页面、非活动页面、LRU链等。 ### 回答2: `/proc/zoneinfo`是一个特殊的文件或目录,它提供了有关系统内存分配及其使用情况的重要信息。在Linux系统中,内存被细分为不同的区域(zones),每个区域对应于不同的内存用途。 在`/proc/zoneinfo`目录下,有若干个以数字命名的文件或子目录,每个文件或目录代表着一个特定的内存区域(zone)。下面是一些关键内容的解释: - ``DMA``:表示Direct Memory Access(直接内存访问)区域,这是用于处理低端硬件设备的内存区域。 - ``DMA32``:也是表示用于Direct Memory Access的内存区域,但它适用于32位系统,可以提供更多的物理内存地址。 - ``Normal``:这是一个常规的内存区域,用于大多数应用程序和进程的内存需求。 - ``HighMem``:该区域包含高端内存(High Memory),它是一种在物理内存较少时用于处理额外内存需求的技术。 - ``movable``:这是一个可移动内存区域,用于存储由内核自动管理的可移动页面(Page)。 - ``reclaimable``:这个目录包含可以被重新分配或释放的内存页面,可降低系统内存负载。 - ``Unreclaimable``:该目录包含无法被重新分配或释放的内存页面,这些页面可能是内核数据结构或设备驱动程序使用的。 除了上述关键词下的目录和文件,还存在其他名称的目录和文件,每个具体的目录和文件都提供了相应内存区域的更详细的统计信息,包括分配的页数、空闲的页数、用于页缓存的页数等等。 通过分析`/proc/zoneinfo`目录下的文件或目录,系统管理员能够深入了解系统的内存使用情况和性能瓶颈,从而有效地进行内存管理和优化。 ### 回答3: 在Linux系统中,``/proc/zoneinfo``是一个目录,它记录了系统内存分配的有关信息。下面是该目录中一些重要文件的含义: ``/proc/zoneinfo/unnamed``:这个文件记录了内核使用的非NUMA(Non-Uniform Memory Access)区的相关信息。在非NUMA系统中,系统中所有的内存都是对等的,不会因为物理位置的不同而导致数据访问延迟的不同。 ``/proc/zoneinfo/zone``:这个文件记录了系统中每个NUMA节点的相关信息。NUMA是一种非均匀内存访问模型,在这种系统中,内存被划分成多个节点,每个节点被连接到一个或多个处理器上。这个文件提供了每个节点的名称、标志、内存大小、内存分配器的相关信息以及每个节点所包含的内存页的详细信息。 ``/proc/zoneinfo/pgdat``:这个文件记录了全局数据的相关信息。在NUMA系统中,每个节点都有一个pg_data数据结构,这个文件提供了全局数据的总结,包括系统中所有NUMA节点的数量、内存总大小、每个节点的起始pfn(Page Frame Number)值等。 ``/proc/zoneinfo/numa``:这个文件记录了每个NUMA节点之间的关系,以及内存访问分布情况。对于NUMA系统,内存访问的延迟和带宽取决于所使用的节点,这个文件提供了详细的内存访问分布统计数据,有助于优化程序的性能。 总之,``/proc/zoneinfo``目录下的文件记录了系统内存分配的相关信息,包括对等内存区的信息和NUMA节点相关信息。这些信息对于系统管理员、开发人员和性能优化工作者来说是非常重要的,可以帮助他们深入了解系统内存的分布情况,优化系统的性能和资源利用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值