歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 初學者如何熟悉Linux內存管理機制

初學者如何熟悉Linux內存管理機制

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




Copyright © Linux教程網 All Rights Reserved