堆棧段,通常是指采用堆棧方式工作的一段內(nèi)存區(qū)域。在采用段式內(nèi)存管理方式進(jìn)行程序內(nèi)存分配的架構(gòu)中,堆棧段用來存放局部變量和函數(shù)返回地址。
概述堆棧段(stack segment)通常是指采用堆棧方式工作的一段內(nèi)存區(qū)域。
當(dāng)程序被執(zhí)行時(shí),程序可能會將其執(zhí)行的狀態(tài)加入棧的頂部;當(dāng)程序結(jié)束時(shí),它必須把棧頂?shù)臓顟B(tài)數(shù)據(jù)彈出(pop)。
堆棧段是在程序運(yùn)行時(shí)動態(tài)分配使用,只需要通過棧頂指針即可訪問。
目前大多數(shù)CPU中都有專用寄存器可以被用來存放棧頂?shù)刂贰?/p>
堆棧段的作用在采用段式內(nèi)存管理方式進(jìn)行程序內(nèi)存分配的架構(gòu)中,堆棧段用來存放局部變量和函數(shù)返回地址。堆棧段是在程序運(yùn)行時(shí)動態(tài)分配使用,只需要通過棧頂指針即可訪問。目前大多數(shù)CPU中都有專用寄存器可以被用來存放棧頂?shù)刂?。
理論上,最小的??赡苁且粋€(gè)僅能保存函數(shù)調(diào)用(function call)地址的結(jié)構(gòu),以致被調(diào)用的函數(shù)能根據(jù)該地址返回(return)到原函數(shù)里。除此功能以外,開發(fā)者也可以將棧另作他用。
內(nèi)存分配基于棧的內(nèi)存分配法的另一特點(diǎn)就是,當(dāng)程序結(jié)束時(shí),棧所用的內(nèi)存能夠自動快速地被回收,開發(fā)者不用干預(yù),省心省力。如果棧頂?shù)臄?shù)據(jù)需要以某種格式被保存起來,那么在程序結(jié)束前,此數(shù)據(jù)必須被復(fù)制到其他位置,不然就會被彈出棧而丟失。因此,基于棧的內(nèi)存分配法適用于那些只需暫時(shí)數(shù)據(jù)的保存情況。
操作系統(tǒng)給線程分配的??赡軆H為幾個(gè)KB的大小。如果分配的棧內(nèi)存過大,超過了線程實(shí)際需要,這可能導(dǎo)致棧溢出(stack overflow),以致系統(tǒng)崩潰。
x86處理器系列對線程棧的管理有特殊的指令。其他處理器系列(包括PowerPC和MIP)則沒有這種支持。
堆棧段、數(shù)據(jù)段與代碼段堆棧段通常是指采用堆棧方式工作的一段內(nèi)存區(qū)域。
在采用段式內(nèi)存管理的架構(gòu)中,數(shù)據(jù)段通常是指用來存放程序中已初始化且不為0的全局變量的一塊內(nèi)存區(qū)域。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配。
代碼段通常是指用來存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。這部分區(qū)域的大小在程序運(yùn)行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀, 某些架構(gòu)也允許代碼段為可寫,即允許程序自修改(self-modifying code)。 在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。
操作系統(tǒng)在裝載一個(gè)程序時(shí)會進(jìn)行進(jìn)程地址空間的分段,而代碼段通常處于最底部,即最低地址部分,而堆和棧在高處,所以在允許代碼段可寫的架構(gòu)上,當(dāng)堆或棧內(nèi)存溢出時(shí),代碼段中的數(shù)據(jù)就會開始被覆蓋。
本詞條內(nèi)容貢獻(xiàn)者為:
李嘉騫 - 博士 - 同濟(jì)大學(xué)