記憶體分配 kmalloc

2021-08-16 18:13:23 字數 722 閱讀 8386

kmalloc 記憶體分配引擎是乙個功能強大的工具,下面我們來講解一下這個函式。

kmalloc 函式分配記憶體時有幾個特點:

1、獲取記憶體空間時不會對記憶體空間進行清零,也就是說,分配給它的區域仍然保持著原有的資料。

2、它分配的區域在物理記憶體中也是連續的。

3、kmalloc最常用的標誌是gfp_kernel,它表示記憶體分配(最終總是呼叫get_free_pages來實現實際的分配,這也是gfp_字首的由來)是代表執行在核心空間的程序執行的。換句話說,這意味著呼叫它的函式正代表某個程序在執行系統呼叫。

注意:使用gfp_kernel可能在空閒記憶體較少時把當前程序轉入休眠以等待足夠記憶體(乙個page),因此使用gfp_kernel分配記憶體的函式必須是可重入的(乙個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤)。

4、當kmalloc是在程序上下文之外被呼叫的(這時程序不能進入休眠狀態)時,驅動函式就應該換用gpf_atomic標誌,此時執行的程序不會被中斷(核心通常會為原子性的分配預留一些空閒頁面,如果kmalloc已經用掉了最後一頁,則會返回出錯)。

#include

void *kmalloc(size_t size, int flags);

kmalloc的第乙個引數是要分配的塊的大小,第二個引數是分配標誌(flags)

kmalloc分配核心堆空間

kmalloc函式的原型是 include void kmalloc size t size,int flags kmalloc函式說明 size是要分配的塊大小 flags分配方式,控制kmalloc分配記憶體的方式 在沒有阻塞的情況下,分配記憶體快,並且對於分配到的記憶體塊,不對該記憶體塊清零,...

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...

記憶體分配 定長記憶體分配器

在各種記憶體分配演算法中,有一種很實用,實現起來也簡單 定長的記憶體分配器。即每次分配的記憶體大小是固定的。大概邏輯是 在一些區域性的單執行緒邏輯中,可以有效提高效率。很短,很容易看懂 fallocator.h pragma once 固定長度的記憶體分配器 include include incl...