Linux内存管理的伙伴系统是一种用于解决外部碎片问题的内存分配方案。它基于二进制伙伴算法,通过将内存分成大小为2的幂次方的块来管理和分配物理内存页面。伙伴系统的基本思想是将内存块分成一对一对的伙伴,其中一个伙伴被分配给应用程序使用,另一个伙伴保持空闲状态。当一个内存块被释放时,系统会检查其伙伴是否也处于空闲状态,如果是,则将两个伙伴合并为一个更大的内存块。
伙伴系统的数据结构主要包括以下几个部分:
在Linux内核中,最大阶MAX_ORDER默认定义为11,意味着一次分配最多可以请求2^11=2048个页面[1]。但是,特定体系结构的代码可以通过设置FORCE_MAX_ZONEORDER配置选项来手动改变最大阶的值。不同的体系结构可能会使用不同的最大阶值,例如IA-64系统可以处理MAX_ORDER=18的情况,而ARM或v850系统可能使用较小的值[1]。
内存区是伙伴系统中的一个重要概念,它描述了内存块的连接关系。内存区中的每一页都可以用于将内存区维持在链表中,这样就不需要引入新的数据结构来管理物理上连续的页。伙伴不必是彼此连接的,如果一个内存区在分配期间分解为两半,未使用的一半会被加入到对应的链表中。如果两个内存区都处于空闲状态,它们可以通过地址判断是否为伙伴,从而合并为一个更大的内存块。所有内存域和结点的伙伴系统都通过备用分配列表连接起来[1]。
伙伴系统的内存分配和释放过程如下:
内存分配:当应用程序请求分配一定数量的连续页帧时,伙伴系统会根据请求的大小在对应的链表中查找合适的内存块。如果找到了合适的内存块,则将其分配给应用程序使用。如果没有找到合适的内存块,则会将一个较大的内存块分裂成两个伙伴,其中一个伙伴被分配给应用程序,另一个伙伴保持空闲状态,并加入到对应的链表中[1]。
内存释放:当应用程序释放已分配的内存块时,伙伴系统会检查被释放的内存块的伙伴是否也处于空闲状态。如果伙伴也空闲,则将两个伙伴合并为一个更大的内存块,并将其加入到对应的链表中[1]。
伙伴系统可以有效地避免外部碎片的产生,因为Linux内存管理的伙伴系统是一种用于管理和分配物理内存页面的算法。它基于二进制伙伴算法,由Knowlton设计并由Knuth进行了更深入的描述[1]。伙伴系统是一种结合了2的方幂个分配器和空闲缓冲区合并技术的内存分配方案。
伙伴系统的基本思想很简单:将内存分成含有很多页面的大块,每一块都是2个页面大小的方幂。如果找不到所需大小的块,一个大块会被分成两部分,这两部分彼此成为伙伴。其中一半被用来分配,而另一半则保持空闲。这些块在以后的分配过程中会继续被二分,直至产生一个所需大小的块。当一个块被最终释放时,其伙伴将被检测出来,如果伙伴也是空闲的,则两者会合并[1]。
伙伴系统的数据结构主要包括以下几个部分:
struct zone:系统内存中的每个物理内存页(页帧)都对应于一个struct page实例,而每个内存域都关联了一个struct zone的实例,其中保存了用于管理伙伴数据的主要数数组[1]。
struct free_area:这是一个伙伴系统的辅助数据结构,用于维护空闲页面所组成的块。每一块都是2的方幂个页面,方幂的指数称为阶。阶是伙伴系统中一个非常重要的术语,它描述了内存分配的数量单位。内存块的长度是2^阶,其中阶的范围从0到MAX_ORDER。在struct zone中,通过一个名为free_area的数组来管理不同阶的内存块[1]。
MAX_ORDER和FORCE_MAX_ZONEORDER:MAX_ORDER是伙伴系统中最大的阶数,默认定义为11,意味着一次分配可以请求的页数最大是2^11=2048。但如果特定于体系结构的代码设置了FORCE_MAX_ZONEORDER配置选项,那么MAX_ORDER的值可以手动改变。不同的体系结构可能会根据其特定需求设置不同的MAX_ORDER值[1]。
内存区是伙伴系统中的一个重要概念,它描述了内存块的连接关系。以下是内存区的连接方式:
内存区中的第1页内的链表元素可以用于将内存区维持在链表中,这样就不必引入新的数据结构来管理物理上连续的页。如果一个内存区在分配期间分解为两半,内核会自动将未使用的一半加入到对应的链表中[1]。
伙伴不必是彼此连接的。如果两个内存区都处于空闲状态,可以通过它们的地址判断它们是否是伙伴。这种管理方式减少了管理工作量,是伙伴系统的一个主要优点[1]。
基于伙伴系统的内存管理专注于某个结点的某个内存域,但所有内存域和结点的伙伴系统都通过备用分配列表连接起来[1]。
Linux内存管理的伙伴系统是一种用于管理和分配物理内存页面的算法。它基于二进制伙伴算法,通过将内存分成含有很多页面的大块,并使用伙伴的方式进行分配和合并
Learn more:
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!