linux程序的5個段

2021-07-13 21:14:23 字數 1276 閱讀 5627

程序(執行的程式)會占用一定數量的記憶體,它或是用來存放從磁碟載入的程式**,或是存放取自使用者輸入的資料等等。不過程序對這些記憶體的管理方式因記憶體用途 不一而不盡相同,有些記憶體是事先靜態分配和統一**的,而有些卻是按需要動態分配和**的。對任何乙個普通程序來講,它都會涉及到5種不同的資料段。

linux程序的五個段

下面我們來簡單歸納一下程序對應的記憶體空間中所包含的5種不同的資料區都是幹什麼的。

bss段:bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。

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

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

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

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

它是由作業系統分配的,記憶體的申請與**都由os管理。

ps:全域性的未初始化變數存在於.bss段中,具體體現為乙個佔位符;全域性的已初始化變數存於.data段中;而函式內的自動變數都在棧上分配空間。.bss是不占用.exe檔案空間的,其內容由作業系統初始化(清零);而.data卻需要占用,其內容由程式初始化,因此造成了上述情況。

bss段(未手動初始化的資料)並不給該段的資料分配空間,只是記錄資料所需空間的大小。

data(已手動初始化的資料)段則為資料分配空間,資料儲存在目標檔案中。 資料段包含經過初始化的全域性變數以及它們的值。bss段的大小從可執行檔案中得到 ,然後鏈結器得到這個大小的記憶體塊,緊跟在資料段後面。當這個記憶體區進入程式的位址空間後全部清零。包含資料段和bss段的整個區段此時通常稱為資料區。

linux 程序的 5 大段

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

linux 程序記憶體管理 資料段

所有程序 執行的程式 都必須占用一定數量的記憶體,它或是用來存放從磁碟載入的程式 或是存放取自使用者輸入的資料等等。對任何乙個普通程序來講,它都會涉及到5種不同的資料段。段 這個區域儲存著被裝入執行的二進位制機器 處理器會到這個區域取指並執行。段需要防止在執行時被非法修改,所以只准許讀取操作,而不允...

Hadoop的5個守護程序

一般如果正常啟動hadoop,我們可以在master上通過jps命令看到以下5個daemons root master jps 31144 jps 19803secondarynamenode 19994tasktracker 19571namenode 19672datanode 19887job...