作業系統中程式的記憶體結構說明

2021-10-08 14:36:03 字數 1462 閱讀 3622

乙個程式在記憶體上由bss段、data段、text段三個組成的。在沒有調入記憶體前,可執行程式分為**段、資料區和未初始化資料區三部分。

bss段:(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。bss段(未進行初始化的資料)的內容並不存放在磁碟上的程式檔案中。其原因是核心在程式開始執行前將它們設定為0。需要存放在程式檔案中的只有正文段和初始化資料段。text段和data段在編譯時已經分配了空間,而bss段並不占用可執行檔案的大小,它是由鏈結器來獲取記憶體的。

資料段:(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。

**段:(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上;當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除。

這裡區別堆區:用於動態分配記憶體,位於bss和棧中間的位址區域。由程式設計師申請分配和釋放。堆是從低位址位向高位址位增長,採用鏈式儲存結構。頻繁的malloc/free造成記憶體空間的不連續,產生碎片。當申請堆空間時庫函式是按照一定的演算法搜尋可用的足夠大的空間。因此堆的效率比棧要低的多。

棧(stack):棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

這裡區別棧區:由編譯器自動釋放,存放函式的引數值、區域性變數等。每當乙個函式被呼叫時,該函式的返回型別和一些呼叫的資訊被存放到棧中。然後這個被呼叫的函式再為他的自動變數和臨時變數在棧上分配空間。每呼叫乙個函式乙個新的棧就會被使用。棧區是從高位址位向低位址位增長的,是一塊連續的記憶體區域,最大容量是由系統預先定義好的,申請的棧空間超過這個界限時會提示溢位,使用者能從棧中獲取的空間較小。

作業系統 程式執行時的記憶體組織結構

類似於mac os,linux,windows的作業系統會將不 同型別的資料存放到記憶體中的不同區域 段,section segment 可以在執行鏈結器的時候指定各種引數來控制程式的記憶體組織,下面是windows下的典型記憶體結構。圖有誤,稍後修正 1 作業系統保留了記憶體位址最低的位置。通常情...

作業系統 二 作業系統結構

好好學習,天天向上本文已收錄至我的github倉庫daydayup 使用者介面 程式執行 i o 操作 檔案系統操作 通訊 錯誤檢測 增值服務 資源分配 統計 保護和安全 作業系統服務 作業系統程式介面 系統呼叫 作業系統使用者介面 系統程式 既然作業系統有這麼多的服務,那麼我們平時是怎麼去使用作業...

作業系統結構

作業系統結構 2010年10月20日 作業系統結構 作業系統與使用者介面 系統呼叫 作業系統結構 作業系統特徵 3.0使用者與作業系統的介面 1.命令介面 聯機介面 互動式 使用系統提供的操作命令,互動地控制程式執行和管理計算機系統.如系統管理,環境設定,許可權管理,檔案管理等 脫機介面 以作業說明...