Linux カーネルは、特定のしきい値よりも大きい場合にvmalloc
メモリを割り当てるために使用していることがわかります。fdtable
これがいつ発生するかを知り、より明確な情報を入手したいと思います。
static void *alloc_fdmem(size_t size)
{
/*
* Very large allocations can stress page reclaim, so fall back to
* vmalloc() if the allocation size will be considered "large" by the VM.
*/
if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) {
void *data = kmalloc(size, GFP_KERNEL|__GFP_NOWARN);
if (data != NULL)
return data;
}
return vmalloc(size);
}
alloc_fdmem
から呼び出されalloc_fdtable
、最後の関数がから呼び出されますexpand_fdtable
サイズを印刷するためにこのコードを書きました。
#include <stdio.h>
#define PAGE_ALLOC_COSTLY_ORDER 3
#define PAGE_SIZE 4096
int main(){
printf("\t%d\n", PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER);
}
出力
./printo
32768
vmalloc
では、カーネルが割り当てに使用するように切り替えるには、いくつのファイルが必要fdtable
ですか?