資源描述:
《ch9-10 運(yùn)行時(shí)環(huán)境_(張素琴).ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、1第10章目標(biāo)程序運(yùn)行時(shí)的存儲(chǔ)組織21.存儲(chǔ)組織為了使目標(biāo)程序運(yùn)行,編譯程序從操作系統(tǒng)得到一塊內(nèi)存存儲(chǔ)區(qū),存儲(chǔ)區(qū)容納:1.生成的目標(biāo)代碼空間;2.目標(biāo)代碼運(yùn)行需要的數(shù)據(jù)空間,包括用戶定義的變量和常量,臨時(shí)工作單元,過(guò)程調(diào)用所需的聯(lián)系單元,輸入輸出緩沖區(qū);3.用于保存過(guò)程活動(dòng)蹤跡的一個(gè)控制棧。3目標(biāo)代碼靜態(tài)數(shù)據(jù)?;顒?dòng)記錄堆1.編譯后知道目標(biāo)代碼的大小。如Pascal,C,F(xiàn)ortran;2.靜態(tài)數(shù)據(jù)區(qū)存放編譯時(shí)就能確定所占用空間大小的數(shù)據(jù);3.棧堆區(qū):用于存放可變數(shù)據(jù)以及管理過(guò)程活動(dòng)記錄的控制信息,如Pascal,C語(yǔ)言。2.運(yùn)行
2、時(shí)刻內(nèi)存的劃分:數(shù)據(jù)空間43.活動(dòng)記錄對(duì)于pascal語(yǔ)言來(lái)說(shuō),運(yùn)行過(guò)程中,當(dāng)調(diào)用一個(gè)過(guò)程時(shí),在棧頂構(gòu)筑它的活動(dòng)記錄;一個(gè)活動(dòng)所需要的信息的每個(gè)數(shù)據(jù)項(xiàng)有相同的生存期,因此,組織成一個(gè)活動(dòng)記錄是很自然的。當(dāng)這個(gè)過(guò)程的活動(dòng)執(zhí)行完后,把它從棧頂彈出。把過(guò)程的一個(gè)活動(dòng)所需要的信息組織成一塊連續(xù)的存儲(chǔ)單元,稱為活動(dòng)記錄。5返回值實(shí)在參數(shù)控制鏈訪問(wèn)鏈保存機(jī)器狀態(tài)局部變量臨時(shí)變量臨時(shí)變量:編譯產(chǎn)生。保存機(jī)器狀態(tài):調(diào)用過(guò)程的活動(dòng)在調(diào)用點(diǎn)的機(jī)器狀態(tài),包括計(jì)數(shù)器,各種寄存器的值。局部數(shù)據(jù):過(guò)程中定義的局部量。訪問(wèn)鏈:指向本活動(dòng)要訪問(wèn)的非局部數(shù)據(jù)所在
3、的活動(dòng)記錄.控制鏈:指向主調(diào)過(guò)程的活動(dòng)記錄的首地址。形式單元內(nèi)情向量連接數(shù)據(jù)局部數(shù)據(jù)sptopPascal的活動(dòng)記錄6函數(shù)environment把一個(gè)名字映射為一個(gè)l-value(左-值),4.名字與存儲(chǔ)的綁定引進(jìn)兩個(gè)函數(shù),environment和state。environment把名字映射到一個(gè)存儲(chǔ)單元上;state把存儲(chǔ)單元映射到那里所存放的值上。而函數(shù)state把一個(gè)l-value(左-值)映射為一個(gè)r-value(右-值)。如下圖所示。名字與存儲(chǔ)單元的綁定是指把源程序中的數(shù)據(jù)名字映射到目標(biāo)機(jī)存儲(chǔ)單元的過(guò)程。7名字存儲(chǔ)單元
4、值存儲(chǔ)分配程序運(yùn)行environmentstatel-valuer-value圖:從名字到值的兩個(gè)階段映射8編譯結(jié)束,知道每個(gè)過(guò)程的活動(dòng)記錄的長(zhǎng)度,將其填寫到相應(yīng)的過(guò)程符號(hào)表中;運(yùn)行時(shí),調(diào)用哪個(gè)過(guò)程,就在運(yùn)行棧頂,推進(jìn)那個(gè)過(guò)程的活動(dòng)記錄。一個(gè)名字所需的存貯空間的數(shù)量是由它的類型確定的;多字節(jié)對(duì)象存放于連續(xù)的字節(jié)中,以第一個(gè)字節(jié)的地址作為該對(duì)象的地址;910.1數(shù)據(jù)空間的三種不同管理方法3.1靜態(tài)存儲(chǔ)分配:FORTRAN3.2棧式存儲(chǔ)分配:PASCAL,C3.3堆式存儲(chǔ)分配:PASCAL,C采用哪種分配策略是由源語(yǔ)言的語(yǔ)義決定的。
5、1010.1.1靜態(tài)存儲(chǔ)分配如Fortran語(yǔ)言,各子程序段中的局部變量彼此獨(dú)立,不會(huì)在不同子程序間引用、賦值,每個(gè)變量的存儲(chǔ)空間大小都是常量,整個(gè)程序所需的數(shù)據(jù)空間的總量在編譯時(shí)完全確定,從而每個(gè)變量的內(nèi)存空間可以靜態(tài)分配。在編譯時(shí)刻為每個(gè)數(shù)據(jù)項(xiàng)目確定出在運(yùn)行時(shí)刻的存儲(chǔ)空間中的位置,且這種綁定在運(yùn)行時(shí)刻不再發(fā)生變化。11限制:1.在編譯時(shí)刻知道數(shù)據(jù)目標(biāo)的大小和它們?cè)趦?nèi)存位置上約束;2.不能遞歸調(diào)用過(guò)程;3.不能動(dòng)態(tài)地建立數(shù)據(jù)結(jié)構(gòu)。12與靜態(tài)分配不同的是,在每次活動(dòng)開始時(shí)把局部名字和新的存儲(chǔ)單元綁定,在活動(dòng)結(jié)束時(shí),活動(dòng)記錄從棧中
6、彈出,局部名字的存儲(chǔ)空間隨之釋放。對(duì)于具備遞歸調(diào)用、可變數(shù)組、允許用戶申請(qǐng)和釋放內(nèi)存空間的高級(jí)語(yǔ)言,就需要采用動(dòng)態(tài)存儲(chǔ)管理技術(shù)管理內(nèi)存,主要包括兩種動(dòng)態(tài)存儲(chǔ)分配方式:棧和堆式。10.1.2動(dòng)態(tài)存儲(chǔ)分配13基于棧存儲(chǔ)分配的原理:存儲(chǔ)空間被組織成棧,活動(dòng)記錄的推入和彈出,分別對(duì)應(yīng)于活動(dòng)的開始和結(jié)束。每當(dāng)調(diào)用一個(gè)子程序時(shí),它所需的數(shù)據(jù)存儲(chǔ)空間就分配在棧頂,當(dāng)該子程序運(yùn)行結(jié)束就釋放這部分內(nèi)存存儲(chǔ)數(shù)據(jù)空間;子程序的數(shù)據(jù)空間:(1)生存期在本過(guò)程本次活動(dòng)中的數(shù)據(jù)對(duì)象,如局部變量、參數(shù)單元、臨時(shí)變量等;(2)用于管理活動(dòng)記錄的信息,如當(dāng)A調(diào)用
7、B時(shí),A被中斷,則A當(dāng)前寄存器和返回地址等信息。當(dāng)B執(zhí)行完,便根據(jù)棧中信息回復(fù)A的運(yùn)行。適合Pascal、C、Algol語(yǔ)言。數(shù)據(jù)空間使用遵從“先申請(qǐng)后釋放,后申請(qǐng)先釋放”。10.1.3棧式動(dòng)態(tài)存儲(chǔ)分配14如果一個(gè)程序語(yǔ)言讓用戶自由申請(qǐng)內(nèi)存數(shù)據(jù)空間和退還數(shù)據(jù)空間的機(jī)制,如C++中的new,delete??臻g使用不遵從“先申請(qǐng)后釋放,后申請(qǐng)先釋放”,這樣就不能使用棧式存儲(chǔ)分配方式。需要使用堆式存儲(chǔ)方式。堆是一片足夠大的存貯空間,每當(dāng)需要時(shí),就從這片空間中分配一塊,用完時(shí),再歸還給堆。經(jīng)過(guò)一段時(shí)間運(yùn)行后,運(yùn)行空間被劃分成許多塊,需要
8、整理。10.1.4堆式動(dòng)態(tài)存儲(chǔ)分配1510.2棧式存貯分配的實(shí)現(xiàn)條件:C滿足上述條件C程序結(jié)構(gòu)全局?jǐn)?shù)據(jù)說(shuō)明Main(){Main數(shù)據(jù)說(shuō)明}VoidR(){ R數(shù)據(jù)說(shuō)明}VoidQ(){ Q數(shù)據(jù)說(shuō)明}不允許嵌套定義允許遞歸調(diào)用10.2.1簡(jiǎn)單棧式存貯分配的實(shí)現(xiàn)16