2013-10-30 161 views
2

當我看到Linux內核使用vmallocfdtable分配內存時,它大於某個閾值。我想知道這是什麼時候發生的,並且有更清楚的信息。Linux文件描述符表和vmalloc

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_fdmemalloc_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

+0

你從哪裏看到這個? – wallyk

+0

linux-3.11.1/fs/file.c – c4f4t0r

回答

2

所以PAGE_SIZE < < PAGE_ALLOC_COSTLY_ORDER爲32768

這就是所謂的喜歡:

data = alloc_fdmem(nr * sizeof(struct file *)); 

即它是用來存儲結構文件指針。

如果你的指針是4個字節,當你有32768/4 = 8192個打開文件時,如果你的指針是8個字節,它發生在4096個打開文件中。

+0

從上面的代碼中讀取,哪個大小被賦予alloc_fdmem函數? – c4f4t0r

+0

你的意思是'nr * sizeof(struct file *)'? nr是要分配的文件指針的數量,這將對應於文件描述符的數量。所以其餘的肯定是簡單的數學?如果你在32位機上,所以指針是4個字節, 32768當nr是8192 – nos

+0

是的,我的意思是「nr * sizeof(struct file *)」,所以在fdtb中使用8193文件描述符,linux開始使用vmalloc,告訴我你是否理解得好 – c4f4t0r