天天看點

申請記憶體的函數有哪些

申請記憶體的函數有哪些,以及其特點

其實總結起來,申請記憶體的函數主要有kmalloc,vmalloc,__get_free_page,malloc函數族,alloca。下面分别介紹:

1. vmalloc:核心态的記憶體申請函數,也是基于slab機制。申請的實體記憶體并不連續,速度相比于kmalloc要慢。用于申請大塊記憶體。其配置設定的記憶體在核心空間中的動态映射區。Vmalloc能配置設定的記憶體較大,可以通過指令“cat /proc/meminfo | grep Vmalloc”來看。通過下圖可以看出,在我的計算機上能夠通過Vmalloc使用的最大記憶體總共有122880KB。下圖是一個展示。

申請記憶體的函數有哪些

2. __get_free_page:是頁面配置設定器提供給調用者的最底層的記憶體配置設定函數,傳回一個頁的記憶體。Get_free_page是對__get_free_pages的一個封裝。其中的gfp_mask是一個選項。

申請記憶體的函數有哪些

Get_free_pages的作用是傳回幾個頁長的記憶體,其中的order便是頁數,他們在實體上是連續的,下面是__get_free_pages的源碼,可以看出,他其實是對_alloc_pages進行的一層簡單封裝,實際上還是使用alloc_pages進行記憶體配置設定:

申請記憶體的函數有哪些

   __get_free_pages是基于夥伴系統進行配置設定記憶體的,下面進行簡單的說下夥伴系統。

   夥伴系統是linux中用來解決外部記憶體碎片的問題的一種機制,所謂外部碎片,是指還沒有配置設定出去,但是由于大小太小而無法配置設定給申請空間的新程序的記憶體碎片。

夥伴系統的宗旨就是用最小的記憶體塊來滿足核心的對于記憶體的請求。在最初,隻有一個塊,也就是整個記憶體,假如為1M大小,而允許的最小塊為64K,那麼當我們申請一塊200K大小的記憶體時,就要先将1M的塊分裂成兩等分,各為512K,這兩分之間的關系就稱為夥伴,然後再将第一個512K的記憶體塊分裂成兩等分,各位256K,将第一個256K的記憶體塊配置設定給記憶體,這樣就是一個配置設定的過程。

3. kmalloc:核心态的記憶體申請函數,使用slab機制,申請的記憶體實體連續,并且當kmalloc傳回的時候記憶體就已經對應完畢了。Kmalloc主要用于配置設定小記憶體。Kmalloc能配置設定的記憶體處于核心空間中的前896M,也就是直接映射區。

4. Malloc函數族(以malloc為例):使用者态的動态記憶體申請函數。Malloc是一個庫函數,不同的平台上malloc的實作不同。Linux下glibc中使用的是ptmalloc的實作。Malloc是從堆上配置設定記憶體,但是核心中并沒有堆的概念,堆是應用程式的概念,在程序建立的時候,在程序的虛拟位址空間中劃分出一塊區域作為對,使用malloc實際上就是從這塊虛拟記憶體中分出更小的區域給應用程式,不過隻有當應用程式真正的通路這塊記憶體才會産生缺頁中斷,進而獲得真正的實體記憶體。Free之後也并不會釋放實體記憶體,隻是把這些記憶體歸還給堆。

  除了malloc,malloc函數族還包括calloc,realloc。Calloc相比于malloc增加了初始化功能。Realloc則用于重新配置設定記憶體。

5. Alloca:動态配置設定棧上記憶體,函數結束後自動釋放。個人認為主要作用是可以用來做變長數組。

來自為知筆記(Wiz)

轉載于:https://www.cnblogs.com/dchipnau/p/5043593.html

繼續閱讀