使用者申請記憶體的動態分配

2021-06-05 10:47:53 字數 901 閱讀 4839

當使用者應用程式使用c函式庫中的記憶體分配函式malloc()申請記憶體時,這些動態申請的記憶體容量或大小均由高層次的c庫函式malloc()來進行管理,核心本身並不會插手管理。因為核心已經為每個程序(除了任務0和1,它們與核心**一起常駐記憶體中)在cpu的4gb線性位址空間中分配了 64mb的空間,所以只要程序執行時定址的範圍在它的64mb範圍內,核心也同樣會通過記憶體缺頁管理機制自動為定址對應的頁面分配物理記憶體頁面並進行對映操作。但是核心會為程序使用的**和資料空間維護乙個當前位置值brk,這個值儲存在每個程序的資料結構中。它指出了程序**和資料(包括動態分配的資料空間)在程序位址空間中的末端位置。當malloc()函式為程式分配記憶體時,它會通過系統呼叫brk()把程式要求新增的空間長度通知核心,核心**從而可以根據malloc()所提供的資訊來更新brk的值,但並此時並不為新申請的空間對映物理記憶體頁面。只有當程式定址到某個不存在對應物理頁面的位址時,核心才會進行相關物理記憶體頁面的對映操作。

若程序**定址的某個資料所在的頁面不存在,並且該頁面所處位置屬於程序堆範圍,即不屬於其執行檔案映像檔案對應的記憶體範圍中,那麼cpu就會產生乙個缺頁異常,並在異常處理程式中為指定的頁面分配並對映一頁物理記憶體頁面。至於使用者程式此次申請記憶體的位元組長度數量和在對應物理頁面中的具體位置,則均由c庫中記憶體分配函式malloc()負責管理。核心以頁面為單位分配和對映物理記憶體,該函式則具體記錄使用者程式使用了一頁記憶體的多少位元組。剩餘的容量將保留給程式再申請記憶體時使用。

當使用者使用記憶體釋放函式free()動態釋放已申請的記憶體塊時,c庫中的記憶體管理函式就會把所釋放的記憶體塊標記為空閒,以備程式再次申請記憶體時使用。在這個過程中核心為該程序所分配的這個物理頁面並不會被釋放掉。只有當程序最終結束時核心才會全面收回已分配和對映到該程序位址空間範圍的所有物理記憶體頁面。

有關庫函式malloc()和free()的具體**實現請參見核心庫中的lib/malloc.c程式。

記憶體動態分配

陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...

動態分配記憶體

動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...

動態分配記憶體

動態分配記憶體 動態分配記憶體也可以分配儲存區,這種方式可以在程式執行的時候臨時決定分配的儲存區大小 為了管理動態分配的記憶體,就需要使用一組標準函式 為了使用這些標準函式,需要包含stdlib.h標頭檔案 malloc 函式可以動態分配一組連續的位元組 這個函式需要乙個整數型別引數表示分配的位元組...