資料部分占用記憶體,那麼我們寫的程式是不是也占用記憶體呢?
在linux中,程式的載入,涉及到兩個工具,linker 和loader。linker主要涉及動態鏈結庫的使用,loader主要涉及軟體的載入。
exec執行乙個程式
elf為現在非常流行的可執行檔案的格式,它為程式執行劃分了兩個段,乙個段是可以執行的**段,它是唯讀,可執行;另乙個段是資料段,它是可讀寫,不能執行。
loader會啟動,通過mmap系統呼叫,將**端和資料段對映到記憶體中,其實也就是為其分配了虛擬記憶體,注意這時候,還不占用物理記憶體;只有程式執行到了相應的地方,核心才會為其分配物理記憶體。
loader會去查詢該程式依賴的鏈結庫,首先看該鏈結庫是否被對映進記憶體中,如果沒有使用mmap,將**段與資料段對映到記憶體中,否則只是將其加入程序的位址空間。這樣比如glibc等庫的記憶體位址空間是完全一樣。
因此乙個2m的程式,執行時,並不意味著為其分配了2m的物理記憶體,這與其執行了的**量,與其所依賴的動態鏈結庫有關。
Linux下檢視程式記憶體占用
使用ps命令檢視記憶體是不準確的,因為其返回的是乙個程序所用的所有空間,而由於linux的共享記憶體機制,乙個資源可能並非乙個程式所獨佔。詳見 使用pmap命令。usage pmap options pid pid options x,extended show details x show eve...
程式占用的記憶體分類
字串常量,放在哪個儲存區呢?是 自動儲存區 還是 靜態儲存區 中?比如 char pstr hello world 這裡,hello world 是乙個字串常量,pstr是在棧中的變數。我想問,字串常量,在哪個記憶體區域分配空間呢?好像應該不是在 棧區 分配空間吧!一 預備知識 程式的記憶體分配 乙...
程式占用記憶體分析
堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由o...