程序由不一樣的段構成(代碼段,數據段)
1.程序的靜態特徵就是指令和數據
2.程序的動態特徵就是執行指令處理數據編程
A.段
傳統上,一個程序通常會有這幾個段:.text 、.data、.bss段
a.若是處理器由內存管理單元,那麼可執行程序被加載到內存之後,一般會將.text段所在的內存空間設置爲只讀,以保護.text中的代碼不會由於程序出錯而被意外改寫
b.處理器所需加工的數據是放在.data、.bss、.rdata段併發
代碼示例
1.狀況一
運行的結果圖進行對比,能夠看到的是.data和.bss段的大小有了變化,這是由於在第二個實驗中增長了兩個變量。對於初始化不爲0 的變量,編譯器會將它放入.data段中,而對於初始化爲0的變化量會被放入.bss段中ide
二.棧
棧的做用:
1.當中斷髮生時用於保存處理器寄存器的值,以便中斷返回時經過退棧回到被中斷點繼續程序的運行
2.用做函數參數和局部變量的存儲空間。正由於棧還能夠用於存放局部變量,因此棧指針的變化並不僅是經過退棧才能夠改變
3.函數調用時,棧用於保存函數的活動記錄(棧幀信息),併發編程時,每個線程擁有獨立的棧
SP寄存器做爲棧頂"指針"實現入棧操做和出棧操做
三.程序中的堆
1.堆是一片"閒置"的內存空間,用於提供動態內存分配
2.堆空間的分配須要函數支持
3.堆空間在使用結束後須要歸還函數
四.小結
1.程序中的內容是經過段進行分類管理的。在傳統的三個段中,.text段用於存放處理器指令,.data段用於存放初始化的全局和靜態變量,.bss段則用於存放初始化爲0和未初始化的全局和靜態變量。一個程序無論有多少個段,各段都屬於程序,數據和調試信息三大類的一種。
2.棧爲函數參數和局部變量提供存儲空間。局部變量所佔用的內存空間是由編譯器生成的指令自動分配與釋放的,所以不存在像堆那樣的內存泄漏問題。在多任務環境中,因爲各任務的函數調用路徑能夠不一樣,因此每個任務都有屬於本身的棧空間
3.堆中的內存在沒有分配出來以前,是整個系統所共享的。要從堆中獲取內存,必須經過函數調用來實現。若是從堆中所分配得到的內存不在須要使用了,則必須調用相應的函數進行釋放,不然會產生內存泄漏線程