Linux 内核中的内存分配
Memory Allocation in Linux Kernel
今天去面试,被问到这个问题。如果要求您分配 2KB 大小的内存并且分配的内存应该是页面对齐的,您会使用什么内核内存分配策略。
KMALLOC 处理较小的内存分配策略,但它支持的最低单位是 4KB,这是物理页面的大小。我问他,他是否期待 slab 分配器?他没有正面回复。
对于页对齐内存分配,使用alloc_pages/alloc_page。您也可以使用__get_free_pages/__get_free_page。 __get_free_page 最终只使用 alloc_pages。这些函数用于从物理内存中分配页面。这些分配器是 物理内存分配器 或 伙伴分配器
您关于 kmalloc 分配最少 4KB 内存的假设是错误的。 kmalloc 基于 slab 分配器 。做一个 cat /proc/slabinfo 你会知道已经为 kmalloc 创建了几个 slab。这些 slab 将减少使用 kmalloc 分配的内部内存碎片。因此,如果您分配 4 个字节,那么只会从 kmalloc-8 的 kmalloc slab 分配 8 个字节(4 个字节的内部碎片)。如果分配 9 个字节,则从 kmalloc-16 slab 分配 16 个字节,依此类推。
kmalloc,alloc_page/s,__get_free_page/s 不需要页面 tables。返回的虚拟内存地址只是偏移地址.
虽然你没有问过,但我会提到 vmalloc 是另一种使用 资源映射分配器 的分配技术。使用内核母版页table(swapper_pg_dir)
访问通过vmalloc分配的非连续内存
Mel Gorman 书和 Professional linux 内核体系结构书中提到了不同的 Linux 分配器。看完这些,会有帮助。
我读入:
http://www.makelinux.net/books/lkd2/ch11lev1sec4
The function returns a pointer to a region of memory that is at least size bytes in length
我知道系统 Operation x86(32 位)- RAM 4GB 中的最大映射大小,但它包括 Reference 和 information brute。
所以 4GB 是所有 space 可用的,转换为 'KB' = 4194304 KB,内存 Ram 等于 Grid 4194304 spaces(索引和存储信息),或者side of square( in latin Radix Quadratum ) SQRT(4194304)= all size only index the information, as below "int flags")
void * kmalloc(size_t size, int flags)
您可能希望使用该功能,以使用 KB 不同的 2 或 4。
属性
今天去面试,被问到这个问题。如果要求您分配 2KB 大小的内存并且分配的内存应该是页面对齐的,您会使用什么内核内存分配策略。
KMALLOC 处理较小的内存分配策略,但它支持的最低单位是 4KB,这是物理页面的大小。我问他,他是否期待 slab 分配器?他没有正面回复。
对于页对齐内存分配,使用alloc_pages/alloc_page。您也可以使用__get_free_pages/__get_free_page。 __get_free_page 最终只使用 alloc_pages。这些函数用于从物理内存中分配页面。这些分配器是 物理内存分配器 或 伙伴分配器
您关于 kmalloc 分配最少 4KB 内存的假设是错误的。 kmalloc 基于 slab 分配器 。做一个 cat /proc/slabinfo 你会知道已经为 kmalloc 创建了几个 slab。这些 slab 将减少使用 kmalloc 分配的内部内存碎片。因此,如果您分配 4 个字节,那么只会从 kmalloc-8 的 kmalloc slab 分配 8 个字节(4 个字节的内部碎片)。如果分配 9 个字节,则从 kmalloc-16 slab 分配 16 个字节,依此类推。
kmalloc,alloc_page/s,__get_free_page/s 不需要页面 tables。返回的虚拟内存地址只是偏移地址.
虽然你没有问过,但我会提到 vmalloc 是另一种使用 资源映射分配器 的分配技术。使用内核母版页table(swapper_pg_dir)
访问通过vmalloc分配的非连续内存Mel Gorman 书和 Professional linux 内核体系结构书中提到了不同的 Linux 分配器。看完这些,会有帮助。
我读入: http://www.makelinux.net/books/lkd2/ch11lev1sec4
The function returns a pointer to a region of memory that is at least size bytes in length
我知道系统 Operation x86(32 位)- RAM 4GB 中的最大映射大小,但它包括 Reference 和 information brute。
所以 4GB 是所有 space 可用的,转换为 'KB' = 4194304 KB,内存 Ram 等于 Grid 4194304 spaces(索引和存储信息),或者side of square( in latin Radix Quadratum ) SQRT(4194304)= all size only index the information, as below "int flags")
void * kmalloc(size_t size, int flags)
您可能希望使用该功能,以使用 KB 不同的 2 或 4。
属性