Linux内核中的内存分配

3

我今天参加了一次面试,被问到了这个问题:如果你需要分配2KB大小的内存并且要求分配的内存是页对齐的,你会使用什么内核内存分配策略?

KMALLOC处理较小的内存分配策略,但它支持的最低单位是4KB,即物理页面的大小。我问他是否期望使用slab分配器?他没有积极回答。


1
@Marc:这是我的问题:“如果要分配大小为2KB的内存,并且该分配的内存应该是页面对齐的,您会使用什么内核内存分配策略?”我不确定你的意思是什么。 - Ram27
2个回答

8
为了进行页面对齐的内存分配,请使用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的slab中分配8个字节(4个字节的内部碎片)。如果您分配9个字节,则从kmalloc-16的slab中分配16个字节,依此类推。
kmalloc、alloc_page/s、__get_free_page/s不需要页表。返回的虚拟内存地址仅是偏移地址。
虽然您没有要求,但我会提到vmalloc是另一种使用资源映射分配器的分配技术。通过vmalloc分配的非连续内存可通过使用内核主页表(swapper_pg_dir)进行访问。
Mel Gorman书和Professional linux kernel architecture书中提到了不同的Linux分配器。阅读这些书籍会有所帮助。

-2

我在这里阅读了: http://www.makelinux.net/books/lkd2/ch11lev1sec4

该函数返回一个指向至少大小为size字节的内存区域的指针

我知道操作系统x86(32位)- RAM中最大大小映射为4GB,但它包括引用和信息暴力破解。

因此,4GB是所有可用空间,转换为“KB”= 4194304 KB,内存RAM等于网格4194304个空间(索引和正文信息),或者正方形的一边(在拉丁语中为Radix Quadratum)SQRT(4194304)=仅索引信息的所有大小,如下面的“int flags”所示)

void * kmalloc(size_t size, int flags)

您可能希望使用该函数,以使用不同于2或4的KB。

敬礼


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接