操作系統的內存管理(概念知識)

1.內存管理有哪幾種方式?
        常見的內存管理方式有塊式管理、頁式管理、段式和段頁式管理。
(1)塊式管理:把主存分爲一大塊一大塊的,當所需的程序片段不在主存時就分配一塊主存空間,把程序片段load入主存,就算所需的程序片段只有幾個字節也只能把這一塊分配給它。這樣會造成很大的浪費,平均浪費了50%的內存空間,但是易於管理。
(2)頁式管理:把主存分爲一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,這種方法的空間利用率要比塊式管理高很多
(3)段式管理:把主存分爲一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高得多,但是也有另外一個缺點。一個程序片段可能會被分爲幾十段,這樣很多時間就會被浪費在計算每一段的物理地址上。
(4)段頁式管理:結合了段式管理和頁式管理的優點。把主存先分成若干段,每個段又分成若干頁。段頁式管理每取一護具,要訪問3次內存。


2.分段和分頁的區別是什麼?
        頁是信息的物理單位,分頁是爲了實現離散分配方式,以消減內存的外零頭,提高內存的利用率;或者說,分頁僅僅是由於系統管理的需要,而不是用戶的需要。
        段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了能更好地滿足用戶的需要。頁的大小固定且由系統確定,把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,因而一個系統只能有一種大小的頁面。段的長度卻不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進程編輯時,根據信息的性質來劃分。
        分頁的作業地址空間是一維的,即單一的線性空間,程序員只需利用一個記憶符,即可表示一地址。分段的作業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。


3.什麼是虛擬內存?
        虛擬內存簡稱虛存,是計算機系統內存管理的一種技術。它是相對於物理內存而言的,可以理解爲“假的”內存。它使得應用程序認爲它擁有連續可用的內存(一個連續完整的地址空間),允許程序員編寫並允許比實際系統擁有的內存大得多的程序,這使得許多大型軟件項目能夠在具有有限內存資源的系統上實現。而實際上,它通常被分割成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數據交換。虛存比實存有以下好處:
(1) 擴大地址空間。無論段式虛存,還是頁式虛存,或是段頁式虛存,尋址空間都比實存大。
(2)內存保護。每個進程運行在各自的虛擬內存地址空間,互相不能干擾對方。另外,虛存還對特定的內存地址提供寫保護,可以防止代碼或數據被惡意篡改
(3)公平分配內存。採用了虛存之後,每個進程都相當於有太陽大小的虛存空間。
(4)當進程需要通信時,可採用虛存共享的方式實現。
不過,使用虛存也是有代價的,主要表現在以下幾個方面: 
(1)虛存的管理需要建立很多數據結構,這些數據結構要佔用額外的內存 
(2)虛擬地址到物理地址的轉換,增加了指令的執行時間 
(3)頁面的換入換出需要磁盤I/O,這是很耗時間的。 
(4)如果一頁中只有一部分數據,會很浪費內存。


4.什麼是內存碎片?什麼是內碎片?什麼是外碎片?
        內存碎片是由於多次進行內存分配造成的,當進行內存分配時,內存格式一般爲:(用戶使用段)(空白段)(用戶使用段),當空白段很小的時候可能不能提供給用戶足夠需要的空間,可能夾在中間的空白段的大小爲5,而用戶需要的內存大小爲6,這樣會產生很多的間隙造成使用效率的下降,這些很小的空隙叫碎片。
        內碎片:分配給程序的存儲空間沒有用完,有一部分是程序不使用,但其他程序也沒法用的空間。內碎片是處於區域內部或頁面內部的存儲塊,佔有這些區域或頁面的進程並不使用這個存儲塊,而在進程佔有這塊存儲塊時,系統無法利用它,直到進程釋放它,或進程結束時,系統纔有可能利用這個存儲塊。
        由於空間太小,小到無法給任何程序分配(不屬於任何進程)的存儲空間是外碎片。外部碎片是處於任何已分配區域或頁面外部的空閒存儲塊,這些存儲塊的綜合可以滿足當前申請的長度要求,但是由於它們的地址不連續或其他原因,使得系統無法滿足當前申請。
        內碎片和外碎片是一對矛盾體,一種特定的內存分配算法,很難同時解決好內碎片和外碎片問題,只能根據應用特點進行取捨。


5.虛擬地址、邏輯地址、線性地址、物理地址有什麼區別?
        虛擬地址是指由程序產生的由段選擇符合段內偏移地址組成的地址。這兩部分組成的地址並沒有直接訪問物理內存,而是要通過分段地址的變換處理後纔會對應到相應的物理內存地址。
        邏輯地址指由程序產生的段內偏移地址。有時直接把邏輯地址當成虛擬地址,兩者並沒有明確的界限。
        線性地址是指虛擬地址到物理地址變換之間的中間層,是處理器可尋址的內存空間(稱爲線性地址空間)中的地址。程序代碼會產生邏輯地址,或者說是段中的偏移地址,加上相應段基址就生成了一個線性地址。如果啓用了分頁機制,那麼線性地址可以再經過變換產生物理地址。若沒有采用分頁機制,那麼線性地址就是物理地址。
        物理地址是指限制CPU外部地址總線上的尋址物理內存的地址信號,是地址變換的最終結果。
        虛擬地址到物理地址的轉化方法是與體系結構相關的,一般有分段與分頁兩種方式。以x86CPU爲例,分段分頁都是支持的。內存管理單元負責從虛擬地址到物理地址的轉化。邏輯地址是段標識+段內偏移量的形式,MMU(Memory Management Unit內存管理單元)通過查詢段表,可以把邏輯地址轉化爲線性地址。如果CPU沒有開啓分頁功能,那麼線性地址就是物理地址;如果CPU開啓了分頁功能,MMU還需要查詢頁表來將線性地質轉化爲物理地址:邏輯地址(段表)-》線性地址(頁表)-》物理地址。
        映射是一種多對一的關係,即不同的邏輯地址可以映射到同一個線性地址上;不同的線性地址也可以映射到同一個物理地址上。而且,同一個線性地址在發生換頁以後,也可能被重新裝載到另外一個物理地址上,所以這種多對一的映射關係也會隨時間發生變化。


