記憶體為程式分配空間的四種分配方式

2022-09-15 09:09:12 字數 3689 閱讀 3357

儲存器是個寶貴但卻有限的資源。一流的作業系統,需要能夠有效地管理及利用儲存器。

記憶體為程式分配空間有四種分配方式:

1、連續分配方式

2、基本分頁儲存管理方式

3、基本分段儲存管理方式

4、段頁式儲存管理方式

首先講連續分配方式。連續分配方式出現的時間比較早,曾廣泛應用於20世紀60~70年代的os中,但是它至今仍然在記憶體管理方式中占有一席之地,原因在於它實現起來比較方便,所需的硬體支援最少。連續分配方式又可細分為四種:單一連續分配、固定分割槽分配、動態分割槽分配和動態重定位分割槽分配

其中固定分割槽分配方式,因為分割槽固定,所以缺乏靈活性,即當程式太小時,會造成記憶體空間的浪費(內部碎片)程式太大時,乙個分割槽又不足以容納,致使程式無法執行(外部碎片)。但儘管如此,當一台計算機去控制多個相同物件的時候,由於這些物件記憶體大小相同,所以完全可以採用這種記憶體管理方式,而且是最高效的。這裡我們可以看出儲存器管理機制的多面性:即沒有那種儲存器管理機制是完全沒有用的,在適合的場合下,一種被認為最不合理的分配方案卻可能稱為最高效的分配方案。一切都要從實際問題出發,進行設計。

為了解決固定分割槽分配方式的缺乏靈活性,出現了動態分配方式。動態分配方式採用一些尋表(eg:空閒鍊錶)的方式,查詢能符合程式需要的空閒記憶體分割槽。但代價是增加了系統執行的開銷,而且記憶體空閒表本身是乙個檔案,必然會占用一部分寶貴的記憶體資源,而且有些演算法還會增加記憶體碎片。

可重定位分割槽分配通過對程式實現成定位,從而可以將記憶體塊進行搬移,將小塊拼成大塊,將小空閒「緊湊」成大空閒,騰出較大的記憶體以容納新的程式程序。

連續分配方式會形成許多「碎片」,雖然可以通過「緊湊」方式將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。所以提出了「離散分配方式」的想法。如果離散分配的基本單位是頁,則稱為分頁管理方式;如果離散分配的基本單位是段,則稱為分段管理方式

分頁儲存管理是將乙個程序的邏輯位址空間分成若干個大小相等的片,稱為頁面或頁,並為各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把記憶體空間分成與頁面相同大小的若干個儲存塊,稱為(物理)塊或頁框(frame),也同樣為它們加以編號,如0#塊、1#塊等等。在為程序分配記憶體時,以塊為單位將程序中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於程序的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為「頁內碎片」。

在分頁系統中,允許將程序的各個頁離散地儲存在記憶體不同的物理塊中(所以能實現離散分配方式),但系統應能保證程序的正確執行,即能在記憶體中找到每個頁面所對應的物理塊。為此,系統又為每個程序建立了一張頁面映像表,簡稱頁表。在程序位址空間內的所有頁,依次在頁表中有一頁表項,其中記錄了相應頁在記憶體中對應的物理塊號。在配置了頁表後,程序執行時,通過查詢該錶,即可找到每頁在記憶體中的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的位址對映

為了能夠將使用者位址空間中的邏輯位址,變換為記憶體空間中的實體地址,在系統中必須設定位址變換機構。位址變換任務是借助於頁表來完成的。

頁表的功能可由一組專門的暫存器來實現。由於暫存器成本較高,且大多數現代計算機的頁表又很大,使頁表項總數可達幾千甚至幾十萬個,顯然這些頁表項不可能都用暫存器來實現,因此,頁表大多駐留在記憶體中。因為乙個程序可以通過它的pcb來時時儲存自己的狀態,等到cpu要處理它的時候才將pcb交給暫存器,所以,系統中雖然可以執行多個程序,但也只需要乙個頁表暫存器就可以了。

