萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> 讀核日記(七)

讀核日記(七)

class="21793">

內存管理是一個操作系統必不可少.並且.非常重要的一環.linux的成功.和它優秀的內存管理聯系非常密切.因為一個系統的高效性欲穩定性往往決定於它的內存管理機制.我項很多人吃過dos下640k 的苦吧.

前面我們介紹了386保護模式.從今天起我們將在此基礎上,分析linux的虛擬存儲管理,對每個程序員來說.他們都希望有無窮大的快速的內存,然而,現階段是不可能的,況且,無窮大與快速本身就可能矛盾

為了解決無窮大.linux 引入了虛擬存儲系統,為了解決快速,linux 引入了cache ,交換機制等等,以使的存儲系統,在容量上接近硬盤,速度上接近cache.(當然,我認為這是存儲系統的實際目的).

Linux 的內存管理采取的是分頁機制.它的設計目的是分時多任務.linux 可同時處理256個任務(這應該與某個變量來定義,一時想不起來).同時它采用了兩級飽和機制來分別內核進程與用戶進程.

在386 保護模式的0-4G 的線性虛擬地址中,3-4G 是留給內核進程的.而0-3G分給用戶進程.內核在內核空間的尋址不同於用戶進程在用戶空間的尋址.因為內核是在啟動時裝入內存的.說以它可以直接吧地址映射到3G 以上.用戶若想訪問內核就不許通過swapper_pg_div 中的指針來得到頁表.

相反,用戶進程,在用戶空間的尋址是通過所用戶頁目錄中的指針得到用戶的頁表.並通過頁表的指針直接指向相應的物理內存.

Linux虛擬內存的實現,需要幾種不同的機制來實現:

地址映射機制

內存的分配與回收

請頁機制

交換機制

內存共享機制

在具體的讀源碼之前.我們先根據我們以前學過的操作系統知識.和C語言等知識.來考慮一下,這幾個機制如何實現.現自己設計一下.在看別人是怎樣實現的.找到自己想不到.或者對效率空間有損的地方.這樣才有進步.我不止一次的說.操作系統的某一部分,就起實現來說,非常簡單.它的難點是如何將大量的功能集成出一個kernerl.

地址映射機制,說白了,就是在虛擬內存與物理內存上的一個橋梁.它要做的事情可能就是通過幾個不同的表.把虛擬地址轉換成物理地址,把物理地址轉化虛擬地址.

我們以前說過.因為有系統與用戶之分,它必須也要有不同的數據結構.為了解決速度等問題.它會有一個硬件的緩沖區

對於它的數據結構.我們可以先想一下.如虛擬地址的信息,虛擬地址在那個區域等等

至於請頁機制,更好理解.因為linux是頁式存儲的.因此必然會存在空白頁和使用頁.既然是頁.就必然會存在頁溢出.頁無效(是不是在win98 下經常出現類似錯誤,當然linux的內存管理不可能和windows一樣,可基本道理相同).因此.在每一個頁出錯.或者該頁存不下多余的數據時.就要要求內核分配新的頁面

同時.當時用fork() 產生一個新的進程時.也需要分配新的葉面.這一部分大概講的就是進程如何向內和描述自己需要怎麼樣的和多少頁

在我們學習<<數據結構>>是我們學了,很多內存分配方式,如首次擬和.最佳擬和,最差擬和等等.但是我們可以想象.linux 大概不會用他們.那就一定是伙伴系統了.因此我們可以對於伙伴系統的分配,回收的基本算法.回想一下.這樣在讀者一部分源碼時,回有意象不到的收獲.

至於交換機制.我們也可以現想一想.內存中總與很多使用者的頁.如果這些也已經把所有的頁都用完了.再分配時必須把其中的某些頁釋放.釋放那些頁,需要考慮.如最近不用頁.近期少用頁,等等都可以在考慮之中.

這個算法,大概就是計算內存中使用的頁,什麼時候可以換處.說白了就是為所有的使用頁計算一個”權”,而這個”權”就決定了他什麼時候被釋放以換如它的內容.需要想的是對於經常使用的頁.可以把它放入cahe.(盡管這一部分對程序員是透明的,但我們應該理解他的原理).

最後的一部分共享內存,我想和我門初學linux編程時,進程通訊裡面的共享內存沒有區別.大概也就是在它的數據結構中加入可以允許不同進程訪問的tag 就行了.

以上,只是我們對linux的內存管理機制的猜測,需要我們做的工作就是具體的讀源碼.更正不正確的猜想.同時學習別人的實際思路.

從下篇日記開始.我們將分別講解這幾部分的實現

copyright © 萬盛學電腦網 all rights reserved