版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章運(yùn)行時(shí)的存儲(chǔ)組織與分配要求明確靜態(tài)存儲(chǔ)分配和動(dòng)態(tài)存儲(chǔ)分配的含義明確活動(dòng)記錄的含義及組成掌握C/C++和JAVA的存儲(chǔ)分配策略掌握PL/0的存儲(chǔ)分配策略教學(xué)目標(biāo)S.PO.P語義分析、生成中間代碼生成目標(biāo)程序代碼優(yōu)化語法分析程序詞法分析程序錯(cuò)誤處理符號(hào)表管理編譯程序在編譯階段要為源程序中出現(xiàn)的變量、常量等組織好在運(yùn)行階段的存儲(chǔ)空間將這種組織形式通過生成的目標(biāo)代碼體現(xiàn)出來為運(yùn)行階段實(shí)現(xiàn)存儲(chǔ)奠定基礎(chǔ)7.1存儲(chǔ)組織概述7.2靜態(tài)存儲(chǔ)分配7.3棧式動(dòng)態(tài)存儲(chǔ)分配7.4堆式動(dòng)態(tài)存儲(chǔ)分配7.5PL/0編譯程序目標(biāo)代碼解釋執(zhí)行時(shí)的存儲(chǔ)分配教學(xué)內(nèi)容7.1存儲(chǔ)組織概述運(yùn)行時(shí)存儲(chǔ)空間的劃分代碼空間數(shù)據(jù)空間目標(biāo)代碼空間靜態(tài)數(shù)據(jù)空間棧自由空間
堆過程的活動(dòng)和活動(dòng)記錄一個(gè)過程的活動(dòng):該過程的一次執(zhí)行。即每次執(zhí)行一個(gè)過程體,就產(chǎn)生該過程的一個(gè)活動(dòng)?;顒?dòng)記錄:為了管理過程在一次執(zhí)行中所需要的信息,使用一段連續(xù)的存儲(chǔ)區(qū)活動(dòng)記錄的結(jié)構(gòu)7.2靜態(tài)存儲(chǔ)分配
在編譯階段由編譯程序?qū)崿F(xiàn)對(duì)存儲(chǔ)空間的管理,為源程序中的變量分配存儲(chǔ)單元。(如看電影)條件在編譯時(shí)能夠確定變量在運(yùn)行時(shí)的數(shù)據(jù)空間大小運(yùn)行時(shí)不改變FORTRAN程序的靜態(tài)分配動(dòng)態(tài)存儲(chǔ)分配
在目標(biāo)程序運(yùn)行階段由目標(biāo)程序?qū)崿F(xiàn)對(duì)存儲(chǔ)空間的組織與管理,為源程序中的變量分配存儲(chǔ)單元特點(diǎn)
在目標(biāo)程序運(yùn)行時(shí)進(jìn)行分配編譯時(shí)為運(yùn)行階段設(shè)計(jì)好存儲(chǔ)組織形式,即為每個(gè)數(shù)據(jù)項(xiàng)安排好它在數(shù)據(jù)區(qū)中的相對(duì)位置C語言引用sizeof進(jìn)行計(jì)算時(shí),是在編譯階段完成的,還是在運(yùn)行階段完成的?(如開大會(huì))7.3棧式動(dòng)態(tài)存儲(chǔ)分配變量生存期具有嵌套特性,即后進(jìn)先出的特性(如遞歸)進(jìn)入時(shí):在棧頂為其分配一個(gè)數(shù)據(jù)區(qū)退出時(shí):撤消過程數(shù)據(jù)區(qū)練習(xí)下面程序的運(yùn)行結(jié)果是什么?如果把第6行的(i+1)*fact()改成fact()*(i+1)的話,則程序的運(yùn)行結(jié)果是有什么變化?試分析為什么會(huì)有這兩種不同的結(jié)果。intfact(){staticinti=5;if(i==0)return1;else{i--;return((i+1)*fact());//第6行
}}main(){printf("factorof5!=%d\n",fact());}7.4堆式動(dòng)態(tài)存儲(chǔ)分配變量生存期具有隨機(jī)交叉特性,即非后進(jìn)先出的特性(如程序運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng)存儲(chǔ)空間)給運(yùn)行的程序劃分一個(gè)大的存儲(chǔ)區(qū)(稱為堆)每當(dāng)需要時(shí)可從堆中分得一塊用完之后再退還給堆C/C++三種不同內(nèi)存分配策略比較程序運(yùn)行前,有些編程語言(C++)編寫的程序會(huì)直接向操作系統(tǒng)請(qǐng)求內(nèi)存,但Java并不支持那么做這樣做的一個(gè)重要優(yōu)點(diǎn)是保證了程序的平臺(tái)無關(guān)性Java是由
JVM完成申請(qǐng)內(nèi)存的操作當(dāng)程序準(zhǔn)備執(zhí)行時(shí),由JVM向操作系統(tǒng)請(qǐng)求一定的內(nèi)存空間,稱為初始內(nèi)存空間程序執(zhí)行過程中所需的內(nèi)存都由Java虛擬機(jī)從這片內(nèi)存空間中劃分。Java內(nèi)存分配策略程序運(yùn)行前:Java內(nèi)存分配策略程序運(yùn)行中:Java內(nèi)存分配策略(1)方法區(qū):類的結(jié)構(gòu)、靜態(tài)成員(2)堆:對(duì)象屬性的值(3)棧:變量(包括基本類型和引用類型)Java內(nèi)存分配策略方法區(qū)堆棧(1)方法區(qū):類結(jié)構(gòu)(屬性和方法)、靜態(tài)成員(2)堆:對(duì)象屬性的值(3)棧:變量(基本類型變量和引用類型變量)與C/C++不同,Java中所有對(duì)象的存儲(chǔ)空間都是在堆中分配的,但是這個(gè)對(duì)象的引用卻是在棧中分配也就是說在建立一個(gè)對(duì)象時(shí)從兩個(gè)地方都分配內(nèi)存,在堆中分配的內(nèi)存實(shí)際建立這個(gè)對(duì)象,而在棧中分配的內(nèi)存只是一個(gè)指向這個(gè)堆對(duì)象的引用生成了2部分的內(nèi)存區(qū)域:1)stu1這個(gè)引用變量,是方法內(nèi)的變量,放到棧里2)真正Student類的實(shí)例對(duì)象,放到堆里方法結(jié)束后,對(duì)應(yīng)棧中的變量馬上回收,但是堆中的對(duì)象要等到GC來回收例如:Studentstu1=newStudent();自動(dòng)垃圾回收器
GarbageCollector(GC)
清除內(nèi)存垃圾保障堆的內(nèi)存分配和其他語言中棧的內(nèi)存分配一樣快
在棧(也有可能在靜態(tài)存儲(chǔ)區(qū))找到一個(gè)對(duì)象的引用,GC將它從堆的一個(gè)塊中移到另外塊中,并將它們一個(gè)挨一個(gè)的排列起來,模擬出了一個(gè)棧的結(jié)構(gòu),但不是先進(jìn)后出的分配,而是可以任意分配的總結(jié):JAVA三種不同內(nèi)存分配策略比較(1)方法區(qū):存放類的結(jié)構(gòu)(包括類的屬性和方法)及靜態(tài)成員(2)堆:存放所有類的實(shí)例(即對(duì)象屬性的值)及數(shù)組(3)棧:存放變量(包括基本類型和引用類型),JVM為每個(gè)新創(chuàng)建的線程都分配一個(gè)棧,棧以幀(活動(dòng)記錄)為單位保存線程的狀態(tài),當(dāng)線程激活一個(gè)Java方法,JVM就會(huì)在棧里新壓入一個(gè)幀,存放局部變量、方法出口等,方法結(jié)束后從棧里彈出一個(gè)幀。.NET框架VB應(yīng)用程序VisualC#應(yīng)用程序VisualC++應(yīng)用程序.NET架構(gòu)代碼.NET框架類庫(kù)WindowsXMLWebserviceADO.NETCLR源代碼編譯成MSIL代碼編程服務(wù)JIT編譯器
生成本機(jī)代碼數(shù)據(jù)類型CLR的產(chǎn)生WindowsDNA有很多開發(fā)語言每種語言都有自己的運(yùn)行庫(kù)是否有:“可以被多種語言共用”的通用環(huán)境有,這就是CLR!托管代碼與非托管代碼托管代碼(ManagedCode)以CLR為目標(biāo)的代碼非托管代碼以“操作系統(tǒng)”為目標(biāo)即時(shí)編譯微軟中間語言MicrosoftIntermediateLanguage,MSIL即時(shí)編譯Just-in-timeCompilation,JITCLR就相當(dāng)于Java語言的虛擬機(jī)MSIL編譯和執(zhí)行源代碼語言編譯編譯在安裝或函數(shù)/方法第一次被調(diào)用時(shí)執(zhí)行即時(shí)編譯(JITCompiler)二進(jìn)制代碼(NativeCode)中間代碼元數(shù)據(jù)(Metadata).NET內(nèi)存分配機(jī)制(托管和非托管)CLR執(zhí)行模型VB源代碼CompilerC++C#CompilerCompilerAssemblyILCodeAssemblyILCodeAssemblyILCode操作系統(tǒng)服務(wù)公共語言運(yùn)行時(shí)即時(shí)編譯器JITCompiler二進(jìn)制代碼管理代碼ManagedcodeUnmanagedComponent.NET托管資源內(nèi)存分配機(jī)制靜態(tài)分配棧式動(dòng)態(tài)分配堆式動(dòng)態(tài)分配取決于該變量的數(shù)據(jù)類型.NET數(shù)據(jù)類型.NET托管資源內(nèi)存分配機(jī)制如果該值類型的實(shí)例作為類型中的方法(Method)中的局部變量,則該實(shí)例被創(chuàng)建在線程棧上;如果該值類型的實(shí)例作為類型的成員,則該實(shí)例作為引用類型(引用類型在GC堆或者LOH上創(chuàng)建)的實(shí)例的一部分,被創(chuàng)建在GC堆上。
值類型public
class
Test1
{
private
int
i;
//上面(2)中的情況,生成Test的實(shí)例的同時(shí),int類型的實(shí)例i被創(chuàng)建在GC堆上
public
Test1()
{
byte
b
=0;
//(1)中的情況,byte類型的實(shí)例b被創(chuàng)建在執(zhí)行這段代碼的線程棧上
}
}
值類型分配示例.NET托管資源內(nèi)存分配機(jī)制如果該引用類型的實(shí)例的Size<85000Byte,則該實(shí)例被創(chuàng)建在GC(GarbageCollection)堆上(當(dāng)CLR在分配和回收對(duì)象時(shí),GC可能會(huì)對(duì)GC堆進(jìn)行壓縮);如果該引用類型的實(shí)例的Size>=85000byte,則該實(shí)例被創(chuàng)建在LOH(LargeObjectHeap)上(LOH不會(huì)被壓縮)。
引用類型public
class
Test2
{
private
int[]
intArr;
public
Test2()
{
private
Object
o
=
new
Object();
//引用o存在線程棧上,它指向GC堆上的Object實(shí)例
intArr
=
new
int[21250];
//符合(2)中的Size條件,int數(shù)組的實(shí)例被創(chuàng)建在LOH上
}
}
引用類型分配示例7.5
PL/0目標(biāo)代碼解釋執(zhí)行時(shí)的存儲(chǔ)分配code程序存儲(chǔ)器s數(shù)據(jù)存儲(chǔ)器i指令寄存器b基本地址寄存器t地址寄存器p程序地址寄存器pcode解釋器的結(jié)構(gòu)保存目標(biāo)代碼執(zhí)行時(shí)的數(shù)據(jù)棧(1)程序存儲(chǔ)器codestructinstruction{enumfctf;intl;inta;};structinstructioncode[CXMAX+1];(2)數(shù)據(jù)存儲(chǔ)器sints[STACKSIZE];在調(diào)用一個(gè)過程時(shí),先要在數(shù)據(jù)棧頂為過程及其變量分配一些位置。所有操作運(yùn)算都在棧頂找到它的操作數(shù),并以計(jì)算結(jié)果代之。棧頂數(shù)據(jù)元素在數(shù)據(jù)棧的位置通過地址寄存器t標(biāo)記。
(3)程序地址寄存器pintp=0;p是code數(shù)組的索引地址,用來存放下一條要解釋執(zhí)行指令在程序存儲(chǔ)器code里的位置。在解釋執(zhí)行時(shí)才用到,初值為0,即第1條要解釋執(zhí)行的指令存放在code[0]。(4)地址寄存器tintt=0;地址寄存器t是s數(shù)組的索引地址,由于數(shù)據(jù)存儲(chǔ)器被當(dāng)作數(shù)據(jù)棧使用,它用來存放數(shù)據(jù)棧s的棧頂位置。在解釋執(zhí)行時(shí)才用到,初值為0,在解釋執(zhí)行前,數(shù)據(jù)棧是空棧。。(5)指令寄存器istructinstructioni;用來存放正在解釋執(zhí)行的一條目標(biāo)代碼指令。在解釋程序里,每次通過i=code[p];和p=p+1;這兩條賦值語句,完成從程序存儲(chǔ)器code中取指令,以及使程序地址寄存器p指向下一條指令位置的任務(wù)。(6)基本地址寄存器bintb=1;在解釋執(zhí)行時(shí)用到,初值為1,它等于正在執(zhí)行的過程段在數(shù)據(jù)棧的起始地址?;顒?dòng)記錄連接數(shù)據(jù)(也稱聯(lián)系單元)局部數(shù)據(jù)區(qū)靜態(tài)鏈動(dòng)態(tài)鏈返回地址三個(gè)聯(lián)系單元:SL:靜態(tài)鏈,指向定義該過程的直接外層過程的活動(dòng)記錄的基地址,以確保變量的正確存取。DL:動(dòng)態(tài)鏈,指向調(diào)用該過程前正在運(yùn)行的那個(gè)過程的活動(dòng)記錄的基地址,以確保能返回到調(diào)用過程段。RA:返回地址,保存該被調(diào)過程返回后的地址,即當(dāng)時(shí)程序的地址寄存器p的值,也就是調(diào)用過程指令的下一條指令的地址,用來確保返回到正確的指令地址。以下兩條指令協(xié)助cal完成過程調(diào)用和返回ini0a
過程目標(biāo)程序的入口,開辟數(shù)據(jù)段。a為局部變量個(gè)數(shù)+3。開辟數(shù)據(jù)段的結(jié)果是改變棧頂寄存器t的值,即t=t+a。在block中調(diào)用statement之
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 總工施工方案編制(3篇)
- 施工方案-頂管(3篇)
- 大型剪發(fā)活動(dòng)方案策劃(3篇)
- 小班秋游活動(dòng)策劃方案(3篇)
- 企業(yè)采購(gòu)與招標(biāo)投標(biāo)手冊(cè)(標(biāo)準(zhǔn)版)
- 2025年大學(xué)車輛工程(汽車法規(guī))試題及答案
- 2025年大學(xué)大三(酒店管理)酒店餐飲管理試題及答案
- 2025年中職(烹飪工藝與營(yíng)養(yǎng))冷菜制作綜合測(cè)試題及答案
- 2025年高職種子科學(xué)與工程(種子科學(xué)與工程)試題及答案
- 2025年大學(xué)短視頻應(yīng)用(應(yīng)用技術(shù))試題及答案
- GB/T 18457-2024制造醫(yī)療器械用不銹鋼針管要求和試驗(yàn)方法
- 電信營(yíng)業(yè)廳運(yùn)營(yíng)方案策劃書(2篇)
- 手機(jī)維修單完整版本
- 流感防治知識(shí)培訓(xùn)
- 呼吸內(nèi)科進(jìn)修匯報(bào)課件
- 康復(fù)治療進(jìn)修匯報(bào)
- 牽引供電系統(tǒng)短路計(jì)算-三相對(duì)稱短路計(jì)算(高鐵牽引供電系統(tǒng))
- 離婚協(xié)議書模板(模板)(通用)
- (完整版)第一性原理
- 降低住院患者口服藥缺陷率教學(xué)課件
評(píng)論
0/150
提交評(píng)論