[操作系統]代碼段和數據段分開


1)防止程序指令被修改,設置代碼段權限為只讀,設置數據段權限為可讀寫
2)代碼段和數據段分開有利於提高程序的局部性,現代CPU緩存一般設計為數據緩存和指令緩存分離,指令和數據分開存放可以提高CPU緩存命中率。
3)共享指令,當系統運行多個程序的副本時,它們指令時一樣的,因此內存只需保存一份程序的指令代碼。每個副本進程的數據區是進程私有,可以節省內存


1)代碼段:代碼段是用來存放可執行文件的操作指令,也就是說是它是可執行程序在內存中的鏡像。代碼段需要防止在運行時被非法修改,所以只准許讀取操作,而不允許寫入(修改)操作——它是不可寫的。

2)數據段:數據段用來存放可執行文件中已初始化全局變量,換句話說就是存放程序靜態分配的變量和全局變量。

3)BSS段:BSS段包含了程序中未初始化的全局變量,在內存中 bss段全部置零。

4)堆(heap):堆是用於存放進程運行中被動態分配的內存段,它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)

它的物理內存空間是由程序申請的,並由程序負責釋放。

5)棧:棧是用戶存放程序臨時創建的局部變量,也就是說我們函數括弧“{}”中定義的變量(但不包括static聲明的變量,static意味着在數據段中存放變量)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,並且待到調用結束后,函數的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM