怎麼樣熟悉linux內存管理

內存是Linux內核所管理的最重要的資源之一,內存管理也是操作系統中重要的部分。所以內存管理非常重要哦。。。呵呵  希望各位大哥不要笑小弟我啊。。。
  一般我們需要多少的內存呢?
 對於典型的linux的應用系統,128MB是合理的選擇,如果不運行X-WINDOWS,那麼只要8MB就行啦。。
   有個科學曾經做過這樣的實驗。就是在128MB和256MB內存下編譯內核所花的時間是一樣的。所以我們會根據工作需求來決定要多少內存
  
 1  監控內存的使用情況
  我們使用#free 來查看內存的使用情況
  使用#free -b -s5 命令可以不斷報告內存的使用情況5秒刷新一次
2.使甩vmstat命令監視虛擬內存使用情況 # vmstat  呵呵下面的一段話是我在網上找的資料啊。。。這個不是我能理解的。。呵呵
 
  
虛擬內存實現的機制
存儲管理子系統是操作系統中最重要的組成部分之一。在早期計算時代,由於人們所需要的內存數目遠遠大於物理內存,因此設計出了各種各樣的策略來解決此問題,其中最成功的就是虛擬內存技術,它使得系統中有限的物理內存競爭進程所需內存空間得到滿足。虛擬內存通過在各個進程之間共享內存,而使系統看起來有多於實際內存的內存容量。Linux支持虛擬內存, 就是使用磁盤作爲RAM的擴展,使可用內存相應地有效擴大。核心把當前不用的內存塊存到硬盤,騰出內存給其它目的。當原來的內容又要使用時,再讀回內存。運行於Linux的程序只看到大量的可用內存,而不關心哪部分在磁盤上。當然,讀寫硬盤比真的內存慢(大約慢千倍),所以程序運行較慢。用做虛擬內存的這部分硬盤叫對換空間。
虛擬內存技術不僅僅讓我們可以使用更多的內存,它還提供了下面這些功能:
 
1.巨大的尋址空間
 
操作系統讓系統看上去有比實際內存大得多的內存空間。虛擬內存可以是系統中實際物理空間的許多倍。每個進程運行在其獨立的虛擬地址空間中,這些虛擬空間相互之間都完全隔離開來,所以進程間不會互相影響。同時,硬件虛擬內存機構可以將內存的某些區域設置成不可寫,這樣可以保護代碼與數據不會受惡意程序的干擾。
 
2.公平的物理內存分配  
 
內存管理子系統允許系統中每個運行的進程公平地共享系統中的物理內存。
 
3.共享虛擬內存
 
儘管虛擬內存允許進程有其獨立的虛擬地址空間,但有時也需要在進程之間共享內存。例如,有可能系統中有幾個進程同時運行BASH命令外殼程序。爲了避免在每個進程的虛擬內存空間內都存在BASH程序的拷貝,較好的解決辦法是系統物理內存中只存在一份BASH的拷貝,並在多個進程間共享。動態庫則是另外一種進程間共享執行代碼的方式。共享內存可用來作爲進程間通信(IPC)的手段,多個進程通過共享內存來交換信息。Linux支持SYSTEM V的共享內存IPC機制。
 
4.進程的保護
 
系統中的每一個進程都有自己的虛擬地址空間。這些虛擬地址空間是完全分開的,這樣一個進程的運行不會影響其它進程,並且硬件上的虛擬內存機制是被保護的,內存不能被寫入。這樣可以防止迷失的應用程序覆蓋代碼的數據。
 
5.Linux虛擬內存實現機制
 
Linux虛擬內存的實現需要6種機制的支持:地址映射機制、內存分配回收機制、緩存和刷新機制、請求頁機制、交換機制和內存共享機制。
 
6.虛擬內存容量設定
 
也許有人說,虛擬內存容量的設定應該分配2倍於物理內存,但這只是個規律。如果物理內存比較小,可以這樣設定。如果有256MB物理內存或更多的話,就可以縮小虛擬內存。Linux會把大量的內存用做Cache,但在資源緊張時會收回。只要看到swap爲0,或者該數很小就可以放心了,內存放着不用纔是最大的浪費。
 
內存泄露和回收內存的方法:
 
1.內存泄漏的定義
 
一般常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的、大小任意的(內存塊的大小可以在程序運行期決定)、使用完後必須顯示釋放的內存。應用程序一般使用malloc、realloc、new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊。否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。
 
2.內存泄露的危害
 
從用戶使用程序的角度來看,內存泄漏本身不會產生什麼危害。作爲一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麼危害,因爲它不會堆積。而隱式內存泄漏危害性則非常大,因爲較之於常發性和偶發性內存泄漏它更難被檢測到。存在內存泄漏問題的程序除了會佔用更多的內存外,還會使程序的性能急劇下降。對於服務器而言,如果出現這種情況,即使系統不崩潰,也會嚴重影響使用。
 
3.內存泄露的檢測和回收
 
對於內存溢出之類的麻煩,大家可能在編寫指針比較多的複雜程序時就會遇到。在 Linux或Unix下,C和C++語言是最常使用的工具。但是C++程序缺乏相應的手段來檢測內存信息,只能使用top指令觀察進程的動態內存總額。而且程序退出時,我們無法獲知任何內存泄漏信息。
 
(1)使用Linux命令回收內存,可以使用ps、kill兩個命令檢測內存使用情況和進行回收。在使用超級用戶權限時使用命令“ps”,它會列出所有正在運行的程序名稱和對應的進程號(PID)。kill命令的工作原理是向Linux 操作系統的內核送出一個系統操作信號和程序的進程號(PID)。
 
爲了高效率回收內存可以使用命令ps參數v: #ps v
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
2530 vc/1 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty1
2531 vc/2 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty2
2532 vc/3 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty3
2533 vc/4 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty4
2534 vc/5 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty5
2535 vc/6 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty6
2639 pts/1 S 0:00 545 16 2643 968 0.3 [su]
2684 pts/1 S 0:00 361 586 2501 1592 0.6 bash
2711 pts/0 S 0:00 545 16 2643 968 0.3 [su]
2714 pts/0 S 0:00 361 586 2501 1592 0.6 bash
2754 pts/2 S 0:00 545 16 2643 968 0.3 [su]
2757 pts/2 S 0:00 361 586 2501 1592 0.6 bash
2818 pts/1 S 0:00 120 29 1478 480 0.1 ping 192.168.1.7
2939 pts/2 R 0:00 156 58 2469 644 0.2 ps -v
如果想回收ping命令的內存的話,可以使用下面命令:
# kill -9 2818
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章