源程式記憶體要求

源程式記憶體要求

源程式是指未經編譯的,按照一定的程式設計語言規範書寫的,人類可讀的文本檔案。源程式記憶體要求是指源程式經編譯變成目標程式調入記憶體運行時,程式需要記憶體空間的大小。這主要與程式的性質和記憶體分配方式有關。

簡介

源程式記憶體要求簡單來說即源程式運行時所需要的空間大小,一般有兩種解釋:1、源程式運行時所需要的最小記憶體要求;2、源程式運行時所需要最大記憶體要求。現在作業系統中一般都運行著多個程式,一般不可能滿足一個源程式最大記憶體要求,因為記憶體大小是有限的。現在所指源程式記憶體要求一般是指最小記憶體要求,這主要是基於程式局部性原理。

有關術語

記憶體

記憶體是計算機中重要的部件之一,它是與CPU進行溝通的橋樑。計算機中所有程式的運行都是在記憶體中進行的,因此記憶體的性能對計算機的影響非常大。記憶體(Memory)也被稱為記憶體儲器,其作用是用於暫時存放CPU中的運算數據,以及與硬碟等外部存儲器交換的數據。只要計算機在運行中,CPU就會把需要運算的數據調到記憶體中進行運算,當運算完成後CPU再將結果傳送出來,記憶體的運行也決定了計算機的穩定運行。 記憶體是由記憶體晶片、電路板、金手指等部分組成的。

源檔案

這是指由源程式和數據構成的檔案。通常由終端或輸入設備輸入的源程式和數據所形成的檔案都屬於源檔案。它通常是由 ASCII 碼或漢字所組成的。

目標檔案

這是指把源程式經過相應語言的編譯程式編譯過,但尚未經過連結程式連結的目標代碼所構成的檔案。它屬於二進制檔案。通常,目標檔案所使用的後綴名是“.obj” 。

執行檔

這是指把編譯後所產生的目標代碼再經過連結程式連結後所形成的檔案。

源程式進入記憶體過程

在多道程式環境下,要使程式運行,必須先為之創建進程。而創建進程的第一件事,便是將程式和數據裝入記憶體。如何將一個用戶源程式變為一個可在記憶體中執行的程式,通常都要經過以下幾個步驟:首先是要編譯,由編譯程式(Compiler)將用戶原始碼編譯成若干個目標模組(Object Module);其次是連結,由連結程式(Linker)將編譯後形成的一組目標模組,以及它們所需要的庫函式連結在一起,形成一個完整的裝入模組(Load Module);最後是裝入,由裝入程式(Loader)將裝入模組裝入記憶體 。

程式局部性原理

早在 1968 年,Denning.P 就曾指出:程式在執行時將呈現出局部性規律,即在一較短的時間內,程式的執行僅局限於某個部分;相應地,它所訪問的存儲空間也局限於某個區域。他提出了下述幾個論點:

(1) 程式執行時,除了少部分的轉移和過程調用指令外,在大多數情況下仍是順序執行的。該論點也在後來的許多學者對高級程式設計語言(如 FORTRAN 語言、PASCAL 語言)及 C 語言規律的研究中被證實。

(2) 過程調用將會使程式的執行軌跡由一部分區域轉至另一部分區域,但經研究看出,過程調用的深度在大多數情況下都不超過 5。這就是說,程式將會在一段時間內都局限在這些過程的範圍內運行。

(3) 程式中存在許多循環結構,這些雖然只由少數指令構成,但是它們將多次執行。

(4) 程式中還包括許多對數據結構的處理,如對數組進行操作,它們往往都局限於很小的範圍內。

局限性還表現在下述兩個方面:

(1) 時間局限性。如果程式中的某條指令一旦執行,則不久以後該指令可能再次執行;如果某數據被訪問過,則不久以後該數據可能再次被訪問。產生時間局限性的典型原因是由於在程式中存在著大量的循環操作。

(2) 空間局限性。一旦程式訪問了某個存儲單元,在不久之後,其附近的存儲單元也將被訪問,即程式在一段時間內所訪問的地址,可能集中在一定的範圍之內,其典型情況便是程式的順序執行。

源程式記憶體請求分配方式

虛擬存儲器的實現方法

在虛擬存儲器中,允許將一個作業分多次調入記憶體。如果採用連續分配方式時,應將作業裝入一個連續的記憶體區域中。為此,須事先為它一次性地申請足夠的記憶體空間,以便將整個作業先後分多次裝入記憶體。這不僅會使相當一部分記憶體空間都處於暫時或“永久”的空閒狀態,造成記憶體資源的嚴重浪費,而且也無法從邏輯上擴大記憶體容量。因此,虛擬存儲器的實現,都毫無例外地建立在離散分配的存儲管理方式的基礎上。

單一連續分配

這是最簡單的一種存儲管理方式,但只能用於單用戶、單任務的作業系統中。採用這種存儲管理方式時,可把記憶體分為系統區和用戶區兩部分,系統區僅提供給 OS 使用,通常是放在記憶體的低址部分;用戶區是指除系統區以外的全部記憶體空間,提供給用戶使用。雖然在早期的單用戶、單任務作業系統中,有不少都配置了存儲器保護機構,用於防止用戶程式對作業系統的破壞, 但近年來常見的幾種單用戶作業系統中, 如 CP/M、 MS-DOS及 RT11 等,都未採取存儲器保護措施。這是因為,一方面可以節省硬體,另一方面也因為這是可行的。在單用戶環境下,機器由一用戶獨占,不可能存在其他用戶干擾的問題;這時可能出現的破壞行為也只是用戶程式自己去破壞作業系統,其後果並不嚴重,只是會影響該用戶程式的運行,且作業系統也很容易通過系統的再啟動而重新裝入記憶體。

固定分區分配

固定分區式分配是最簡單的一種可運行多道程式的存儲管理方式。這是將記憶體用戶空間劃分為若干個固定大小的區域,在每個分區中只裝入一道作業,這樣,把用戶空間劃分為幾個分區,便允許有幾道作業並發運行。當有一空閒分區時,便可以再從外存的後備作業佇列中選擇一個適當大小的作業裝入該分區,當該作業結束時,又可再從後備作業佇列中找出另一作業調入該分區。

可用下述兩種方法將記憶體的用戶空間劃分為若干個固定大小的分區:

(1) 分區大小相等,即使所有的記憶體分區大小相等。其缺點是缺乏靈活性,即當程式太小時,會造成記憶體空間的浪費;當程式太大時,一個分區又不足以裝入該程式,致使該程式無法運行。儘管如此,這種劃分方式仍被用於利用一台計算機去控制多個相同對象的場合,因為這些對象所需的記憶體空間是大小相等的。例如,爐溫群控系統,就是利用一台計算機去控制多台相同的冶煉爐。

(2) 分區大小不等。為了克服分區大小相等而缺乏靈活性的這個缺點,可把記憶體區劃分成含有多個較小的分區、適量的中等分區及少量的大分區。這樣,便可根據程式的大小為之分配適當的分區。

相關詞條

熱門詞條

聯絡我們