【從零開始學習計算機科學】編譯原理(七)運行時刻環境
- 運行時刻環境
- 存儲組織
- 空間的棧式分配
- 活動樹
- 活動記錄和控制棧
- 簡單棧式存貯分配
- C語言的過程調用和過程返回時的存貯管理
- 堆式存儲分配
- 堆式存儲分配的功能
- 垃圾回收
- 基于跟蹤的垃圾回收
- 短停頓垃圾回收
運行時刻環境
存儲組織
目標程序在它自己的邏輯地址空間內運行,程序中的代碼和數據都在這個空間中有一個具體的地址。目標程序在邏輯地址空間的運行時刻映像包括:
- 代碼區,存儲目標代碼。目標代碼的大小在編譯時刻就已經確定,編譯器將可執行的目標代碼放在一個靜態確定的區域。
- 數據區,具體分為靜態數據區、棧區和堆區。
- 靜態數據區:程序的某些數據對象的大小可在編譯時刻知道,它們可被放置在靜態數據區。
- 棧區和堆區:動態數據區,其大小會隨著程序運行而改變。
棧區存放為運行函數而分配的局部變量、函數參數、返回數據等,函數運行時分配,函數結束時釋放。分配方式類似于數據結構中的棧。棧區是一塊連續的內存區域;棧區內存通常大小有限,一般不超過8MB;向棧區申請的內存過大時會導致棧溢出。
堆區存放具有更靈活的生命周期的數據,支持手動分配和回收數據對象。分配方式類似于數據結構中的鏈表。其使用不連續的內存區域;32位計算機堆的大小最大可為4GB;若不釋放分配的內存會造成內存泄露。
空間的棧式分配
活動樹
我們可以用一棵樹來描繪控制進入和離開活動的途徑,這樣的樹稱作活動樹。在一棵活動樹中:每一個結點代表一個過程的活動;根結點代表主程序的活動(如main函數);代表