程序的虛擬地址空間分配概述
阿新 • • 發佈:2019-02-19
一、為什麼進行記憶體空間的分配
在任何程式設計環境及語言中,記憶體管理都十分重要。在目前的計算機系統或嵌入式系統中,記憶體資源仍然是有限的。因此在程式設計中,有效地管理記憶體資源是程式設計師首先考慮的問題。
二、程序虛擬地址空間的分類和空間示意圖
- 棧區—由編譯器自動分配釋放,存放函式形參,區域性變數和自動變數
- 堆區—用於分配由malloc、realloc、calloc分配的空間
- 資料區—該區又分為bss段,rodata段和data段:
- bss段—儲存未初始化或者初始化為0的全域性變數
- rodata段—用於儲存常量
- data段(靜態資料區)—儲存初始化不為0的全域性變數或者static修飾的變數
- 程式碼區—存放函式體的二進位制程式碼
三、各地址空間的特點
- 棧區—棧區的許可權由系統決定,資料具有先進後出,後進先出的特點。若定義一個未初始化的區域性變數,該變數被初始化為隨機值
- 堆區—堆區的許可權由使用者決定,使用者通過malloc、ralloc、calloc分配地址空間,並使用free()函式釋放空間,資料具有先進先 出、後進後出的特點
- 資料區:
- bss段—若定義了一個未初始化的全域性變數,該變數被預設初始化為0
- rodata段—當中儲存的常量是不允許被修改的
- data段(靜態資料區) — 若定義了一個未初始化的靜態全域性變數,該全域性變數被預設初始化為0
- 程式碼區—存放了程式程式碼的資料,假如機器中有數個程序執行相同的一個程式,那麼它們就可以使用同一個程式碼段