1. 物理內存:
物理內存指的是插在計算機主板內存槽上的實際物理內存,CPU可以直接進行尋址;
物理內存的容量是固定的,但是尋址空間卻取決於cpu地址線條數,如32位機,則尋址空間為2^32=4G,
即最大支持4G的尋址空間,即使我們插入了32G容量的內存條,我們也只能擁有4G的物理內存;
2. 虛擬內存:
進程執行需要將代碼和數據放在內存中,但是物理內存是有限的,當進程比較多的時候,容易造成內存耗盡,而虛擬內存有效的解決了這個問題;
進程創建加載的時候,自身感知獲得到了一個連續的內存地址空間,而實際上內核只是分配了一個邏輯上的虛擬內存空間,並且對虛擬內存和磁盤通過mmap做映射關系,對虛擬內存和物理內存做映射關系;等到程序真正運行的時候,需要某些數據,並且不在物理內存中,才會觸發缺頁異常,進行數據拷貝;
虛擬內存空間和磁盤之間的映射使用mmap完成,說白了虛擬內存空間就是磁盤上的一塊區域;
3. 進程地址空間:
Linux進程地址空間包含以下幾個部分:
1. 代碼段:指令;
2. 數據段:初始化的全局變量;
3. BSS段:未初始化的全局變量;
4. 堆:malloc動態分配內存使用堆,從低地址向高地址增長;
5. 共享庫和共享內存:加載共享庫和使用mmap共享內存;
6. 棧:自動變量和函數使用棧,從高地址向低地址增長;