




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 第第6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.1 靜態(tài)存儲(chǔ)分配靜態(tài)存儲(chǔ)分配 6.2 簡(jiǎn)單的棧式存儲(chǔ)分配簡(jiǎn)單的棧式存儲(chǔ)分配 6.3 嵌套過(guò)程語(yǔ)言的棧式實(shí)現(xiàn)嵌套過(guò)程語(yǔ)言的棧式實(shí)現(xiàn) 6.4 堆式動(dòng)態(tài)存儲(chǔ)分配堆式動(dòng)態(tài)存儲(chǔ)分配 6.5 參數(shù)傳遞補(bǔ)遺參數(shù)傳遞補(bǔ)遺 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.1 靜態(tài)存儲(chǔ)分配靜態(tài)存儲(chǔ)分配 如果在編譯時(shí)就能夠確定一個(gè)程序在運(yùn)行時(shí)所需的存儲(chǔ)空間大小,則在編譯時(shí)就能夠安排好目標(biāo)程序運(yùn)行時(shí)的全部數(shù)據(jù)空間,并能確定每個(gè)數(shù)據(jù)項(xiàng)的單元地址,存儲(chǔ)空間的這種分配方法叫做靜態(tài)分配。第第6 6章章 運(yùn)行時(shí)
2、存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 對(duì)FORTRAN語(yǔ)言來(lái)說(shuō),其特點(diǎn)是不允許過(guò)程有遞歸性,每個(gè)數(shù)據(jù)名所需的存儲(chǔ)空間大小都是常量(即不允許含可變體積的數(shù)據(jù),如可變數(shù)組),并且所有數(shù)據(jù)名的性質(zhì)是完全確定的(不允許出現(xiàn)在運(yùn)行時(shí)再動(dòng)態(tài)確定其性質(zhì)的名字這種情況)。這些特點(diǎn)確保整個(gè)程序所需數(shù)據(jù)空間的總量在編譯時(shí)是完全確定的,從而每個(gè)數(shù)據(jù)名的地址就可靜態(tài)地進(jìn)行分配。 靜態(tài)存儲(chǔ)分配是一種最簡(jiǎn)單的存儲(chǔ)管理。一般而言,適于靜態(tài)存儲(chǔ)分配的語(yǔ)言必須滿足以下條件:第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 (1) 數(shù)組的上下界必須是常數(shù);(2) 過(guò)程調(diào)用不允許遞歸;(3) 不允許采用動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu)(即在程序運(yùn)行過(guò)
3、程中申請(qǐng)和釋放的數(shù)據(jù)結(jié)構(gòu))。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 滿足這些條件的語(yǔ)言除了FORTRAN之外,還有BASIC等語(yǔ)言。在這些語(yǔ)言中,編譯程序可以完全確定程序中數(shù)據(jù)項(xiàng)所在的地址(通常為相對(duì)于各數(shù)據(jù)區(qū)起始地址的位移量)。由于過(guò)程調(diào)用不允許遞歸,因此數(shù)據(jù)項(xiàng)的存儲(chǔ)地址就與過(guò)程相聯(lián)系。過(guò)程調(diào)用所使用的局部數(shù)據(jù)區(qū)可以直接安排在過(guò)程的目標(biāo)代碼之后,并把各數(shù)據(jù)項(xiàng)的存儲(chǔ)地址填入相關(guān)的目標(biāo)代碼中,以便在過(guò)程運(yùn)行時(shí)訪問(wèn)這個(gè)局部數(shù)據(jù)區(qū)。在此,不存在對(duì)存儲(chǔ)區(qū)的再利用問(wèn)題;目標(biāo)程序執(zhí)行時(shí)不必進(jìn)行運(yùn)行時(shí)的存儲(chǔ)空間管理,過(guò)程的進(jìn)入和退出變得極為簡(jiǎn)單。 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空
4、間組織 FORTRAN語(yǔ)言的靜態(tài)存儲(chǔ)管理特點(diǎn)是FORTRAN程序中的各程序段均可獨(dú)立地進(jìn)行編譯。在編譯過(guò)程中,給程序中的變量或數(shù)組分配存儲(chǔ)單元的一般做法是:為每一個(gè)變量(或數(shù)組)確定一個(gè)有序的整數(shù)對(duì);其中,第一個(gè)整數(shù)用來(lái)指示數(shù)據(jù)區(qū)(局部數(shù)據(jù)區(qū)或公用區(qū))的編號(hào),第二個(gè)整數(shù)則用來(lái)指明該變量(或數(shù)組)所對(duì)應(yīng)的存儲(chǔ)起始單元相對(duì)于其所在數(shù)據(jù)區(qū)起點(diǎn)的位移(即相對(duì)于數(shù)據(jù)區(qū)起點(diǎn)的地址);并將這一對(duì)整數(shù)填入符號(hào)表相應(yīng)登記項(xiàng)的信息欄中。至于各數(shù)據(jù)區(qū)的起始地址在編譯時(shí)可暫不確定,待各程序段全部編譯完成之后,再由連接裝配程序最終確定,并將各程序段的目標(biāo)代碼組裝成一個(gè)完整的目標(biāo)程序。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)
5、行時(shí)存儲(chǔ)空間組織 一個(gè)FORTRAN程序段的局部數(shù)據(jù)區(qū)可由圖61所示的項(xiàng)目組成。其中,隱參數(shù)是指過(guò)程調(diào)用時(shí)的連接信息(不在源程序中明顯出現(xiàn)),如調(diào)用時(shí)的返回地址、調(diào)用時(shí)寄存器的保護(hù)等;形式單元用來(lái)存放過(guò)程調(diào)用時(shí)形參與實(shí)參結(jié)合的實(shí)參地址或值。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 圖61 一個(gè)FORTRAN程序段的局部數(shù)據(jù)區(qū)臨時(shí)變量數(shù)組簡(jiǎn)單變量形式單元寄存器保護(hù)區(qū)隱參數(shù)返回地址第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.2 簡(jiǎn)單的棧式存儲(chǔ)分配簡(jiǎn)單的棧式存儲(chǔ)分配 我們首先考慮一種簡(jiǎn)單程序語(yǔ)言的實(shí)現(xiàn),這種語(yǔ)言沒(méi)有分程序結(jié)構(gòu),過(guò)程定義不允許嵌套,但允許過(guò)程的遞歸調(diào)用,允許過(guò)
6、程含有可變數(shù)組。例如,C語(yǔ)言除不允許含有可變數(shù)組外,就是這樣一種語(yǔ)言。C語(yǔ)言的程序結(jié)構(gòu)如下:第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 全局?jǐn)?shù)據(jù)說(shuō)明main()main中的數(shù)據(jù)說(shuō)明void R()R中的數(shù)據(jù)說(shuō)明第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 void Q( )Q中的數(shù)據(jù)說(shuō)明第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 例如,下面計(jì)算n!的C語(yǔ)言程序就是一個(gè)遞歸調(diào)用的程序,它的執(zhí)行過(guò)程可以用棧來(lái)實(shí)現(xiàn)。# include “stdio.h”long factorial (int n)if (n1)return (n*factorial (n1);elsere
7、turn (1);第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 main ()int num;doscanf (“%d” , &num);if (num=0 & num =0);第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.2.1 棧式存儲(chǔ)分配與活動(dòng)記錄 使用棧式存儲(chǔ)分配法意味著程序運(yùn)行時(shí),每當(dāng)進(jìn)入一個(gè)過(guò)程(或函數(shù))就有一個(gè)相應(yīng)的活動(dòng)記錄累筑于棧頂,此記錄含有連接數(shù)據(jù)、形式單元、局部變量、局部數(shù)組的內(nèi)情向量和臨時(shí)工作單元等;在進(jìn)入過(guò)程和執(zhí)行過(guò)程的可執(zhí)行語(yǔ)句之前,再把局部數(shù)組所需空間累筑于棧頂,從而形成過(guò)程工作時(shí)的完整數(shù)據(jù)區(qū)。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織
8、運(yùn)行時(shí)存儲(chǔ)空間組織 注意,每個(gè)過(guò)程的活動(dòng)記錄的體積在編譯時(shí)可以靜態(tài)地確定。但由于允許含有可變數(shù)組,所以數(shù)組的大小只有在運(yùn)行時(shí)才能知道。因數(shù)組區(qū)的大小不能預(yù)先獲知,為了擴(kuò)充方便,所以只能將數(shù)組區(qū)累筑于活動(dòng)記錄之上的當(dāng)前棧頂。當(dāng)一個(gè)過(guò)程工作完畢返回時(shí),它在棧頂?shù)臄?shù)據(jù)區(qū)(包括活動(dòng)記錄和數(shù)組區(qū))也隨即不復(fù)存在。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 對(duì)C語(yǔ)言來(lái)說(shuō),由于其不含可變數(shù)組,因而它的活動(dòng)記錄本身包含了局部數(shù)組的空間。圖62和圖63分別給出了C語(yǔ)言和含可變數(shù)組的某簡(jiǎn)單語(yǔ)言程序運(yùn)行時(shí)的數(shù)據(jù)空間結(jié)構(gòu),即顯示了主程序在調(diào)用了過(guò)程Q,Q又調(diào)用了過(guò)程R,且在R投入運(yùn)行后的存儲(chǔ)結(jié)構(gòu)。 SP指示
9、器總是指向執(zhí)行過(guò)程活動(dòng)記錄的起點(diǎn),而TOP指示器則始終指向(已占用)棧頂單元。當(dāng)進(jìn)入一個(gè)過(guò)程時(shí),TOP指向?yàn)榇诉^(guò)程創(chuàng)建的活動(dòng)記錄的頂端;在分配數(shù)組區(qū)之后(如果有的話),TOP又改為指向數(shù)組區(qū)(從而是該過(guò)程整個(gè)數(shù)據(jù)區(qū))的頂端。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 SPTOPR的活動(dòng)記錄Q的活動(dòng)記錄main的活動(dòng)記錄全局?jǐn)?shù)據(jù)區(qū) 圖62 C語(yǔ)言程序的存儲(chǔ)組織 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 R的數(shù)組區(qū)R的活動(dòng)記錄Q的數(shù)組區(qū)Q的活動(dòng)記錄主程序全局?jǐn)?shù)據(jù)區(qū)TOPSP 圖63 含可變數(shù)組程序的存儲(chǔ)組織第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 C的活動(dòng)記錄含有
10、以下幾個(gè)區(qū)段(如圖64所示): (1) 連接數(shù)據(jù)(兩項(xiàng)):老SP值(即前一活動(dòng)記錄的起始地址)和返回地址; (2) 參數(shù)個(gè)數(shù); (3) 形式單元(存放實(shí)在參數(shù)的值或地址); (4) 過(guò)程的局部變量(簡(jiǎn)單變量)、數(shù)組的內(nèi)情向量和臨時(shí)工作單元。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 圖64 C過(guò)程的活動(dòng)記錄1TOP臨時(shí)工作單元內(nèi)情向量簡(jiǎn)單變量形式單元參數(shù)個(gè)數(shù)返回地址老SPSP20第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 C語(yǔ)言不允許過(guò)程(函數(shù))嵌套,也即不允許一個(gè)過(guò)程的定義出現(xiàn)在另一個(gè)過(guò)程的定義之內(nèi)。因此,C語(yǔ)言的非局部變量?jī)H能出現(xiàn)在源程序頭,非局部變量可采用靜態(tài)存儲(chǔ)分配
11、并在編譯時(shí)確定它們的地址。 由圖64可知,過(guò)程的每一局部變量或形參在活動(dòng)記錄中的位置都是確定的;也就是說(shuō),這些變量或形參所分配的存儲(chǔ)單元其地址都是相對(duì)于活動(dòng)記錄的基址SP的。因此,變量和形參運(yùn)行時(shí)在棧上的絕對(duì)地址是:絕對(duì)地址=活動(dòng)記錄基址(SP)+相對(duì)地址第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 于是,對(duì)當(dāng)前正在執(zhí)行(即活動(dòng))的過(guò)程,其任何局部變量或形參X的引用均可表示為變址訪問(wèn)XSP。此處X代表X相對(duì)于活動(dòng)記錄基址的偏移量,這個(gè)偏移量(即相對(duì)數(shù))在編譯時(shí)可完全確定下來(lái)。過(guò)程的局部數(shù)組的內(nèi)情向量的相對(duì)地址在編譯時(shí)也同樣可完全確定下來(lái),一旦數(shù)據(jù)空間在過(guò)程里獲得分配后,對(duì)數(shù)組元素的引用
12、也就容易用變址的方式進(jìn)行訪問(wèn)。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.2.2 過(guò)程的執(zhí)行1過(guò)程調(diào)用過(guò)程調(diào)用的四元式序列為: par T1 par T2 par Tn call P,n第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 由于此時(shí)TOP是指向被調(diào)用過(guò)程P之前的棧頂,而P的形式單元和活動(dòng)記錄起點(diǎn)之間的距離是確定的(等于3,參見(jiàn)圖64),因而由調(diào)用者過(guò)程給將要調(diào)用的過(guò)程P的活動(dòng)記錄(正在形成中)的形式單元傳遞實(shí)參值或?qū)崊⒌刂?,即每個(gè)par Ti (i=1,2,n)可直接翻譯成如下指令: (i+3)TOP=Ti /*傳遞參數(shù)值*/ 或 (i+3)TOP=addrTi
13、/*傳遞參數(shù)地址*/第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 而四元式call P,n則翻譯成: 1TOP=SP /*保護(hù)現(xiàn)行SP*/ 3TOP=n /*傳遞參數(shù)個(gè)數(shù)*/ JSR P /*轉(zhuǎn)子指令,轉(zhuǎn)向P過(guò)程的第 一條指令*/過(guò)程P調(diào)用之前,先構(gòu)造出P的活動(dòng)記錄部分內(nèi)容,見(jiàn)圖65所示。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 參數(shù)個(gè)數(shù)nTOP3SPT2T1現(xiàn)行SP值P的活動(dòng)記錄調(diào)用過(guò)程TOP43210圖65 過(guò)程P調(diào)用前先構(gòu)造P的活動(dòng)記錄部分內(nèi)容第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 2過(guò)程進(jìn)入 轉(zhuǎn)入過(guò)程P后,首先要做的工作是定義新活動(dòng)記錄的SP,保護(hù)返回
14、地址和定義新活動(dòng)記錄的TOP值,即執(zhí)行下述指令: SP= TOP+1 /*定義新SP*/ 1SP=返回地址 /*保護(hù)返回地址*/ TOP=TOP+L /*定義新TOP*/ 其中,L是過(guò)程P的活動(dòng)記錄所需的單元數(shù),這個(gè)數(shù)在編譯時(shí)可靜態(tài)地計(jì)算出來(lái)。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 對(duì)含可變數(shù)組(非C語(yǔ)言)的情況來(lái)說(shuō),因?yàn)檫^(guò)程可含可變數(shù)組且所有數(shù)組都分配在活動(dòng)記錄的頂上,所以緊接上述指令之后應(yīng)是對(duì)數(shù)組進(jìn)行存儲(chǔ)分配的指令(如果含有局部數(shù)組),這些指令是在翻譯數(shù)組說(shuō)明時(shí)產(chǎn)生的。對(duì)每個(gè)數(shù)組說(shuō)明,相應(yīng)的目標(biāo)指令組將做以下幾件工作: (1) 計(jì)算各維的上、下限; (2) 調(diào)用數(shù)組空間分配子
15、程序,其參數(shù)是各維的上、下限和內(nèi)情向量單元首地址。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 數(shù)組空間分配子程序計(jì)算并填好內(nèi)情向量的所有信息,然后在TOP所指的位置之上留出數(shù)組所需的空間,并將TOP調(diào)整為指向數(shù)組區(qū)的頂端。進(jìn)入過(guò)程P后所做的工作如圖66所示。 此后,在過(guò)程段執(zhí)行語(yǔ)句的工作過(guò)程中,凡引用形式參數(shù)、局部變量或數(shù)組元素都將以SP為基址進(jìn)行相對(duì)訪問(wèn)。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 P 的數(shù)組區(qū)返回地址P的活動(dòng)記錄(長(zhǎng)度為L(zhǎng))1調(diào)用過(guò)程SPTOP0圖66 進(jìn)入過(guò)程P后所做的工作示意第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 3過(guò)程返回 C語(yǔ)言以及
16、其它一些相似的語(yǔ)言含有return(E)形式的返回語(yǔ)句,其中E為表達(dá)式。假定E值已計(jì)算出來(lái)并存放在某臨時(shí)單元T中,則此時(shí)即可將T值傳送到某個(gè)特定的寄存器中(調(diào)用過(guò)程將從這個(gè)特定的寄存器中獲得被調(diào)用過(guò)程P的結(jié)果)。剩下的工作就是恢復(fù)SP和TOP為進(jìn)入過(guò)程P之前的原值(即指向調(diào)用過(guò)程的活動(dòng)記錄及工作空間),并按返回地址實(shí)行無(wú)條件轉(zhuǎn)移,即執(zhí)行下述指令序列: 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 TOP= SP1 /*恢復(fù)調(diào)用過(guò)程的TOP值*/ SP=0SP /*恢復(fù)調(diào)用過(guò)程的SP值*/ X=2TOP /*將返回地址送X*/ UJ 0X /*無(wú)條件轉(zhuǎn)移,即按X的地址返回到調(diào)用過(guò)程*/
17、一個(gè)過(guò)程也可通過(guò)它的end語(yǔ)句(對(duì)C語(yǔ)言則是該過(guò)程(函數(shù))體結(jié)束時(shí)的“”)自動(dòng)返回。如果此過(guò)程是一個(gè)函數(shù)過(guò)程,則按上述辦法傳遞結(jié)果值,否則僅直接執(zhí)行上述返回指令序列。過(guò)程P的返回示意如圖67所示。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 SPTOP返回地址老SPP空間調(diào)用過(guò)程空間 圖67 過(guò)程P的返回示意 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.3 嵌套過(guò)程語(yǔ)言的棧式實(shí)現(xiàn)嵌套過(guò)程語(yǔ)言的棧式實(shí)現(xiàn) 在簡(jiǎn)單程序語(yǔ)言實(shí)現(xiàn)中是允許過(guò)程的遞歸調(diào)用的,并且過(guò)程中可含有可變數(shù)組?,F(xiàn)在,我們?cè)偌由弦环N功能,即允許過(guò)程的嵌套性。從結(jié)構(gòu)上看,PASCAL就是這樣的一種語(yǔ)言;但由于PAS
18、CAL含有“文件”和“動(dòng)態(tài)變量”,因此,它的存儲(chǔ)分配不能簡(jiǎn)單地用棧式方法來(lái)實(shí)現(xiàn)。采用PASCAL的一個(gè)子集,例如去掉“文件”和“動(dòng)態(tài)變量”這種數(shù)據(jù)類型,那就可以用我們下面將要討論的方法實(shí)現(xiàn)存儲(chǔ)分配。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.3.1 嵌套層次顯示表(DISPLAY)和活動(dòng)記錄 在討論中,常常要用到過(guò)程定義的“嵌套層次”(簡(jiǎn)稱層數(shù))這個(gè)概念。我們始終假定主程序的層數(shù)為0,因此主程序稱為第0層過(guò)程。如果過(guò)程Q是在層數(shù)為i的過(guò)程P內(nèi)定義的,并且P是包圍Q的最小過(guò)程,則Q的層數(shù)就為i+1。當(dāng)編譯程序處理過(guò)程說(shuō)明時(shí),過(guò)程的層數(shù)將作為過(guò)程名的一個(gè)重要屬性登記在符號(hào)表中。第第6
19、 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 由于過(guò)程定義是嵌套的,因而一個(gè)過(guò)程可以引用包圍它的任一外層過(guò)程所定義的變量或數(shù)組。也就是說(shuō),運(yùn)行時(shí),一個(gè)過(guò)程Q可能引用它的任一外層過(guò)程P的最新活動(dòng)記錄中的某些數(shù)據(jù)。因此,過(guò)程Q運(yùn)行時(shí)必須知道它的所有外層的最新活動(dòng)記錄的地址。由于允許遞歸和可變數(shù)組的存在,過(guò)程的活動(dòng)記錄位置(即使是相對(duì)位置)也往往是變遷的,因而必須設(shè)法跟蹤每個(gè)外層過(guò)程的最新活動(dòng)記錄的位置。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 一種常用的跟蹤每個(gè)外層過(guò)程最新活動(dòng)記錄位置的有效辦法是,每進(jìn)入一個(gè)過(guò)程后,在建立它的活動(dòng)記錄區(qū)的同時(shí)建立一張嵌套層次顯示表DISPLAY。假定
20、現(xiàn)在進(jìn)入的過(guò)程層數(shù)為i,則它的DISPLAY表含有i+1個(gè)單元。此表本身是一個(gè)小棧,自頂而下每個(gè)單元依次存放著現(xiàn)行層、直接外層直至最外層(第0層,即主程序?qū)?的每一層的最新活動(dòng)記錄的起始地址。例如,令過(guò)程R的外層為Q,Q的外層為主程序P,則過(guò)程R運(yùn)行時(shí)的DISPLAY表內(nèi)容如表6.1所示。 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 表6.1 DISPLAY表2R的現(xiàn)行活動(dòng)記錄的始址(SP的現(xiàn)行值)1Q的最新活動(dòng)記錄的始址0P的活動(dòng)記錄的始址第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 由于過(guò)程的層數(shù)可靜態(tài)確定,因此每個(gè)過(guò)程的DISPLAY表的體積在編譯時(shí)即可知道。為了便于組
21、織存儲(chǔ)區(qū)和簡(jiǎn)化處理手續(xù),我們把DISPLAY作為活動(dòng)記錄的一部分置于形式單元的上端,如圖68所示。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 由于每個(gè)過(guò)程的形式單元數(shù)目在編譯時(shí)是知道的,因此DISPLAY的相對(duì)地址d(相對(duì)于活動(dòng)記錄的起點(diǎn))在編譯時(shí)也是完全確定的。被調(diào)用過(guò)程為了建立自己的DISPLAY,就必須知道它的直接外層過(guò)程的DISPLAY,這意味著必須把直接外層的DISPLAY地址作為連接數(shù)據(jù)之一(稱為“全局DISPLAY地址”)傳送給被調(diào)用過(guò)程。于是,此時(shí)的連接數(shù)據(jù)包含老SP值、返回地址和全局DISPLAY地址這三項(xiàng)內(nèi)容。整個(gè)活動(dòng)記錄的結(jié)構(gòu)如圖68所示。第第6 6章章 運(yùn)行時(shí)
22、存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 連接數(shù)據(jù)臨時(shí)變量?jī)?nèi)情向量簡(jiǎn)單變量dDISPLAY 表形式單元3參數(shù)個(gè)數(shù)2全局 DISPLAY 地址1返回地址0老SPTOPSPd個(gè)單元k第k層SP2最外層過(guò)程SP1主程序SP圖68 活動(dòng)記錄結(jié)構(gòu) 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.3.2 嵌套過(guò)程的執(zhí)行 1過(guò)程調(diào)用 過(guò)程調(diào)用所做的工作與簡(jiǎn)單棧式存儲(chǔ)分配大體相同,只是增加了一個(gè)連接數(shù)據(jù),所以每個(gè)par Ti 相應(yīng)的指令應(yīng)改為: (i+4)TOP=Ti 或者 (i+4)TOP=addrTi 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 call P,n所對(duì)應(yīng)的指令應(yīng)為: 1TOP=SP
23、 /*保護(hù)現(xiàn)行SP*/ 3TOP=SP+d /*將直接外層的DISPLAY始址作為P的全局DISPLAY地址*/ 4TOP=n /*傳遞參數(shù)個(gè)數(shù)*/ JSR P /*轉(zhuǎn)向P的第一條指令*/第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 2過(guò)程進(jìn)入 轉(zhuǎn)入過(guò)程P后,首先執(zhí)行和簡(jiǎn)單棧式存儲(chǔ)分配相同的指令: SP= TOP+1 /*定義新的SP*/ 1SP=返回地址 /*保護(hù)返回地址*/ TOP=TOP+L /*定義新的TOP*/ 其次,應(yīng)按第三項(xiàng)連接數(shù)據(jù)所提供的全局DISPLAY地址,自底而上地抄錄k個(gè)單元內(nèi)容(k為P的層次),最后再添上新的SP值形成現(xiàn)行過(guò)程P的DISPLAY(共k+1個(gè)單元
24、)。其過(guò)程如圖69所示。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 4參數(shù)個(gè)數(shù)n3全局 DISPLAY 地址21調(diào)用過(guò)程的SPd調(diào)用過(guò)程空間P過(guò)程空間SPTOP定義新的SP;定義新的TOP;按全局DISPLAY地址復(fù)制DISPLAY表至P的活動(dòng)記錄;DISPLAY表圖69 過(guò)程P進(jìn)入示意第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 3過(guò)程返回 當(dāng)過(guò)程P工作完畢要返回到調(diào)用段時(shí),若return語(yǔ)句含有返回值或P是函數(shù)過(guò)程,則把已算好的值傳送到某個(gè)特定的寄存器,然后執(zhí)行: TOP= SP1 /*恢復(fù)調(diào)用過(guò)程的TOP值*/ SP=0SP /*恢復(fù)調(diào)用過(guò)程的SP值*/ X=2TOP
25、/*將返回地址送X*/ UJ 0X /*無(wú)條件轉(zhuǎn)移,返回*/ 過(guò)程返回執(zhí)行的指令與簡(jiǎn)單棧式存儲(chǔ)分配的過(guò)程返回完全一樣。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.3.3 訪問(wèn)非局部名的另一種實(shí)現(xiàn)方法 在允許嵌套的過(guò)程中,一個(gè)過(guò)程可以引用包圍它的任一外層過(guò)程所定義的變量或數(shù)組;也即在運(yùn)行時(shí),一個(gè)過(guò)程Q可能引用它的任一外層過(guò)程P的最新活動(dòng)記錄中的某些數(shù)據(jù)(這些數(shù)據(jù)視為過(guò)程Q的非局部量)。為了在活動(dòng)記錄中查找非局部名字所對(duì)應(yīng)的存儲(chǔ)空間,過(guò)程Q運(yùn)行時(shí)必須知道它的所有外層過(guò)程的最新活動(dòng)記錄的地址。因?yàn)檫^(guò)程活動(dòng)記錄的位置(即使是相對(duì)位置)往往也因過(guò)程的遞歸而變遷,所以必須設(shè)法跟蹤每個(gè)外層過(guò)程
26、的最新活動(dòng)記錄的位置。 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 跟蹤的一種有效辦法是采用嵌套層次顯示表DISPLAY,其優(yōu)點(diǎn)是訪問(wèn)非局部量的速度較快。在此,我們介紹另一種訪問(wèn)非局部名的方法存取鏈(也稱靜態(tài)鏈)方法。 存取鏈方法引入一個(gè)稱為存取鏈的指針,該指針作為活動(dòng)記錄的一項(xiàng)指向直接外層的最新活動(dòng)記錄的地址,這就意味著在運(yùn)行時(shí)棧中的每個(gè)數(shù)據(jù)區(qū)(活動(dòng)記錄)之間又拉出一條鏈,這個(gè)鏈稱為存取鏈。注意,運(yùn)行時(shí)棧中數(shù)據(jù)區(qū)之間原先就存在一條鏈,即每個(gè)活動(dòng)記 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 錄中所保存的老SP值這一項(xiàng),它是指向調(diào)用該過(guò)程(子過(guò)程)的那個(gè)過(guò)程(父過(guò)程)的最新
27、活動(dòng)記錄的起點(diǎn),由此向前形成了一條SP鏈。為了區(qū)別于存取鏈,稱SP鏈為控制鏈(也稱動(dòng)態(tài)鏈),它記錄了在運(yùn)行中過(guò)程之間相互調(diào)用的關(guān)系。注意,控制鏈?zhǔn)莿?dòng)態(tài)的,而存取鏈?zhǔn)庆o態(tài)的??刂奇溣涗浟水?dāng)前時(shí)刻程序中各過(guò)程相互調(diào)用的情況;而存取鏈則始終記錄著程序靜態(tài)定義時(shí)該過(guò)程所有的直接外層(嵌套過(guò)程規(guī)定,內(nèi)層過(guò)程只允許調(diào)用其靜態(tài)定義時(shí)的外層過(guò)程說(shuō)明的變量和數(shù)組);因此,存取鏈指出了一個(gè)過(guò)程的當(dāng)前活動(dòng)記錄指向其直接定義的外層過(guò)程直至最外層的最新活動(dòng)記錄的起點(diǎn)。具有存取鏈的活動(dòng)記錄結(jié)構(gòu)如圖610所示。 假定過(guò)程的嵌套關(guān)系如下:第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 P: var a; Q(b); v
28、ar i; R; var c,d; call R; S; var c,i; call Q; call S; 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 TOP SP臨時(shí)單元內(nèi)情向量簡(jiǎn)單變量形式參數(shù)形參個(gè)數(shù)存取鏈(靜態(tài)鏈)返回地址控制鏈(動(dòng)態(tài)鏈):老SP圖610 具有存取鏈的活動(dòng)記錄結(jié)構(gòu) 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 程序中每個(gè)過(guò)程的靜態(tài)結(jié)構(gòu)(嵌套層次)是確定的,如嵌套深度為2的過(guò)程R引用了非局部量a和b,其嵌套深度分別為0和1。從R的活動(dòng)記錄開(kāi)始,分別沿著20=2和21=1個(gè)存取鏈向前查找,則可找到包含這兩個(gè)非局部量的活動(dòng)記錄。 上述過(guò)程P調(diào)用S以及S調(diào)用Q運(yùn)
29、行時(shí)棧的變化過(guò)程如圖611(a)、(b)所示。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 由圖611可以看出,指針SP總是指向當(dāng)前正在執(zhí)行過(guò)程的活動(dòng)記錄起點(diǎn),控制鏈(老SP)則指向調(diào)用運(yùn)行過(guò)程的父過(guò)程的活動(dòng)記錄起點(diǎn)。因此,當(dāng)運(yùn)行過(guò)程調(diào)用結(jié)束返回時(shí),利用控制鏈老SP值可以得到調(diào)用前原父過(guò)程活動(dòng)記錄的起點(diǎn)。從程序的靜態(tài)結(jié)構(gòu)來(lái)看,P是S和Q的靜態(tài)直接外層,所以,S和Q活動(dòng)記錄中的存取鏈均指向其直接外層P的活動(dòng)記錄起點(diǎn)。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 SPTOPic形參個(gè)數(shù):0存取鏈:0返回地址老SP:0a形參個(gè)數(shù):0存取鏈:0返回地址0S過(guò)程P過(guò)程i形式參數(shù):b形參個(gè)
30、數(shù):1存取鏈:0返回地址老SPic形參個(gè)數(shù):0存取鏈:0返回地址老SP:0a形參個(gè)數(shù):0存取鏈:0返回地址0TOPSPQ過(guò)程S過(guò)程P過(guò)程(b)(a)00圖611 過(guò)程調(diào)用時(shí)運(yùn)行棧的變化第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 例6.1 某程序的結(jié)構(gòu)如圖612所示,其中A、B、C為過(guò)程名,請(qǐng)分別畫出過(guò)程C調(diào)用A前后的棧頂活動(dòng)記錄。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 主程序ABC var x: int x=5 call A圖612 例6.1的程序結(jié)構(gòu)示意第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 解答 過(guò)程C調(diào)用A前后的棧頂活動(dòng)記錄示意如圖613所示。由圖6
31、13可知,當(dāng)過(guò)程C執(zhí)行時(shí),它可使用主程序、A、B和C過(guò)程所說(shuō)明的變量,且其外層嵌套的過(guò)程活動(dòng)記錄始址由DISPLAY表指出。當(dāng)C調(diào)用A而使過(guò)程A執(zhí)行時(shí),我們看到此時(shí)的DISPLAY表已變?yōu)閮身?xiàng),即主程序和A過(guò)程自身;也即此時(shí)A只可使用主程序和A過(guò)程所說(shuō)明的變量。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 DISPLAY表A_SP主程序_SP參數(shù)個(gè)數(shù):0全局DISPLAY地址返回地址C_SP局部變量:xDISPLAY表C_SPB_SPA_SP主程序_SP參數(shù)個(gè)數(shù):0全局DISPLAY地址返回地址B_SPA_TOPA_SPC_TOPC_SP調(diào)用A后的活動(dòng)記錄(在此標(biāo)記為A)調(diào)用A前C的活
32、動(dòng)記錄圖613 例6.1的運(yùn)行棧與活動(dòng)記錄示意第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 例6.2 在下面的PASCAL程序中,已經(jīng)第二次(遞歸地)進(jìn)入了f,請(qǐng)給出第三次進(jìn)入f后的運(yùn)行棧及DISPLAY的示意圖 PROGRAM test(input, output); VAR K: integer; FUNCTION f(n: integer): integer; BEGIN IF n=0 THEN f:=1第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 圖614 例6.2的運(yùn)行棧及DISPLAY示意圖f的DISPLAY(n8)SP2SP30SP20SP100f的DISPLAY
33、(n9)f的DISPLAY(n10)SP1test的DISPLAY第三次遞歸第二次遞歸第一次遞歸主程序SP30第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 解答 第三次進(jìn)入f后的運(yùn)行棧及DISPLAY的示意圖如圖614所示。由于靜態(tài)嵌套層次只有兩層,故每一次遞歸調(diào)用產(chǎn)生的DISPLAY表只有兩項(xiàng),一項(xiàng)是test的SP(即0),另一項(xiàng)是當(dāng)前活動(dòng)記錄的SPi(i=1,2,3)。 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.4 堆式動(dòng)態(tài)存儲(chǔ)分配堆式動(dòng)態(tài)存儲(chǔ)分配 6.4.1 堆式存儲(chǔ)的概念 如果一種程序語(yǔ)言允許數(shù)據(jù)對(duì)象能夠自由地分配和釋放,或者不僅有過(guò)程而且有進(jìn)程(process
34、)這樣的程序結(jié)構(gòu),那么由于空間的使用不一定遵循“先申請(qǐng)后釋放”的原則,則棧式存儲(chǔ)分配就不適用了。在這種情況下,通常使用一種稱之為堆的動(dòng)態(tài)存儲(chǔ)分配方案。假定程序運(yùn)行時(shí)有一個(gè)大的存儲(chǔ)空間,需要時(shí)就從這個(gè)空間中借用一塊,不用時(shí)再退還給它。 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 由于借、還的時(shí)間先后不一,因而經(jīng)過(guò)一段時(shí)間的運(yùn)行后,這個(gè)大空間就必然被分割成如圖615所示的許多小塊,這些塊有些正在使用,有些則是空閑的(未被使用)。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 BAC D可分配空間ABCD使用塊記錄圖615 堆式存儲(chǔ)分配示意第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)
35、空間組織 對(duì)于堆式存儲(chǔ)分配來(lái)說(shuō),需要解決兩個(gè)問(wèn)題:一是堆空間的分配,即當(dāng)運(yùn)行程序需要一塊空間時(shí)應(yīng)分配哪一塊給它;另一個(gè)問(wèn)題是分配空間的回收,由于返回堆的不用空間是按任意次序進(jìn)行的,所以需要研究專門的回收分配策略。 在許多語(yǔ)言中都有顯式的堆空間分配和回收語(yǔ)句或函數(shù),如PASCAL語(yǔ)言中的new和dispose、C語(yǔ)言中的alloc和free以及C+語(yǔ)言中的new和delete。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.4.2 堆式存儲(chǔ)管理的方法 由于堆式分配方式和存儲(chǔ)管理技術(shù)較為復(fù)雜,并且有效的堆管理是數(shù)據(jù)結(jié)構(gòu)課程研究的問(wèn)題,故我們只對(duì)堆式分配方式作簡(jiǎn)單的討論。 當(dāng)運(yùn)行程序要求一
36、塊體積為N的存儲(chǔ)空間時(shí)應(yīng)如何分配?從理論上講,這時(shí)應(yīng)從比N稍大一些的空閑塊中取出N個(gè)單元予以分配,這種做法的目的是保持較大的空閑塊以備將來(lái)之需。但這種方法實(shí)現(xiàn)起來(lái)難度較大,實(shí)際中采用的辦法是:掃描空閑塊鏈并在首次遇到的比N大的空閑塊中取出N個(gè)單元進(jìn)行分配。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 如果找不到一塊比N大的空閑塊,但所有空閑塊的總和卻比N大,這時(shí)就需要用某種方法使這些空閑塊拼接在一起,形成一個(gè)可分配的連續(xù)空間。如果所有空閑塊的總和都不及N大,則需要采用更復(fù)雜的辦法,如廢品回收技術(shù)(即尋找那些運(yùn)行程序已不使用但仍未釋放的存儲(chǔ)塊或運(yùn)行程序目前很少使用的存儲(chǔ)塊),把這些存儲(chǔ)塊
37、回收后再重新分配。 可以采用多種策略進(jìn)行堆式動(dòng)態(tài)存儲(chǔ)管理。在此,我們介紹一種使用可利用空間表進(jìn)行動(dòng)態(tài)分配的方法。可利用空間表是指將所有空閑塊用一張表記錄下來(lái),表的結(jié)構(gòu)可以是目錄表,也可以是鏈表,其結(jié)構(gòu)分別如圖616(b)、(c)所示。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 050012001700200026003600(a)塊編號(hào)起始地址 內(nèi)存大小150070021700300326001000heap7003001000(b)50017002600(c)圖616 內(nèi)存狀態(tài)和可利用空間表 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 使用可利用空間表進(jìn)行動(dòng)態(tài)存儲(chǔ)分配的方
38、法又可分為如下兩種: (1) 定長(zhǎng)塊的管理。最簡(jiǎn)單的堆式存儲(chǔ)管理方法是采用定長(zhǎng)塊的管理方法,即將堆存儲(chǔ)空間在初始化時(shí)就劃分成大小相同的若干塊,將各個(gè)塊通過(guò)鏈表鏈接起來(lái)形成一個(gè)單向線性鏈表。由于各塊大小相同,故分配時(shí)無(wú)需查找,只需將頭指針?biāo)傅牡谝粔K分配給用戶即可,然后頭指針指向下一塊。同樣,當(dāng)回收時(shí),系統(tǒng)將待回收的存儲(chǔ)塊插入到表頭即完成了該塊的回收。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 (2) 變長(zhǎng)塊的管理。變長(zhǎng)塊管理方法是一種常用的堆式存儲(chǔ)管理方法,它可以根據(jù)實(shí)際需要來(lái)分配長(zhǎng)度不同的空閑塊;對(duì)空閑塊的管理則可以采用圖616(c)中的鏈表形式。 系統(tǒng)開(kāi)始時(shí),存儲(chǔ)空間是一完整空間
39、,可利用空間表中只有一個(gè)大小為整個(gè)存儲(chǔ)空間的空閑塊。當(dāng)系統(tǒng)運(yùn)行一段時(shí)間后,隨著分配和回收的進(jìn)行,可利用空間表中空閑塊的大小和個(gè)數(shù)也隨之改變。由于可利用空間表中的空閑塊大小不同,因而存在著如何進(jìn)行空閑塊分配的問(wèn)題。若可利用空間表存在多個(gè)大于所要求空間的空閑塊,可采取以下三種方法之一進(jìn)行存儲(chǔ)分配:第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 (1) 首次滿足法。從表頭開(kāi)始查找可利用空間表,將找到的第一個(gè)滿足需要的空閑塊或空閑塊的一部分分配出去(當(dāng)空閑塊略大于所要求的空間時(shí),則整塊分配出去),而其余部分仍作為一個(gè)空閑塊留在表中。 (2) 最優(yōu)滿足法。系統(tǒng)掃描整個(gè)可利用空間表,從中找出一塊不小
40、于要求的最小空閑塊予以分配。為了避免每次分配都要掃描整個(gè)表,通常將空閑塊按由小到大的順序進(jìn)行排列。這樣,所找到的第一個(gè)大于或等于所需空間的空閑塊即為所求,無(wú)須再掃描整個(gè)表。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 (3) 最差滿足法。系統(tǒng)將可利用空間表中最大的空閑塊予以分配(當(dāng)然也要求其不小于所需空間的大小),這種方法應(yīng)使空閑塊按由大到小的順序排列,此時(shí)表頭的空閑塊即為所求。 最優(yōu)滿足法和最差滿足法在回收時(shí)都需將待回收的空閑塊插入到鏈表中適當(dāng)?shù)奈恢蒙先ァ5诘? 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 以上三種方法各有所長(zhǎng)。一般來(lái)說(shuō),最優(yōu)滿足法適用于請(qǐng)求分配的內(nèi)存大小范圍較廣的
41、系統(tǒng);最差滿足法適用于請(qǐng)求分配的內(nèi)存大小范圍較窄的系統(tǒng);而首次滿足法則適用于事先無(wú)法獲知請(qǐng)求分配和回收情況的系統(tǒng)。從時(shí)間上來(lái)看,最優(yōu)滿足法無(wú)論分配與回收都需要查表,故最費(fèi)時(shí)間;最差滿足法分配時(shí)無(wú)需查表,但回收時(shí)卻需查表并根據(jù)回收空閑塊的大小確定其在表中應(yīng)插入的位置;而首次滿足法在分配時(shí)需要查表,回收時(shí)直接插入到表頭即可。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 對(duì)于已分配的存儲(chǔ)塊,可以采用不同的回收策略。有的程序語(yǔ)言干脆不做回收工作,直到內(nèi)存空間用完為止;如果當(dāng)空間用完后還有分配存儲(chǔ)塊的請(qǐng)求,就停止程序的運(yùn)行。這樣做的缺點(diǎn)是浪費(fèi)空間,但如果系統(tǒng)具有海量虛存或堆中的多數(shù)數(shù)據(jù)是一分配就
42、一直使用的情形,則這種方法也是可行的。如果程序語(yǔ)言有顯式的分配命令,那么就可用顯式的回收命令(如C語(yǔ)言中的free)來(lái)回收不用的空間。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 *6.5 參數(shù)傳遞補(bǔ)遺參數(shù)傳遞補(bǔ)遺 定義和調(diào)用過(guò)程是程序語(yǔ)言的主要特征之一。過(guò)程是模塊程序設(shè)計(jì)的主要手段,同時(shí)也是節(jié)省程序代碼和擴(kuò)充語(yǔ)言能力的主要途徑。PASCAL語(yǔ)言的設(shè)計(jì)者N.Wirth曾經(jīng)說(shuō)過(guò):“在程序設(shè)計(jì)技巧中,過(guò)程是很少幾種基本工具中的一種,掌握了這種工具,就能對(duì)程序員工作的質(zhì)量和風(fēng)格產(chǎn)生決定性的影響”。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 一個(gè)過(guò)程一旦定義后,就可以在別的地方調(diào)用它
43、。調(diào)用與被調(diào)用(過(guò)程)兩者之間的信息往來(lái)通過(guò)全局量或參數(shù)傳遞。例如,下面的C語(yǔ)言程序: #include “stdio.h” void showme (int a, int b, int c) printf (“a=%d, b=%d, c=%dn”, a, b, c);第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 main () int x=10, y=20, z=30; showme (z, y, x); 就是一個(gè)含函數(shù)調(diào)用的程序。其中a、b、c稱為形式參數(shù)(簡(jiǎn)稱形參),而函數(shù)調(diào)用語(yǔ)句:showme (z, y, x)第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 中的z、y、
44、x則稱為實(shí)在參數(shù)(簡(jiǎn)稱實(shí)參)。實(shí)參甚至也可以是一個(gè)較復(fù)雜的表達(dá)式而不僅僅只是一個(gè)變量。實(shí)參和對(duì)應(yīng)的形參在性質(zhì)上應(yīng)相容不悖。 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 6.5.1 參數(shù)傳遞的方法 形式參數(shù)提供了參數(shù)替換的手段,在過(guò)程調(diào)用時(shí)可以使用不同的數(shù)據(jù)作為實(shí)在參數(shù)來(lái)替換形式參數(shù),從而實(shí)現(xiàn)了同一個(gè)過(guò)程可以對(duì)不同的實(shí)在參數(shù)進(jìn)行相同操作的功能。那么,如何把實(shí)在參數(shù)傳遞給相應(yīng)的形式參數(shù)呢?程序語(yǔ)言中參數(shù)傳遞的方式主要有傳值(call by value)、傳地址(call by reference)和傳名(call by name)三種。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織
45、 1傳值 傳值是最簡(jiǎn)單的參數(shù)傳遞方法。所謂傳值,就是計(jì)算出實(shí)在參數(shù)的值然后把它傳給被調(diào)用過(guò)程相對(duì)應(yīng)的形式參數(shù),具體過(guò)程如下: (1) 把形式參數(shù)當(dāng)作過(guò)程的局部變量處理,即在被調(diào)用過(guò)程的活動(dòng)記錄中開(kāi)辟形式參數(shù)的存儲(chǔ)空間(即形式單元)。 (2) 調(diào)用過(guò)程計(jì)算出實(shí)在參數(shù)的值,并將該值放入為形式單元開(kāi)辟的空間中。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 (3) 被調(diào)用過(guò)程執(zhí)行時(shí)就像使用局部變量一樣使用這些形式單元。 傳值的一個(gè)重要特點(diǎn)是對(duì)形式參數(shù)的任何運(yùn)算都不影響調(diào)用過(guò)程的活動(dòng)記錄中實(shí)在參數(shù)的值,即參數(shù)傳遞后實(shí)在參數(shù)與對(duì)應(yīng)的形式參數(shù)不再發(fā)生聯(lián)系了。第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存
46、儲(chǔ)空間組織 2傳地址 所謂傳地址,是指把實(shí)在參數(shù)的地址傳遞給相應(yīng)的形式參數(shù)所對(duì)應(yīng)的形式單元。如果實(shí)在參數(shù)是一個(gè)變量(包括下標(biāo)變量),則直接將該變量的地址傳給相應(yīng)的形式單元;如果實(shí)在參數(shù)是常數(shù)或表達(dá)式,則先計(jì)算其值并存放在某一臨時(shí)單元中,然后將這個(gè)臨時(shí)單元的地址傳給相應(yīng)的形式單元。被調(diào)用過(guò)程執(zhí)行時(shí),對(duì)形式參數(shù)的任何引用或賦值都被處理成對(duì)形式單元的間接訪問(wèn),即按形式單元中存放的地址轉(zhuǎn)到調(diào)用過(guò)程的活動(dòng)記錄中去訪問(wèn)實(shí)在參數(shù)。 第第6 6章章 運(yùn)行時(shí)存儲(chǔ)空間組織運(yùn)行時(shí)存儲(chǔ)空間組織 對(duì)形式參數(shù)的任何運(yùn)算實(shí)際上都是對(duì)實(shí)在參數(shù)的運(yùn)算,而形式參數(shù)只不過(guò)起到輔助查找到實(shí)在參數(shù)的指針的作用。因此,當(dāng)被調(diào)用過(guò)程工作完畢返回時(shí),形式單元所指的實(shí)在參數(shù)單元就保留了運(yùn)算的結(jié)果。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北京考貨運(yùn)資格證考試內(nèi)容
- 產(chǎn)品技術(shù)服務(wù)合同
- 信貸業(yè)務(wù)審批流程詳述
- 全新顧問(wèn)聘用協(xié)議
- 《數(shù)據(jù)可視化技術(shù)應(yīng)用》2.2 揭示商品庫(kù)存數(shù)據(jù)動(dòng)態(tài)-教案
- 2025年遼陽(yáng)道路貨運(yùn)駕駛員從業(yè)資格證考試
- 營(yíng)林生產(chǎn)松林擇間伐改造提升承攬合同6篇
- 《藥物分析》課程標(biāo)準(zhǔn)
- 駕校合伙投資合同范本
- 單位食堂聘用合同范本
- 初中英語(yǔ)語(yǔ)法時(shí)態(tài)總復(fù)習(xí)課件
- 零碳數(shù)據(jù)算力中心項(xiàng)目可行性研究報(bào)告
- 研究生復(fù)試流程
- 濰坊市2025屆高三下學(xué)期開(kāi)學(xué)考(診斷性調(diào)研監(jiān)測(cè))政治試題(含答案)
- 2025年浙江國(guó)有資本運(yùn)營(yíng)有限公司招聘筆試參考題庫(kù)含答案解析
- 人教版(2025新版)七年級(jí)下冊(cè)數(shù)學(xué)第七章 相交線與平行線 單元測(cè)試卷(含答案)
- 汽輪機(jī)輔機(jī)培訓(xùn)
- 主題班會(huì):預(yù)防流行性感冒課件
- 對(duì)外援助成套項(xiàng)目管理辦法(試行)
- 管道吹掃、試壓檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
- 教學(xué)教案、作業(yè)、記錄檢查記錄表
評(píng)論
0/150
提交評(píng)論