2018年7月7日 星期六

程式執行時的記憶體模型

程式運行時,作業系統會配置一塊記憶體給他使用。
這塊記憶體存放程式執行時的變數及各項資料。
這塊記憶的配置,是由程式所控制的。
記憶體的配置模型可分為三種,global、stack、heap。
程式執行時的記憶體需求,依據不同類型,配置在不同記憶體中。

其中heap是從該記憶體的最高位址開始配置。
stack是從最低位址開始配置。


global

程式中的全域變數或是static變數,配置在這個區域。
程式運行中,這些變數永遠存在,也就是記憶體都在使用,不會回收。

stack 堆疊/棧

生命週期可被預期的變數或是函數資料,配置在這個區域。
因為可以預期,所以這些記憶體可被系統自動管理,
不再使用時,系統自動回收。

常見的資料有:
區域變數
函數的參數
函數的返回地址

後進先出原則

等整個function執行結束,
整個stack都釋放了。

配置方式

stack使用是分次分配的,
每分配一個稱為一個frame。
從底位址往高位址一個一個分配,
後分配的(push )進去的會先釋放。
也就是後進先出。
取出稱為pop。
也因為後進先出、一層一層疊加的特性,
所以記憶體是從低位址開始使用,較為合理。

heap 堆

程式執行時才動態產生,
無法預期何時產生、數量多少、何時回收,
這些資料則配置在heap區域。
或是使用者要求,例如使用malloc函數。
這時記憶體就要由使用者自行回收,
或是由語言的Garbage Collection機制回收。

若回收不完全,就會產生out of memory的錯誤,
導致系統記憶體越用越少。

配置方式

每次配置一塊記憶體,每塊記憶體之間各自獨立。
從低位址往高位址配置
href="http://http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html">參考

沒有留言:

張貼留言