程序在記憶體中是什麼樣子?
載入到記憶體並執行的程式稱為程序。簡單來說,程序就是正在執行的程式。
建立程式時,它只是一些位元組,作為被動實體儲存在硬碟上。然後,當在 Windows 中雙擊程式或在命令列中輸入可執行檔案的名稱時(例如 a.out 或 prog.exe),程式開始載入到記憶體中併成為一個活動實體。
讓我們看一下每個記憶體段以及程序在記憶體中的樣子:
圖:記憶體中的程序
文字段 (TEXT)
程序不僅僅是程式程式碼,程式碼段被稱為**文字段**。此記憶體段包含程式的可執行指令。它還包含常量、宏,並且是隻讀段,以防止意外修改指令。它也是可共享的,以便其他程序在需要時可以使用它。
資料段 (DATA)
下一個**資料段**記憶體段包含全域性和靜態變數,這些變數由程式設計師在程式執行之前初始化。此段不是隻讀的,因為變數的值可以在執行時更改。
例如,在 C 程式中:
#include<stdio.h> int b;//will be stored in data section int main(){ static int a; //will be stored in data section return; }
堆 (HEAP)
為了分配記憶體給那些**編譯器**在程式執行前無法靜態確定大小的變數(由程式設計師請求),需要動態分配記憶體,這在**堆**段中完成。它只能在執行時確定。它是透過對 malloc、calloc、free、delete 等的系統呼叫來管理的。一個 C 例子:malloc(2) 返回堆區域中 2 位元組塊的起始地址。
棧 (STACK)
程序通常還包括程序棧,其中包含臨時資料,例如函式引數、返回地址和區域性變數。在標準 x86 架構中,它向下增長到較低的地址,但在某些其他架構中,它可能向相反方向增長。圖中顯示棧的增長方向與堆相反,以避免重疊問題。此段用於儲存程式中函式呼叫所需的所有資料。
棧指標暫存器跟蹤棧頂,即當前程序使用了多少棧空間,並且每次將值“壓入”棧時都會修改它。如果棧指標遇到堆指標,則可用空閒記憶體將被耗盡。
廣告