版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 運行時的存儲組織與分配,,要求明確靜態(tài)存儲分配和動態(tài)存儲分配的含義明確活動記錄的含義及組成掌握C/C++和JAVA的存儲分配策略掌握PL/0的存儲分配策略,教學(xué)目標(biāo),S.P,O.P,編譯程序在編譯階段要為源程序中出現(xiàn)的變量、常量等組織好在運行階段的存儲空間將這種組織形式通過生成的目標(biāo)代碼體現(xiàn)出來為運行階段實現(xiàn)存儲奠定基礎(chǔ),7.1 存儲組織概述7.2 靜態(tài)存儲分配7.3 棧式動態(tài)存儲分配7.4 堆式動態(tài)存儲分配7
2、.5 PL/0編譯程序目標(biāo)代碼解釋執(zhí)行時的存儲分配,教學(xué)內(nèi)容,7.1 存儲組織概述,,運行時存儲空間的劃分,代碼空間,數(shù)據(jù)空間,,過程的活動和活動記錄,,活動記錄的結(jié)構(gòu),7.2 靜態(tài)存儲分配,,在編譯階段由編譯程序?qū)崿F(xiàn)對存儲空間的管理,為源程序中的變量分配存儲單元。(如看電影),,FORTRAN程序的靜態(tài)分配,動態(tài)存儲分配,在目標(biāo)程序運行階段由目標(biāo)程序?qū)崿F(xiàn)對存儲空間的組織與管理,為源程序中的變量分配存儲單元,特點,在目標(biāo)程序運行時進(jìn)
3、行分配 編譯時為運行階段設(shè)計好存儲組織形式,即為每個數(shù)據(jù)項安排好它在數(shù)據(jù)區(qū)中的相對位置,(如開大會),7.3 棧式動態(tài)存儲分配,,變量生存期具有嵌套特性,即后進(jìn)先出的特性(如遞歸)進(jìn)入時:在棧頂為其分配一個數(shù)據(jù)區(qū)退出時:撤消過程數(shù)據(jù)區(qū),練習(xí),下面程序的運行結(jié)果是什么?如果把第6行的(i+1)*fact( )改成fact( )*(i+1)的話,則程序的運行結(jié)果是有什么變化?試分析為什么會有這兩種不同的結(jié)果。,int fact( )
4、{ static int i=5; if(i==0) return 1; else { i--; return((i+1)*fact( )); //第6行 }}main( ){ printf("factor of 5!=%d\n",fact());},7.4 堆式動態(tài)存儲分配,,變量生存期具有隨機(jī)交叉特性,即非后進(jìn)先出的特性(如程序運行時動態(tài)申請存儲空間)
5、給運行的程序劃分一個大的存儲區(qū)(稱為堆)每當(dāng)需要時可從堆中分得一塊用完之后再退還給堆,C/C++三種不同內(nèi)存分配策略比較,程序運行前,有些編程語言(C++)編寫的程序會直接向操作系統(tǒng)請求內(nèi)存,但 Java 并不支持那么做這樣做的一個重要優(yōu)點是保證了程序的平臺無關(guān)性Java是由 JVM 完成申請內(nèi)存的操作當(dāng)程序準(zhǔn)備執(zhí)行時,由JVM 向操作系統(tǒng)請求一定的內(nèi)存空間,稱為初始內(nèi)存空間程序執(zhí)行過程中所需的內(nèi)存都由Java 虛擬機(jī)從這片
6、內(nèi)存空間中劃分。,Java內(nèi)存分配策略,程序運行前:,Java內(nèi)存分配策略,程序運行中:,Java內(nèi)存分配策略,(1)方法區(qū):類的結(jié)構(gòu)、靜態(tài)成員(2)堆:對象屬性的值(3)棧:變量(包括基本類型和引用類型),Java內(nèi)存分配策略,方法區(qū),堆,棧,(1)方法區(qū):類結(jié)構(gòu)(屬性和方法)、靜態(tài)成員,(2)堆:對象屬性的值,(3)棧:變量(基本類型變量和引用類型變量),與C/C++不同,Java中所有對象的存儲空間都是在堆中分配的,但是這個對
7、象的引用卻是在棧中分配也就是說在建立一個對象時從兩個地方都分配內(nèi)存,在堆中分配的內(nèi)存實際建立這個對象,而在棧中分配的內(nèi)存只是一個指向這個堆對象的引用,生成了2部分的內(nèi)存區(qū)域:1)stu1這個引用變量,是方法內(nèi)的變量,放到棧里2) 真正Student類的實例對象,放到堆里方法結(jié)束后,對應(yīng)棧中的變量馬上回收,但是堆中的對象要等到GC來回收,例如:Student stu1=new Student( );,自動垃圾回收器,Garba
8、ge Collector(GC),清除內(nèi)存垃圾保障堆的內(nèi)存分配和其他語言中棧的內(nèi)存分配一樣快,在棧(也有可能在靜態(tài)存儲區(qū))找到一個對象的引用,GC將它從堆的一個塊中移到另外塊中,并將它們一個挨一個的排列起來, 模擬出了一個棧的結(jié)構(gòu),但不是先進(jìn)后出的分配,而是可以任意分配的,總結(jié):JAVA三種不同內(nèi)存分配策略比較,(1)方法區(qū):存放類的結(jié)構(gòu)(包括類的屬性和方法)及靜態(tài)成員(2)堆:存放所有類的實例(即對象屬性的值)及數(shù)組(3)棧:存
9、放變量(包括基本類型和引用類型),JVM為每個新創(chuàng)建的線程都分配一個棧,棧以幀(活動記錄)為單位保存線程的狀態(tài),當(dāng)線程激活一個Java方法,JVM就會在棧里新壓入一個幀,存放局部變量、方法出口等,方法結(jié)束后從棧里彈出一個幀。,,.NET 框架,,,VB 應(yīng)用程序,,Visual C# 應(yīng)用程序,,Visual C++ 應(yīng)用程序,,.NET 架構(gòu)代碼,.NET 框架,類庫,,Windows,,,XML Web service,ADO.N
10、ET,CLR,,,,,源代碼編譯成 MSIL代碼,編程服務(wù),JIT 編譯器 生成本機(jī)代碼,,數(shù)據(jù)類型,,CLR的產(chǎn)生,Windows DNA有很多開發(fā)語言每種語言都有自己的運行庫 是否有:“可以被多種語言共用”的通用環(huán)境,有,這就是CLR!,托管代碼與非托管代碼,托管代碼(Managed Code)以CLR為目標(biāo)的代碼 非托管代碼 以“操作系統(tǒng)”為目標(biāo),即時編譯,微軟中間語言 Microsoft Intermediate
11、 Language,MSIL即時編譯Just-in-time Compilation, JITCLR就相當(dāng)于Java語言的虛擬機(jī),編譯和執(zhí)行,源代碼,,編譯,在安裝或函數(shù)/方法第一次被調(diào)用時,中間代碼,元數(shù)據(jù)(Metadata),.NET內(nèi)存分配機(jī)制(托管和非托管),,,CLR 執(zhí)行模型,VB,源代碼,Compiler,C++,C#,Compiler,Compiler,AssemblyIL Code,AssemblyIL Co
12、de,AssemblyIL Code,操作系統(tǒng)服務(wù),公共語言運行時,,,,即時編譯器JIT Compiler,二進(jìn)制代碼,管理代碼Managedcode,,,,,UnmanagedComponent,,,.NET托管資源內(nèi)存分配機(jī)制,靜態(tài)分配,棧式動態(tài)分配,堆式動態(tài)分配,取決于該變量的數(shù)據(jù)類型,,.NET數(shù)據(jù)類型,.NET托管資源內(nèi)存分配機(jī)制,如果該值類型的實例作為類型中的方法(Method)中的局部變量,則該實例被創(chuàng)建在線程棧
13、上; 如果該值類型的實例作為類型的成員,則該實例作為引用類型(引用類型在GC堆或者LOH上創(chuàng)建)的實例的一部分,被創(chuàng)建在GC堆上。,值類型,public class Test1 { private int i; //上面(2)中的情況,生成Test的實例的同時,int類型
14、的實例i被創(chuàng)建在GC堆上 public Test1() { byte b =0; //(1)中的情況,byte類型
15、的實例b被創(chuàng)建在執(zhí)行這段代碼的線程棧上 } },值類型分配示例,.NET托管資源內(nèi)存分配機(jī)制,如果該引用類型的實例的Size=85000byte,則該實例被創(chuàng)建在LOH(Large Object Heap)上(LOH不會被壓縮)。,引用類型,public class Test2 {
16、; private int[] intArr; public Test2() {
17、;private Object o = new Object(); //引用o存在線程棧上,它指向GC堆上的Object實例 intArr = new int[21250]; //符合(
18、2)中的Size條件,int數(shù)組的實例被創(chuàng)建在LOH上 } },引用類型分配示例,7.5 PL/0目標(biāo)代碼解釋執(zhí)行時的存儲分配,,,i,指令寄存器,b,基本地址寄存器,t,地址寄存器,p,程序地址寄存器,pcode解釋器的結(jié)構(gòu),保存目標(biāo)代碼,執(zhí)行時的數(shù)據(jù)棧,(1)程序存儲器codestruct instruction{ enum
19、 fct f ; int l; int a;};struct instruction code[CXMAX+1];,(2)數(shù)據(jù)存儲器sint s[STACKSIZE];在調(diào)用一個過程時,先要在數(shù)據(jù)棧頂為過程及其變量分配一些位置。所有操作運算都在棧頂找到它的操作數(shù),并以計算結(jié)果代之。棧頂數(shù)據(jù)元素在數(shù)據(jù)棧的位置通過地址寄存器t標(biāo)記。,(3)程序地址寄存器pint p=0;p是code數(shù)組的索引地址,用來存放下一
20、條要解釋執(zhí)行指令在程序存儲器code里的位置。在解釋執(zhí)行時才用到,初值為0,即第1條要解釋執(zhí)行的指令存放在code[0]。,(4)地址寄存器tint t=0;地址寄存器t是s數(shù)組的索引地址,由于數(shù)據(jù)存儲器被當(dāng)作數(shù)據(jù)棧使用,它用來存放數(shù)據(jù)棧s的棧頂位置。在解釋執(zhí)行時才用到,初值為0,在解釋執(zhí)行前,數(shù)據(jù)棧是空棧。。,(5)指令寄存器istruct instruction i;用來存放正在解釋執(zhí)行的一條目標(biāo)代碼指令。在解釋程序里,每次
21、通過i=code[p];和p=p+1;這兩條賦值語句,完成從程序存儲器code中取指令,以及使程序地址寄存器p指向下一條指令位置的任務(wù)。,(6)基本地址寄存器bint b=1;在解釋執(zhí)行時用到,初值為1,它等于正在執(zhí)行的過程段在數(shù)據(jù)棧的起始地址。,活動記錄,連接數(shù)據(jù)(也稱聯(lián)系單元),局部數(shù)據(jù)區(qū),,,,靜態(tài)鏈動態(tài)鏈返回地址,三個聯(lián)系單元:SL:靜態(tài)鏈,指向定義該過程的直接外層過程的活動記錄的基地址,以確保變量的正確存取。DL:
22、動態(tài)鏈,指向調(diào)用該過程前正在運行的那個過程的活動記錄的基地址,以確保能返回到調(diào)用過程段。RA:返回地址,保存該被調(diào)過程返回后的地址,即當(dāng)時程序的地址寄存器p的值,也就是調(diào)用過程指令的下一條指令的地址,用來確保返回到正確的指令地址。,,以下兩條指令協(xié)助cal完成過程調(diào)用和返回ini 0 a過程目標(biāo)程序的入口,開辟數(shù)據(jù)段。a為局部變量個數(shù)+3。開辟數(shù)據(jù)段的結(jié)果是改變棧頂寄存器t的值,即t=t+a。 在block中調(diào)用stateme
23、nt之前調(diào)用gen(ini,0,dx);opr 0 0過程目標(biāo)程序的出口,釋放數(shù)據(jù)段。恢復(fù)調(diào)用該過程前正在運行的過程的數(shù)據(jù)段基地址寄存器的值和棧頂寄存器的值,并將返回地址送到地址寄存器p中,以使調(diào)用前的程序從斷點開始繼續(xù)執(zhí)行。 在block中調(diào)用statement之后調(diào)用gen(opr,0,0);,小結(jié),重點掌握:靜態(tài)存儲分配(Fortran)和動態(tài)存儲分配(C、Pascal)的含義活動記錄的含義及組成掌握C/C++和JA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理 第十章 目標(biāo)程序運行時的存儲組織
- STL運行時concept的研究與實現(xiàn).pdf
- 復(fù)雜物流系統(tǒng)仿真運行時間分配問題研究.pdf
- 葉輪運行時葉片載荷分析
- 人體經(jīng)絡(luò)運行時間與生理系統(tǒng)的反應(yīng)
- 組態(tài)監(jiān)控軟件的WEB運行時.pdf
- microsoftvbscript運行時錯誤代碼大全
- 實時系統(tǒng)的運行時驗證研究.pdf
- 電動機(jī)運行時的防火
- 《衛(wèi)星運行時間》教學(xué)設(shè)計
- 人體經(jīng)絡(luò)運行時間表
- 衛(wèi)星運行時間教學(xué)設(shè)計
- 衛(wèi)星運行時間說課稿(定)
- 軟件行為運行時驗證研究.pdf
- 服務(wù)系統(tǒng)運行時質(zhì)量監(jiān)控與評價方法.pdf
- 參數(shù)化運行時驗證研究與工具實現(xiàn).pdf
- 銅陵學(xué)院班車運行時間調(diào)整表
- flash顯示系統(tǒng)時間和運行時間
- 臨汾公交線路及運行時間
- 基于運行時的程序執(zhí)行模型研究.pdf
評論
0/150
提交評論