編譯原理學習之執行時資料區的管理

2021-07-05 10:28:30 字數 1859 閱讀 8177

•在編譯時就可以完全為資料專案分配儲存單元,稱為靜態儲存分配。

•注:若乙個程式語言不允許遞迴呼叫,而且不含有可變陣列,則可使用靜態儲存分配策略。

•在執行時才能進行資料儲存單元分配,稱為動態儲存分配。

•注:

1)若某程式語言允許過程遞迴呼叫,而且允許使用可變陣列,那麼在編譯時就不可能完全為其資料專案分配儲存單元,必須採取動態儲存分配策略。

•2)動態分配資料單元時一般使用:

–棧式儲存分配

–堆式儲存分配

(1)棧式儲存分配

•執行時,每進入乙個過程,就在棧頂為該過程分配一塊資料區,一旦退出該過程,它所佔的空間也退還給系統。

(2)堆式儲存分配

•有些語言允許使用者隨時動態地申請和釋放儲存空間,但申請和釋放之間不遵守先申請後釋放或後申請先釋放原則,故不能使用棧式儲存分配,而是更複雜的動態分配策略。

•這種策略是:讓執行程式持有乙個大的存區(堆),在申請時從堆中取一塊,釋放時將一塊儲存區退還給堆。

•1、語言特點

允許過程(函式)的遞迴呼叫,但不允許定義巢狀的過程(乙個函式在裡乙個函式裡面定義),也不許使用可變陣列。如c語言

c語言的活動記錄所含區段是:連線資料(包含老sp值(即前一活動記錄的首位址;或稱施調過程的資料區首位址)和返回位址(即呼叫語句的下一條指令的位址))、引數(形參)個數、形式單元(存放實參值或位址)、過程的區域性變數(簡單變數)、陣列內情變數(陣列)和臨時工作單元(臨時變數)。

1、語言特點

既允許過程巢狀,也允許過程遞迴呼叫。

2、儲存管理方式

1)根據巢狀過程語言的規定,由變數的最小作用域原則,乙個過程可以引用包圍它的任意外層過程所定義的變數和陣列。所以,執行時過程必須知道它所有直系外層過程的最新活動記錄的位址。

2)由於允許遞迴,過程活動記錄的位置是動態變化的。因此,每個活動記錄中必須設法記住直系外層的最新活動記錄的位置,以處理遞迴。

物件:

–在高階語言中有些資料儲存空間的請求與釋放不再遵循後進先出的原則,而且是全域性性的。

•對策:

–讓執行程式持有一塊專用的全域性儲存空間來滿足這些資料的儲存要求。這種儲存空間就叫「堆」(heap)。

–堆通常是一片連續的足夠大的儲存區,當需要時,就從堆中分配一小塊儲存區;用完就及時退還給堆

1、固定長塊管理

•方法:

–把堆空間分成許多固定長的塊,每塊的第乙個字用作指示器,將所有未用塊鏈結起來,形成一張可利用表。

–當堆管理程式收到請求分配空間時,就查詢該錶,並將一塊空白塊的首指示器送給申請者,然後修改此表。

2、可變長塊管理

•申請分配空間時,堆管理程式從可利用表中查到乙個未用塊,若該塊大於所需空間,就將它分成兩部分,等於申請空間的一部分和剩餘部分;這樣下去留在可利用表中的塊越來越小,最後形成無法用的外部碎片。

•若查到的塊只比申請空間大一點,就不再分開,整個給申請者使用,此塊中用不到的那部分也無法給別人用,就是內部碎片。

•注:這兩種碎片很多時,碎片的總和大於申請空間,但無法分配給申請者。故可變長塊管理主要考慮如何減少碎片的影響。

3、按塊長不同分為若干集合

•方法:把整個堆空間分為若干集合,每個集合中塊長是相等的,並把它們鏈結在一起。當申請m個長度為n的塊時,就到塊長為n或稍大於n的集合中去查詢可利用塊。若該集合中由m個這樣的塊,則滿足申請;若沒有m個,則從塊長較大的集合中取一塊或多塊,把它們分成相等的兩塊然後再分配。

•注:優點:減少搜尋時間,容易實現塊合併;

•缺點:會使內部碎片增加。

宣告:

以上內容引自東南大學編譯原理課件

執行時資料區

按理說,在介紹完前端編譯器之後,我們應該介紹如何讓 jvm 去解釋執行 這個編譯後的 class 檔案。但是感覺並不是很恰當。如果把 class 檔案比做新購買的家具,那麼如果需要把家具擺放到家裡,是不是得先了解房子的結構和布局,然後才能將家具進行正確的擺放。我們這裡介紹的 執行時資料區 相當於前面...

JVM執行時資料區

根據 jvm 規範,jvm 記憶體共分為虛擬機器棧 堆 方法區 程式計數器 本地方法棧五個部分。記憶體空間 runtime data area 中可以按照是否執行緒共享分為兩塊,執行緒共享的是方法區 method area 和堆 heap 執行緒獨享的是虛擬機器棧 vm stack 本地方法棧 na...

JVM 執行時資料區

jdk版本 8 class檔案 class content class物件 物件 的含義 class檔案 儲存在磁碟上的.class檔案 十六進製制位元組碼檔案 class content 類載入器子系統載入class檔案,儲存到記憶體中的位元組流,解析前這塊記憶體區域叫class content ...