存儲器是個寶貴但卻有限的資源。一流的操做系統,須要可以有效地管理及利用存儲器。程序員
內存爲程序分配空間有四種分配方式:算法
一、連續分配方式編程
二、基本分頁存儲管理方式ide
三、基本分段存儲管理方式spa
四、段頁式存儲管理方式操作系統
首先講連續分配方式。連續分配方式出現的時間比較早,曾普遍應用於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)頁的大小固定且由系統決定,而段的長度卻不固定。
(3)分頁的做業地址空間是一維的,即單一的線性地址空間;而分段的做業地址空間則是二維的。
前面所介紹的分頁和分段存儲管理方式都各有優缺點。分頁系統能有效地提升內存利用率,而分段系統則能很好地知足用戶需求。咱們但願可以把二者的優勢結合,因而出現了段頁式存儲管理方式。
段頁式系統的基本原理,是分段和分頁原理的結合,即先將用戶程序分紅若干個段,再把每一個段分紅若干個頁,併爲每個段賦予一個段名。在段頁式系統中,地址結構由段號、段內頁號和頁內地址三部分所組成。
和前兩種存儲管理方式相同,段頁式存儲管理方式一樣須要增設聯想寄存器。
離散分配方式基於將一個進程直接分散地分配到許多不相鄰的分區中的思想,分爲分頁式存儲管理,分段存儲管理和段頁式存儲管理. 分頁式存儲管理旨在提升內存利用率,知足系統管理的須要,分段式存儲管理則旨在知足用戶(程序員)的須要,在實現共享和保護方面優於分頁式存儲管理,而段頁式存儲管理則是將二者結合起來,取長補短,即具備分段系統便於實現,可共享,易於保護,可動態連接等優勢,又能像分頁系統那樣很好的解決外部碎片的問題,以及爲各個分段可離散分配內存等問題,顯然是一種比較有效的存儲管理方式。