作業系統記憶體管理之 內部碎片vs外部碎片
“碎片的記憶體”描述一個系統中所有不可用的空閒記憶體。這些資源之所以仍然未被使用,是因為負責分配記憶體的分配器使這些記憶體無法使用。這一問題通常都會發生,原因在於空閒記憶體以小而不連續方式出現在不同的位置。由於分 配方法決定記憶體碎片是否是一個問題,因此記憶體分配器在保證空閒資源可用性方面扮演著重要的角色。
internal fragmentation:when memory allocated to a process is larger than requested memory,
the difference between these two numbers is internal fragmentation.
external fragmentation:External fragments exists when total memory space exists to satisfy a request,
but it is not continous. storage is broken into little pieces.
在記憶體管理中,內部碎片是已經被分配出去的的記憶體空間大於請求所需的記憶體空間。
外部碎片是指還沒有分配出去,但是由於大小太小而無法分配給申請空間的新程序的記憶體空間空閒塊。
固定分割槽存在內部碎片,可變式分割槽分配會存在外部碎片;
頁式虛擬儲存系統存在內部碎片;段式虛擬儲存系統,存在外部碎片
為了有效的利用記憶體,使記憶體產生更少的碎片,要對記憶體分頁,記憶體以頁為單位來使用,最後一頁往往裝不滿,於是形成了內部碎片。
為了共享要分段,在段的換入換出時形成外部碎片,比如5K的段換出後,有一個4k的段進來放到原來5k的地方,於是形成1k的外部碎片。
---------------------------------------------------------------------------------------------------------
儲存器是個寶貴但卻有限的資源。一流的作業系統,需要能夠有效地管理及利用儲存器。
記憶體為程式分配空間有四種分配方式:
1、連續分配方式
2、基本分頁儲存管理方式
3、基本分段儲存管理方式
4、段頁式儲存管理方式
連續分配方式
首先講連續分配方式。連續分配方式出現的時間比較早,曾廣泛應用於20世紀60~70年代的OS中,但是它至今仍然在記憶體管理方式中佔有一席之地,原因在於它實現起來比較方便,所需的硬體支援最少。連續分配方式又可細分為四種:單一連續分配、固定分割槽分配、動態分割槽分配和動態重定位分割槽分配。
其中固定分割槽分配方式,因為分割槽固定,所以缺乏靈活性,即當程式太小時,會造成記憶體空間的浪費;程式太大時,一個分割槽又不足以容納,致使程式無法執行。但儘管如此,當一臺計算機去控制多個相同物件的時候,由於這些物件記憶體大小相同,所以完全可以採用這種記憶體管理方式,而且是最高效的。這裡我們可以看出儲存器管理機制的多面性:即沒有那種儲存器管理機制是完全沒有用的,在適合的場合下,一種被認為最不合理的分配方案卻可能稱為最高效的分配方案。一切都要從實際問題出發,進行設計。
為了解決固定分割槽分配方式的缺乏靈活性,出現了動態分配方式。動態分配方式採用一些尋表的方式,查詢能符合程式需要的空閒記憶體分割槽。但代價是增加了系統執行的開銷,而且記憶體空閒表本身是一個檔案,必然會佔用一部分寶貴的記憶體資源,而且有些演算法還會增加記憶體碎片。
可重定位分割槽分配通過對程式實現成定位,從而可以將記憶體塊進行搬移,將小塊拼成大塊,將小空閒“緊湊”成大空閒,騰出較大的記憶體以容納新的程式程序。
基本分頁儲存管理方式
連續分配方式會形成許多“碎片”,雖然可以通過“緊湊”方式將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。所以提出了“離散分配方式”的想法。如果離散分配的基本單位是頁,則稱為分頁管理方式;如果離散分配的基本單位是段,則稱為分段管理方式。
分頁儲存管理是將一個程序的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,併為各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把記憶體空間分成與頁面相同大小的若干個儲存塊,稱為(物理)塊或頁框(frame),也同樣為它們加以編號,如0#塊、1#塊等等。在為程序分配記憶體時,以塊為單位將程序中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於程序的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為“頁內碎片”。
在分頁系統中,允許將程序的各個頁離散地儲存在記憶體不同的物理塊中,但系統應能保證程序的正確執行,即能在記憶體中找到每個頁面所對應的物理塊。為此,系統又為每個程序建立了一張頁面映像表,簡稱頁表。在程序地址空間內的所有頁,依次在頁表中有一頁表項,其中記錄了相應頁在記憶體中對應的物理塊號。在配置了頁表後,程序執行時,通過查詢該表,即可找到每頁在記憶體中的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的地址對映。
為了能夠將使用者地址空間中的邏輯地址,變換為記憶體空間中的實體地址,在系統中必須設定地址變換機構。地址變換任務是藉助於頁表來完成的。
頁表的功能可由一組專門的暫存器來實現。由於暫存器成本較高,且大多數現代計算機的頁表又很大,使頁表項總數可達幾千甚至幾十萬個,顯然這些頁表項不可能都用暫存器來實現,因此,頁表大多駐留在記憶體中。因為一個程序可以通過它的PCB來時時儲存自己的狀態,等到CPU要處理它的時候才將PCB交給暫存器,所以,系統中雖然可以執行多個程序,但也只需要一個頁表暫存器就可以了。
由於頁表是存放在記憶體中的,這使得CPU在每存取一個數據時,都要兩次訪問記憶體。為了提高地址變換速度,在地址變化機構中增設了一個具有並行查詢能力的告訴緩衝暫存器,又稱為“聯想暫存器”(Associative Lookaside Buffer)。
在單級頁表的基礎上,為了適應非常大的邏輯地址空間,出現了兩級和多級頁表,但是,他們的原理和單級頁表是一樣的,只不過為了適應地址變換層次的增加,需要在地址變換機構中增設外層的頁表暫存器。
基本分段儲存管理方式
分段儲存管理方式的目的,主要是為了滿足使用者(程式設計師)在程式設計和使用上多方面的要求,其中有些要求是其他幾種儲存管理方式所難以滿足的。因此,這種儲存管理方式已成為當今所有儲存管理方式的基礎。
(1)方便程式設計;
(2)資訊共享:分頁系統中的“頁”只是存放資訊的物理單位(塊),並無完整的意義,不便於實現共享;然而段卻是資訊的邏輯單位。由此可知,為了實現段的共享,希望儲存器管理能與使用者程式分段的組織方式相適應。
(3)資訊保護;
(4)動態增長;
(5)動態連結。
分段管理方式和分頁管理方式在實現思路上是很相似的,只不過他們的基本單位不同。分段有段表,也有地址變換機構,為了提高檢索速度,同樣增設聯想暫存器。所以有些具體細節在這個不再贅述。
分頁和分段的主要區別:
1、兩者相似之處:兩者都採用離散分配方式,且都要通過地址對映機構來實現地址變換。
2、兩者不同之處:
(1)頁是資訊的物理單位,分頁是為實現離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率。或者說,分頁僅僅是由於系統管理的需要而不是 使用者的需要。段則是資訊的邏輯單位,它含有一組其意義相對完整的資訊。分段的目的是為了能更好地滿足使用者的需要。
(2)頁的大小固定且由系統決定,而段的長度卻不固定。
(3)分頁的作業地址空間是一維的,即單一的線性地址空間;而分段的作業地址空間則是二維的。
段頁式儲存管理方式
前面所介紹的分頁和分段儲存管理方式都各有優缺點。分頁系統能有效地提高記憶體利用率,而分段系統則能很好地滿足使用者需求。我們希望能夠把兩者的優點結合,於是出現了段頁式儲存管理方式。
段頁式系統的基本原理,是分段和分頁原理的結合,即先將使用者程式分成若干個段,再把每個段分成若干個頁,併為每一個段賦予一個段名。在段頁式系統中,地址結構由段號、段內頁號和頁內地址三部分所組成。
和前兩種儲存管理方式相同,段頁式儲存管理方式同樣需要增設聯想暫存器。
離散分配方式基於將一個程序直接分散地分配到許多不相鄰的分割槽中的思想,分為分頁式儲存管理,分段儲存管理和段頁式儲存管理.
分頁式儲存管理旨在提高記憶體利用率,滿足系統管理的需要,分段式儲存管理則旨在滿足使用者(程式設計師)的需要,在實現共享和保護方面優於分頁式儲存管理,而段頁式儲存管理則是將兩者結合起來,取長補短,即具有分段系統便於實現,可共享,易於保護,可動態連結等優點,又能像分頁系統那樣很好的解決外部碎片的問題,以及為各個分段可離散分配記憶體等問題,顯然是一種比較有效的儲存管理方式。