存儲器是個寶貴但卻有限的資源。一流的操作系統,需要能夠有效地管理及利用存儲器。
內存為程序分配空間有四種分配方式:
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)動態鏈接。
分段管理方式和分頁管理方式在實現思路上是很相似的,只不過他們的基本單位不同。分段有段表,也有地址變換機構,為了提高檢索速度,同樣增設聯想寄存器(具有並行查詢能力的告訴緩沖寄存器)。所以有些具體細節在這個不再贅述。
分頁和分段的主要區別:
1、兩者相似之處:兩者都采用離散分配方式,且都要通過地址映射機構來實現地址變換。
2、兩者不同之處:
(1)頁是信息的物理單位,分頁是為實現離散分配方式,以消減內存的外零頭,提高內存的利用率。或者說,分頁僅僅是由於系統管理的需要而不是用戶的需要。段則是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是為了能更好地滿足用戶的需要。
(2)頁的大小固定且由系統決定,而段的長度卻不固定。
(3)分頁的作業地址空間是一維的,即單一的線性地址空間;而分段的作業地址空間則是二維的。
段頁式存儲管理方式
前面所介紹的分頁和分段存儲管理方式都各有優缺點。分頁系統能有效地提高內存利用率,而分段系統則能很好地滿足用戶需求。我們希望能夠把兩者的優點結合,於是出現了段頁式存儲管理方式。
段頁式系統的基本原理,是分段和分頁原理的結合,即先將用戶程序分成若干個段,再把每個段分成若干個頁,並為每一個段賦予一個段名。在段頁式系統中,地址結構由段號、段內頁號和頁內地址三部分所組成。
和前兩種存儲管理方式相同,段頁式存儲管理方式同樣需要增設聯想寄存器。
離散分配方式基於將一個進程直接分散地分配到許多不相鄰的分區中的思想,分為分頁式存儲管理,分段存儲管理和段頁式存儲管理. 分頁式存儲管理旨在提高內存利用率,滿足系統管理的需要,分段式存儲管理則旨在滿足用戶(程序員)的需要,在實現共享和保護方面優於分頁式存儲管理,而段頁式存儲管理則是將兩者結合起來,取長補短,即具有分段系統便於實現,可共享,易於保護,可動態鏈接等優點,又能像分頁系統那樣很好的解決外部碎片的問題,以及為各個分段可離散分配內存等問題,顯然是一種比較有效的存儲管理方式。