記得,兩年前在北京找工做過程當中,常常被面試官問進程在內存中是如何分佈存放的,主要表現爲幾個段,各個段的意思是什麼?以後在工做當中,特別在嵌入式工做領域當中,時不時的提到這樣的問題。我想這個問題不單單我碰到,許多從事計算機行業工做的同行也遇到。今天趁有點時間,就來對進程內存分佈進行一個簡單的講解,但願對讀者有幫助。面試
進程的內存分佈,大致分爲:代碼段,數據段,堆段,棧段和其它段,具體以下圖所示:數據結構
圖:進程內存分佈函數
咱們自底向上的方式進行講解:blog
1. 代碼段:主要是程序的代碼以及編譯時靜態連接進來的庫。這段內存大小在程序運行以前就已經肯定,並且是隻讀,可能存在一些常量,好比字符串常量。進程
2. 數據段:分爲data和bss兩個段,表現爲靜態內存段,data段存放已初始化的全局變量(靜態內存分配的變量和初始化全局變量)。bss段存放未初始化的全局變量,在內存中bss段被清零。內存
3. 堆 段:用於程序動態內存分配和管理,如何分配和管理由程序的開發者決定,大小不固定(跟您的機器內存有關係),能夠動態伸縮。開發
4. 映射段:該內存區域存放連接其它動態程序庫的向量,共享內存映射向量等等。字符串
5. 棧 段:棧是一種先進後出的數據結構,該段內存區域由程序在運行中自行管理,如:局部變量保存和撤除、函數調用相關等。編譯
6. 輸入的環境變量和參數段:主要內存程序執行時的環境變量,輸入參數等等。變量
7. 就是系統區域。
終上所述,咱們根據圖中的7個部分自底向上的進行簡單的講解,各個段存放的數據和做用相信讀者也有了底,祝你生活愉快,妹子大大的有,妹子嘛勸你仍是專注一個好男人吧,省得吃虧!