不會產生內部碎片的儲存管理是:分段式儲存管理。在分段儲存管理方式中,作業的位址空間被劃分為若干個段,每個段定義了一組邏輯資訊。每個段落都從0開始編址,並採用一段連續的位址空間。整個作業的地址空間由於是分成多個段,因而是二維的。
不會產生內部碎片的儲存管理是:分段式儲存管理。分頁式儲存管理才有內部碎片,分段式儲存管理有外部碎片。
分頁式儲存管理
#分頁儲存管理是將一個行程的邏輯位址空間分成若干個大小相等的片,稱為頁或頁,並為各頁加以編號,從0開始,如第0頁、第1頁等。
對應地,也把記憶體空間分成與頁面相同大小的若干個儲存區塊,稱為(物理)區塊或頁框(frame),也同樣為它們加以編號,如0#區塊、1 #塊等等。在為進程分配記憶體時,以區塊為單位將進程中的若干個頁分別裝入到多個可以不相鄰接的實體區塊中。由於進程的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為「頁內碎片」。
分段式儲存管理
引入分段儲存管理方式的目的,則主要是為了滿足使用者(程式設計師)在編程和使用上多方面的要求,其中有些要求是其它幾種儲存管理方式所難以滿足的。因此,這種儲存管理方式已成為當今所有儲存管理方式的基礎。
在分段儲存管理方式中,作業的位址空間被分割為若干個段,每個段定義了一組邏輯資訊。例如,有主程式段MAIN、子程式段X、資料段D及棧段S等。每個段都有自己的名字。為了實現簡單起見,通常可用一個段號來代替段名,每個段都從0開始編址,並採用一段連續的地址空間。段的長度由對應的邏輯資訊組的長度決定,因而各段長度不等。整個作業的位址空間由於是分成多個段,因而是二維的,亦即,其邏輯位址由段號(段名)和段內位址所組成。
分段位址中的位址具有如下結構:
在該位址結構中,允許一個作業最長有64 K個段,每個段的最大長度為64 KB。 分段方式已得到許多編譯程式的支持,編譯程式能自動地根據原始程式的情況而產生若干個段。例如,Pascal編譯程式可以為全域變數、用於儲存對應參數及傳回位址的過程呼叫堆疊、每個流程或函數的程式碼部分、每個流程或函數的局部變數等等,分別建立各自的區段。類似地,Fortran編譯程式可以為公用區塊(Common block)建立單獨的段,也可以為陣列分配一個單獨的段。裝入程式將裝入所有這些段,並為每個段賦予一個段號。
引入分段儲存管理方式,主要是為了滿足使用者和程式設計師的下述一系列需求:
1) 方便程式設計
#通常,使用者會把自己的作業依照邏輯關係劃分為若干個段,每個段落都是從0開始編址,有自己的名字和長度。因此,希望要存取的邏輯位址是由段名(段號)和段內偏移量(段內位址)決定的。例如,下述的兩個指令是使用段名和段內位址:
LOAD 1,[A] |〈D〉;
STORE 1,[B] |〈C〉 ;
其中,前一條指令的意思是將分段A中D單元內的值讀入暫存器1;後一條指令的意思是將暫存器1的內容存入B分段的C單元中。
2) 資訊共享
在實現對程式和資料的共享時,是以資訊的邏輯單位為基礎的。例如,共享某個例程和函數。分頁系統中的「頁」只是存放資訊的實體單位(塊),並無完整的意義,不便於實現共享;然而段卻是資訊的邏輯單位。由此可知,為了實現段的共享,希望儲存管理能與使用者程式分段的組織方式相適應。
3) 資訊保護
資訊保護同樣是對資訊的邏輯單位進行保護,因此,分段管理方式能更有效且方便地實現資訊保護功能。
4) 動態成長
在實際應用中,往往有些段,特別是資料段,在使用過程中會不斷地成長,而事先又無法確切地知道資料段會成長到多大。前述的其它幾種儲存管理方式,都難以應付這種動態成長的情況,而分段儲存管理方式卻能較好地解決這個問題。
5) 動態連結
動態連結是指在作業運行之前,並沒有把幾個目標程式段連結起來。要執行時,先將主程式所對應的目標程式裝入記憶體並啟動運行,當運行過程中又需要呼叫某段時,才將該段(目標程式)調入記憶體並進行連結。可見,動態連結也要求以段落作為管理的單位。
更多相關知識,請造訪:PHP中文網!
以上是不會產生內部碎片的儲存管理是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!