Linux系統下程序記憶體空間模型

2021-10-24 10:55:33 字數 875 閱讀 6972

linux下每個程序都有乙個虛擬記憶體空間,32系統下一般是 4g大小。

其中包括:

從高位址到低位址來講分別有以下幾種:

整體上可以分為兩種,核心區以及使用者區,

核心區中是一些使用者**不可見的區域,比如頁表就存放在這個區域。

使用者區中從上到下分別是:

a. **段: 可讀不可寫

b. 資料段: 全域性變數以及靜態變數存放的區域

c. 堆區: 動態記憶體,通過malloc, new 申請記憶體。

d. 檔案對映區域:通過mmap系統呼叫,比如共享記憶體等對映物理空間的記憶體區域。

e. 棧區:維護函式呼叫的上下文空間

程序之間共享記憶體方式有兩種:shm與mmap。

shm:多個程序的虛擬位址直接共享同一塊物理記憶體區域,訪問速度快,大小受限制

mmap:多個程序的虛擬位址空間共享同一塊磁碟空間,空間大,訪問速度慢

mmap是一種記憶體對映方法,將物理檔案或者物件對映到程序中的虛擬位址空間中一段虛擬位址。

mmap呼叫過程:

使用者態呼叫mmap之後建立乙個虛擬記憶體區域,核心態呼叫mmap建立磁碟空間到虛擬位址之間的對映,並建立頁表。程序發起對對映空間的訪問,引發缺頁異常,將檔案內容拷貝到物理記憶體。

5.函式呼叫上下文空空間包括: 區域性變數,函式引數,當前狀態,函式呼叫資訊。 棧空間向位址減少的方向增長。

函式呼叫過程使用的是堆疊實現,每個使用者態程序對應乙個呼叫棧,編譯器使用它傳遞函式引數,儲存返回位址,臨時儲存暫存器原有值以及從儲存本地區域性變數

(頁表基址暫存器)

c 程序記憶體空間分布

c 程序記憶體空間分布 注意各部分的記憶體位址誰高誰低,注意棧從高到低分配,堆從低到高分配 記憶體分布分為5個部分,從高位址到低位址一次為 棧區 stack 堆區 heap 未初始化資料段 uninitialized data 初始化資料段 initialize data 段 text 1.文字段也...

C CPP程序記憶體空間分布

記憶體分布分為5個部分,從高位址到低位址依次為棧區 stack 堆區 heap 未初始化資料段 uninitialized data 初始化資料段 initialize data 和 段 text 有些文件也把初始化的資料段和未初始化的資料段合稱全域性區。1.文字段 唯讀 共享,作業系統管理 文字段...

Linux釋放記憶體空間

linux伺服器執行一段時間後,由於其記憶體管理機制,會將暫時不用的記憶體轉為buff cache,這樣在程式使用到這一部分資料時,能夠很快的取出,從而提高系統的執行效率,所以這也正是linux記憶體管理中非常出色的一點,所以乍一看記憶體剩餘的非常少,但是在程式真正需要記憶體空間時,linux會將快...