運(yùn)行時(shí)的存儲(chǔ)組織與分配_第1頁
已閱讀1頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第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.P,O.P,編譯程序在編譯階段要為源程序中出現(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

2、.5 PL/0編譯程序目標(biāo)代碼解釋執(zhí)行時(shí)的存儲(chǔ)分配,教學(xué)內(nèi)容,7.1 存儲(chǔ)組織概述,,運(yùn)行時(shí)存儲(chǔ)空間的劃分,代碼空間,數(shù)據(jù)空間,,過程的活動(dòng)和活動(dòng)記錄,,活動(dòng)記錄的結(jié)構(gòu),7.2 靜態(tài)存儲(chǔ)分配,,在編譯階段由編譯程序?qū)崿F(xiàn)對(duì)存儲(chǔ)空間的管理,為源程序中的變量分配存儲(chǔ)單元。(如看電影),,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)

3、行分配 編譯時(shí)為運(yùn)行階段設(shè)計(jì)好存儲(chǔ)組織形式,即為每個(gè)數(shù)據(jù)項(xiàng)安排好它在數(shù)據(jù)區(qū)中的相對(duì)位置,(如開大會(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é)果。,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 堆式動(dòng)態(tài)存儲(chǔ)分配,,變量生存期具有隨機(jī)交叉特性,即非后進(jìn)先出的特性(如程序運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng)存儲(chǔ)空間)

5、給運(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ī)從這片

6、內(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ì)

7、象的引用卻是在棧中分配也就是說在建立一個(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來回收,例如:Student stu1=new Student( );,自動(dòng)垃圾回收器,Garba

8、ge Collector(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)棧:存

9、放變量(包括基本類型和引用類型),JVM為每個(gè)新創(chuàng)建的線程都分配一個(gè)棧,棧以幀(活動(dòng)記錄)為單位保存線程的狀態(tài),當(dāng)線程激活一個(gè)Java方法,JVM就會(huì)在棧里新壓入一個(gè)幀,存放局部變量、方法出口等,方法結(jié)束后從棧里彈出一個(gè)幀。,,.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ā)語言每種語言都有自己的運(yùn)行庫 是否有:“可以被多種語言共用”的通用環(huán)境,有,這就是CLR!,托管代碼與非托管代碼,托管代碼(Managed Code)以CLR為目標(biāo)的代碼 非托管代碼 以“操作系統(tǒng)”為目標(biāo),即時(shí)編譯,微軟中間語言 Microsoft Intermediate

11、 Language,MSIL即時(shí)編譯Just-in-time Compilation, JITCLR就相當(dāng)于Java語言的虛擬機(jī),編譯和執(zhí)行,源代碼,,編譯,在安裝或函數(shù)/方法第一次被調(diào)用時(shí),中間代碼,元數(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ù),公共語言運(yùn)行時(shí),,,,即時(shí)編譯器JIT Compiler,二進(jìn)制代碼,管理代碼Managedcode,,,,,UnmanagedComponent,,,.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)建在線程棧

13、上; 如果該值類型的實(shí)例作為類型的成員,則該實(shí)例作為引用類型(引用類型在GC堆或者LOH上創(chuàng)建)的實(shí)例的一部分,被創(chuàng)建在GC堆上。,值類型,public class Test1   {       private int i;   //上面(2)中的情況,生成Test的實(shí)例的同時(shí),int類型

14、的實(shí)例i被創(chuàng)建在GC堆上       public Test1()       {           byte b =0;   //(1)中的情況,byte類型

15、的實(shí)例b被創(chuàng)建在執(zhí)行這段代碼的線程棧上       }   },值類型分配示例,.NET托管資源內(nèi)存分配機(jī)制,如果該引用類型的實(shí)例的Size=85000byte,則該實(shí)例被創(chuàng)建在LOH(Large Object Heap)上(LOH不會(huì)被壓縮)。,引用類型,public class Test2   {  

16、;     private int[] intArr;       public Test2()       {           

17、;private Object o = new Object();   //引用o存在線程棧上,它指向GC堆上的Object實(shí)例           intArr = new int[21250];   //符合(

18、2)中的Size條件,int數(shù)組的實(shí)例被創(chuàng)建在LOH上       }   },引用類型分配示例,7.5 PL/0目標(biāo)代碼解釋執(zhí)行時(shí)的存儲(chǔ)分配,,,i,指令寄存器,b,基本地址寄存器,t,地址寄存器,p,程序地址寄存器,pcode解釋器的結(jié)構(gòu),保存目標(biāo)代碼,執(zhí)行時(shí)的數(shù)據(jù)棧,(1)程序存儲(chǔ)器codestruct instruction{ enum

19、 fct f ; int l; int a;};struct instruction code[CXMAX+1];,(2)數(shù)據(jù)存儲(chǔ)器sint s[STACKSIZE];在調(diào)用一個(gè)過程時(shí),先要在數(shù)據(jù)棧頂為過程及其變量分配一些位置。所有操作運(yùn)算都在棧頂找到它的操作數(shù),并以計(jì)算結(jié)果代之。棧頂數(shù)據(jù)元素在數(shù)據(jù)棧的位置通過地址寄存器t標(biāo)記。,(3)程序地址寄存器pint p=0;p是code數(shù)組的索引地址,用來存放下一

20、條要解釋執(zhí)行指令在程序存儲(chǔ)器code里的位置。在解釋執(zhí)行時(shí)才用到,初值為0,即第1條要解釋執(zhí)行的指令存放在code[0]。,(4)地址寄存器tint t=0;地址寄存器t是s數(shù)組的索引地址,由于數(shù)據(jù)存儲(chǔ)器被當(dāng)作數(shù)據(jù)棧使用,它用來存放數(shù)據(jù)棧s的棧頂位置。在解釋執(zhí)行時(shí)才用到,初值為0,在解釋執(zhí)行前,數(shù)據(jù)棧是空棧。。,(5)指令寄存器istruct instruction i;用來存放正在解釋執(zhí)行的一條目標(biāo)代碼指令。在解釋程序里,每次

21、通過i=code[p];和p=p+1;這兩條賦值語句,完成從程序存儲(chǔ)器code中取指令,以及使程序地址寄存器p指向下一條指令位置的任務(wù)。,(6)基本地址寄存器bint b=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:

22、動(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)用和返回ini 0 a過程目標(biāo)程序的入口,開辟數(shù)據(jù)段。a為局部變量個(gè)數(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)用該過程前正在運(yùn)行的過程的數(shù)據(jù)段基地址寄存器的值和棧頂寄存器的值,并將返回地址送到地址寄存器p中,以使調(diào)用前的程序從斷點(diǎn)開始繼續(xù)執(zhí)行。 在block中調(diào)用statement之后調(diào)用gen(opr,0,0);,小結(jié),重點(diǎn)掌握:靜態(tài)存儲(chǔ)分配(Fortran)和動(dòng)態(tài)存儲(chǔ)分配(C、Pascal)的含義活動(dòng)記錄的含義及組成掌握C/C++和JA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論