| ...... | ... 省略了一些我們不需要關心的區
+--------------------------------------+
| env strings (環境變量字串) | \
+--------------------------------------+ \
| argv strings (命令行字串) | \
+--------------------------------------+ \
| env pointers (環境變量指針) | SHELL的環境變量和命令行參數保存區
+--------------------------------------+ /
| argv pointers (命令行參數指針) | /
+--------------------------------------+ /
| argc (命令行參數個數) | /
+--------------------------------------+
| main 函數的棧幀 | \
+--------------------------------------+ \
| func_1 函數的棧幀 | \
+--------------------------------------+ \
| func_2 函數的棧幀 | \
+--------------------------------------+ \
| func_3 函數的棧幀 | Stack (棧)
+......................................+ /
| | /
...... /
| | /
+......................................+ /
| Heap (堆) | /
+--------------------------------------+
| Uninitialised (BSS) data | 非初始化數據(BSS)區
+--------------------------------------+
| Initialised data | 初始化數據區
+--------------------------------------+
| Text | 文本區
+--------------------------------------+
上圖爲進程數據內存分配圖,底端爲內存低地址,文本區存放只讀程序代碼,由fork創建的子進程共享該段代碼,而其他數據區則從新開闢。Data段(初始化數據區)爲數據分配空間,BSS段只記錄數據所需內存大小,不爲其分配空間。
進程:進程是一個運行程序併爲其提供執行環境的實體,它包括一個地址空間和至少一個控制點,進程在這個地址空間上執行單一指令序列。進程地址空間包括可以訪問或引用的內存單元的集合,進程控制點通過一個一般稱爲程序計數器(program counter,PC)的硬件寄存器控制和跟蹤進程指令序列。進程作爲分配資源的基本單位,而線程作爲獨立運行和獨立調度的基本單位。