初學(xué)者如何熟悉Linux內存管理機制
內存是Linux內核所管理的最重要的資源之一,內存管理系統是操作系統中最為重要的部分。對于Linux的初學(xué)者來(lái)說(shuō),熟悉Linux的內存管理非常重要。
本文引用地址:http://dyxdggzs.com/article/201610/305314.htm進(jìn)程是運行于虛擬地址空間的一個(gè)程序??梢哉f(shuō),任何在Linux系統下運行的程序都是進(jìn)程。Linux系統中包括交互進(jìn)程和批處理進(jìn)程。交互進(jìn)程是由Shell控制和運行的,既可以在前臺運行,也可以在后臺運行。批處理進(jìn)程不屬于某個(gè)終端,被提交到一個(gè)隊列中以便順序執行。大多數的進(jìn)程都需要虛擬內存。
一般需要多少內存
對于典型的Linux應用系統,128MB內存是合理的選擇。如果不運行X-Window系統,那么在一臺特殊用途的機器(比如用于調試設備驅動(dòng)程序的“崩潰和燒毀”系統)上僅用8MB內存就可以工作。
筆者曾經(jīng)做過(guò)實(shí)驗,在128MB和256MB下編譯內核所需的時(shí)間幾乎一樣,都少于3分半鐘(筆者的Linux發(fā)行版本是Mandrake Linux 9.1,內核2.4.21)。在一個(gè)只有8MB內存的系統上,編譯需要的時(shí)間會(huì )更長(cháng)一些。類(lèi)似Web瀏覽器這樣的多媒體應用軟件,在內存充足時(shí)會(huì )運行得更流暢,特別是在一邊編譯程序,一邊上網(wǎng)瀏覽的時(shí)候更是如此。因此,如果只有128MB內存,則預期的性能會(huì )有所降低。類(lèi)似地,如果要開(kāi)發(fā)消耗大量?jì)却娴膽贸绦?,可能?huì )要求更多的內存。所以,需要多少內存由工作需求來(lái)決定。
實(shí)時(shí)監控內存使用情況
1.在命令行使用“Free”命令監控內存使用情況 #free
total used free shared buffers cached
Mem: 256024 192284 63740 0 10676 101004
-/+ buffers/cache: 80604 75420
Swap: 522072 0 522072
上面代碼給出了一個(gè)256MB的RAM和512MB交換空間的系統情況。第三行輸出(Mem:)顯示物理內存。Total列不顯示核心使用的物理內存(通常大約1MB)。Used列顯示被使用的內存總額(第二行不計緩沖)。Free列顯示全部沒(méi)有使用的內存。Shared列顯示多個(gè)進(jìn)程共享的內存總額。Buffers列顯示磁盤(pán)緩存的當前大小。第五行(Swap:)對換空間,顯示的信息類(lèi)似上面。如果這行為全0,那么就沒(méi)有使用對換空間。在缺省的狀態(tài)下,free命令以千字節(也就是1024字節為單位)來(lái)顯示內存使用情況。使用-h參數,以字節為單位顯內存使用情況;或者使用-m參數,以兆字節為單位顯示內存使用情況。還可以通過(guò)-s參數,使用命令來(lái)不間斷地監視內存使用情況:
#free -b -s5
這個(gè)命令將會(huì )在終端窗口中連續不斷地報告內存的使用情況,每5秒鐘更新一次。
2.使甩vmstat命令監視虛擬內存使用情況 # vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 63692 10704 101008 0 0 239 42 126 105 48 45 7 0
vmstat()命令是一個(gè)通用監控程序,是Virtual Meomory Statistics(虛擬內存統計)的縮寫(xiě)。如果使用vmstat命令的時(shí)候沒(méi)有使用任何命令行參數,將會(huì )得到一個(gè)一次性的報告。vmstat命令報告主要的活動(dòng)類(lèi)型有進(jìn)程(procs)、內存(以千字節為單位)、交換分區(以千字節為單位)、來(lái)自塊設備(硬盤(pán)驅動(dòng)器)的輸入輸出量、系統中斷(每秒鐘發(fā)生的次數),以及中央處理單元(CPU)分配給用戶(hù)、系統和空閑時(shí)分別占用的比例。
虛擬內存實(shí)現的機制
存儲管理子系統是操作系統中最重要的組成部分之一。在早期計算時(shí)代,由于人們所需要的內存數目遠遠大于物理內存,因此設計出了各種各樣的策略來(lái)解決此問(wèn)題,其中最成功的就是虛擬內存技術(shù),它使得系統中有限的物理內存競爭進(jìn)程所需內存空間得到滿(mǎn)足。虛擬內存通過(guò)在各個(gè)進(jìn)程之間共享內存,而使系統看起來(lái)有多于實(shí)際內存的內存容量。Linux支持虛擬內存, 就是使用磁盤(pán)作為RAM的擴展,使可用內存相應地有效擴大。核心把當前不用的內存塊存到硬盤(pán),騰出內存給其它目的。當原來(lái)的內容又要使用時(shí),再讀回內存。運行于Linux的程序只看到大量的可用內存,而不關(guān)心哪部分在磁盤(pán)上。當然,讀寫(xiě)硬盤(pán)比真的內存慢(大約慢千倍),所以程序運行較慢。用做虛擬內存的這部分硬盤(pán)叫對換空間。
虛擬內存技術(shù)不僅僅讓我們可以使用更多的內存,它還提供了下面這些功能:
1.巨大的尋址空間
操作系統讓系統看上去有比實(shí)際內存大得多的內存空間。虛擬內存可以是系統中實(shí)際物理空間的許多倍。每個(gè)進(jìn)程運行在其獨立的虛擬地址空間中,這些虛擬空間相互之間都完全隔離開(kāi)來(lái),所以進(jìn)程間不會(huì )互相影響。同時(shí),硬件虛擬內存機構可以將內存的某些區域設置成不可寫(xiě),這樣可以保護代碼與數據不會(huì )受惡意程序的干擾。
2.公平的物理內存分配
內存管理子系統允許系統中每個(gè)運行的進(jìn)程公平地共享系統中的物理內存。
3.共享虛擬內存
盡管虛擬內存允許進(jìn)程有其獨立的虛擬地址空間,但有時(shí)也需要在進(jìn)程之間共享內存。例如,有可能系統中有幾個(gè)進(jìn)程同時(shí)運行BASH命令外殼程序。為了避免在每個(gè)進(jìn)程的虛擬內存空間內都存在BASH程序的拷貝,較好的解決辦法是系統物理內存中只存在一份BASH的拷貝,并在多個(gè)進(jìn)程間共享。動(dòng)態(tài)庫則是另外一種進(jìn)程間共享執行代碼的方式。共享內存可用來(lái)作為進(jìn)程間通信(IPC)的手段,多個(gè)進(jìn)程通過(guò)共享內存來(lái)交換信息。Linux支持SYSTEM V的共享內存IPC機制。
4.進(jìn)程的保護
系統中的每一個(gè)進(jìn)程都有自己的虛擬地址空間。這些虛擬地址空間是完全分開(kāi)的,這樣一個(gè)進(jìn)程的運行不會(huì )影響其它進(jìn)程,并且硬件上的虛擬內存機制是被保護的,內存不能被寫(xiě)入。這樣可以防止迷失的應用程序覆蓋代碼的數據。
5.Linux虛擬內存實(shí)現機制
Linux虛擬內存的實(shí)現需要6種機制的支持:地址映射機制、內存分配回收機制、緩存和刷新機制、請求頁(yè)機制、交換機制和內存共享機制。
內存管理程序通過(guò)映射機制把用戶(hù)程序的邏輯地址映射到物理地址。當用戶(hù)程序運行時(shí),如果發(fā)現程序中要用的虛地址沒(méi)有對應的物理內存,就發(fā)出了請求頁(yè)要求。如果有空閑的內存可供分配,就請求分配內存(于是用到了內存的分配和回收),并把正在使用的物理頁(yè)記錄在緩存中(使用了緩存機制)。如果沒(méi)有足夠的內存可供分配,那么就調用交換機制;騰出一部分內存。另外,在地址映射中要通過(guò)TLB(翻譯后援存儲器)來(lái)尋找物理頁(yè);交換機制中也要用到交換緩存,并且把物理頁(yè)內容交換到交換文件中,也要修改頁(yè)表來(lái)映射文件地址。Linux虛擬內存實(shí)現原理見(jiàn)圖1。
評論