由於頁表是存放在記憶體中的,這使得cpu在每訪問乙個資料時,都要兩次訪問記憶體。為了提高位址變換速度,在位址變化機構中增設了乙個具有並行查詢能力的告訴緩衝暫存器,又稱為「聯想暫存器」(associative lookaside buffer)。

在單級頁表的基礎上,為了適應非常大的邏輯位址空間,出現了兩級和多級頁表,但是,他們的原理和單級頁表是一樣的,只不過為了適應位址變換層次的增加,需要在位址變換機構中增設外層的頁表暫存器。

分段儲存管理方式的目的,主要是為了滿足使用者(程式設計師)在程式設計和使用上多方面的要求,其中有些要求是其他幾種儲存管理方式所難以滿足的。因此,這種儲存管理方式已成為當今所有儲存管理方式的基礎。

(1)方便程式設計;

(2)資訊共享:分頁系統中的「頁」只是存放資訊的物理單位(塊),並無完整的意義,不便於實現共享;然而段卻是資訊的邏輯單位。由此可知,為了實現段的共享,希望儲存器管理能與使用者程式分段的組織方式相適應。

(3)資訊保護;

(4)動態增長

(5)動態鏈結

分段管理方式和分頁管理方式在實現思路上是很相似的,只不過他們的基本單位不同。分段有段表,也有位址變換機構,為了提高檢索速度,同樣增設聯想暫存器(具有並行查詢能力的告訴緩衝暫存器

。所以有些具體細節在這個不再贅述。

分頁和分段的主要區別:

。2、兩者不同之處:

(1)頁是資訊的物理單位,分頁是為實現離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率。或者說,分頁僅僅是由於系統管理的需要而不是使用者的需要。段則是資訊的邏輯單位,它含有一組其意義相對完整的資訊。分段的目的是為了能更好地滿足使用者的需要

(2)頁的大小固定且由系統決定,而段的長度卻不固定

(3)分頁的作業位址空間是一維的,即單一的線性位址空間;而分段的作業位址空間則是二維的。

前面所介紹的分頁和分段儲存管理方式都各有優缺點。分頁系統能有效地提高記憶體利用率,而分段系統則能很好地滿足使用者需求。我們希望能夠把兩者的優點結合,於是出現了段頁式儲存管理方式。

段頁式系統的基本原理,是分段和分頁原理的結合,即先將使用者程式分成若干個段,再把每個段分成若干個頁,並為每乙個段賦予乙個段名。在段頁式系統中,位址結構由段號、段內頁號和頁內位址三部分所組成。

和前兩種儲存管理方式相同,段頁式儲存管理方式同樣需要增設聯想暫存器。

離散分配方式基於將乙個程序直接分散地分配到許多不相鄰的分割槽中的思想,分為分頁式儲存管理,分段儲存管理和段頁式儲存管理. 分頁式儲存管理旨在提高記憶體利用率,滿足系統管理的需要,分段式儲存管理則旨在滿足使用者(程式設計師)的需要,在實現共享和保護方面優於分頁式儲存管理,而段頁式儲存管理則是將兩者結合起來,取長補短,即具有分段系統便於實現,可共享,易於保護,可動態鏈結等優點,又能像分頁系統那樣很好的解決外部碎片的問題,以及為各個分段可離散分配記憶體等問題,顯然是一種比較有效的儲存管理方式。

C 中四種記憶體分配方式

四種記憶體分配方式 1.堆heap 程式設計師手動分配和釋放的,malloc free,new delete 2.棧stack 由編譯器自動分配和釋放,用於存放區域性變數和引數 3.全域性 靜態區 存放全域性變數和靜態變數,在程式編譯時分配 4.文字常量區 存放常量字串 stack和heap的比較 ...

cpp 四種分配記憶體方法

1 malloc 函式 void malloc unsigned int size 在記憶體的動態分配區域中分配乙個長度為size的連續空間,如果分配成功,則返回所分配記憶體空間的首位址,否則返回null,申請的記憶體不會進行初始化。2 calloc 函式 void calloc unsigned ...

C C 程式記憶體分配方式

1.記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內...