記憶體管理記憶體管理的主要任務有以下幾點:
虛擬記憶體是說程式直接存取的記憶體不再是實體記憶體的位址,以 x86 為例,在 DOS下的程式,它可以自由地在某一記憶體位址中填入任何一個值,例如在 1000:0000 這個byte上填入 ff。但是在多工的系統中這麼做很容易引起衝突,例如當同時有兩個程式同要在同一個位址上填值時,它們不當會改寫對方的資料,。但是程式若以合法的方式要求在某一個地址作存取時,作業系統應該要儘量滿足這種要求,解決的方法就是讓程式看到的位址不再是實體記憶體的位址,程式可以要求存取任一個可能的記憶位址(稱為邏輯位址),但是當它把這個要求送出來時,作業系統和硬體的配合,會把這個位址轉換成作業系統之前為它保留的記憶區塊裡(實體位址),所以對不同的程式,儘管存取同一邏輯記憶位址,作業系統會把它們指到不同的實體記憶位址上,因此不再有衝突。這整過程對程式而言都是透明的,它們不知道位址被改過。這種轉換的機置會讓系統的效率降低,但是卻是多工系統不可或缺的。 分頁是以頁為記憶體管理的單位,目前大多數 CPU 都支援這種機制,在 x86 平台上,一頁是 4K bytes,在 alpha 平台上是 8K bytes,因此在 x86 平台上,64MB 的記憶體相當於16000 頁。分頁機制是讓記憶體的配置以頁為單位,例如程式向作業系統要 5K bytes 的記憶空間時,作業系統就會給它兩頁的記憶體(因為一頁太少了,不夠用)。很明顯地,這種機制非常浪費(在上面的例子中,有 3K bytes 的記憶體浪費了),因此 Linux 2.2版後提供另一種稱為 SLAB 的機制,它為許多小量的記憶體或常用的資料結構分別成立一些 cache,因此當程式要求這些記憶體時,作業系統就給它合適的記憶體,不必再給一整頁的記憶區塊,因而提高記憶體的使用效率。分頁機制亦是常見實作虛擬記憶體的方式,它讓邏輯位址和實體位址的轉換以頁為單位,當程式向作業系統要求記憶體,作業系統在給予某頁時,同時也把邏輯位址和實體位址的轉換建立起來。 為再加提高效率,程式向作業系統要求記憶時,作業系統會先向程式回應 OK,但並不馬上配置記憶體,直到程式真的要存取這塊記憶體了,作業系統才會配置這塊記憶體。 現在我們可以回應本節開頭提到的記憶體管理的主要任務:
Linux 的記憶體管理中還有一個很重要的機制,稱為記憶置換 (swapper),這是當實體記憶體不足時,例如原本記憶就不多或是正在執行一個大程式,如果又有程式要求配置記憶體,作業系統會把不常存取的記憶頁的內容先存到硬碟裡,把這頁實體記憶體拿來滿足程式的要求。之後若有程式要存取被置換到硬碟的那一頁記憶體內容,作業系統就會把它讀回來,但是放在那裡?是否須要放到原來的實體位址上,不用,那裡有空位就放那裡,只要把邏輯位址和實體位址的對應改一下即可,這裡可以看出虛擬記憶體的好處,若是實體記憶體仍然吃緊,找不出空位,那只好找另一個不常用的記憶頁,請它暫時到硬碟去,位置空出來給這筆急用的資料了。 |