6.Cache替換算法有哪些?
        數據可以存放在CPU或者是內存中。CPU處理快,但是容量小;內存容量大,但是轉交給CPU處理的速度慢。爲此需要Cache(緩存)來做一個折中。最有可能的數據先從內存調入Cache,CPU再從Cache讀取數據,這樣會快許多。然而,Cache中所存放的數據不是100%有用的。CPU從Cache總讀取到有用的數據稱爲“命中”。
Cache替換算法有隨機算法、FIFO算法、LRU算法、LFU算法和OPT算法。
(1)隨機算法(RAND)。隨機算法就是用隨機數發生器產生一個要替換的塊號,將該塊替換出去,此算法簡單、易於實現,而且它不考慮Cache塊過去、現在及將來的使用情況。但是由於沒有利用上層存儲器使用的“歷史信息”、沒有根據訪存的局部性原理,故不能提高Cache的命中率,命中率較低。
(2)先進先出(FIFO)算法。先進先出(First In First Out,FIFO)算法是將最先進入Cache的信息塊替換出去。FIFO算法按調入Cache的先後決定淘汰的順序,選擇最早調入Cache的字塊進行替換,它不需要記錄各字塊的使用情況,比較容易實現,系統開銷小,其缺點是可能會把一些需要經常使用的程序可(如循環程序)也作爲最早進入Cache的塊替換掉,而且沒有根據訪存的局部性原理,故不能提高Cache的命中率。因爲最早調入的信息可能以後還要用到,或者經常要用到,如循環程序。此法簡單、方便,利用了主存的“歷史信息”,但並不能說最先進入的就不經常使用,其缺點是不能正確反映程序局部性原理,命中率不高,可能出現一種異常現象。
(3)近期最少使用(LRU)算法。近期最少使用(Least Recently Used,LRU)算法是將近期最少使用的Cache中的信息塊替換出去。該算法較先進先出算法要好一些,但此法也不能保證過去不常用將來也不常用。 
LRU算法是依據各塊使用的情況,總是選擇那個最近最少使用的塊被替換。這種方法雖然比較好地反映了程序局部性規律,但是這種替換方法需要隨時記錄Cache中各塊的使用情況,以便確定哪個塊是近期最少使用的塊。LRU算法相對合理,但實現起來比較複雜,系統開銷較大。通常需要對每一塊設置一個稱爲計數器的硬件或軟件模塊,用以記錄其被使用的情況。
實現LRU策略的方法有很多種。簡單介紹計數器法、寄存器棧法及硬件邏輯比較對法的設計思路。
計數器法:緩存的每一塊都設置一個計數器。計數器的操作規則如下:
被調入或者被替換的塊,其計數器清0,而其他的計數器則加1
當訪問命中時,所有塊的計數值與命中塊的計數值要進行比較,如果計數值小於命中塊的計數值,則該塊的計數值加”1”;如果塊的計數值大於命中塊的計數值,則數值不變。最後將命中塊的計數器清爲“0”
需要替換時,則選擇計數值最大的塊被替換。
(4)最優替換算法(OPT算法)。使用最優替換算法(OPTimal replacement Algorithm)時必須先執行一次程序,統計Cache的替換情況。有了這樣的先驗信息,在第二次執行該程序時便可以用最有效的方式來替換,以達到最優的目的。
前面介紹的幾種頁面替換算法主要是以主存儲器中頁面調度情況的歷史信息爲依據的,它假設將來主存儲器中的頁面調度情況與過去一段時間內主存儲器中的頁面調度情況是相同的,顯然,這種假設不總是正確的。最好的算法應該是選擇將來最久不被訪問的頁面作爲被替換的頁面,這種替換算法的命中率一定是最高的,它就是最優替換算法。
要實現OPT算法,唯一的辦法是讓程序先執行一遍,記錄下實際的頁地址流情況。根據這個頁地址流才能找出當前要被替換的頁面。顯然,這樣做是不現實的。因此,OPT算法只是一種理想化的算法,然而它也是一種很有用的算法。實際上,經常把這種算法用來作爲評價其他頁面替換算法好壞的標準。在其他條件相同的情況下,哪一種頁面替換算法的命中率與OPT算法最接近,那麼它就是一種比較好的頁面替換算法。

(5)最少使用算法(LFU算法 Least Frequently Used Algorithm)。選擇最少訪問的頁面作爲被替換的頁面。顯然,這是一種合理的算法,因爲到目前爲止最少使用的頁面,很可能是將來最少訪問的頁面。該算法既充分利用了主存中頁面調度情況的歷史信息,又正確反映了程序的局部性。但是,這種算法實現起來非常困難,它要爲每個頁面設置一個很長的計數器,並且要選擇一個固定的時鐘爲每個計數器定時計數。在選擇被替換頁面時,要從所有計數器中找出一個計數器值最大的計數器。


--------------------------------------------------------------------------------


參考文章出處:

http://m.blog.csdn.net/article/details?id=51536771


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章