Linux內核主要由五個子系統組成:進程調度,內存管理,虛擬文件系統,網路介面,進程間通信。
1.進程調度(SCHED):控制進程對CPU
的訪問。當需要選擇下一個進程運行時,由調度程序選擇最值得運行的進程。可運行進程實際上是僅等待CPU資源的進程,如果某個進程在等待其它資源,則該進
程是不可運行進程。Linux使用了比較簡單的基於優先順序的進程調度演算法選擇新的進程。
2.內存管理(MM)允許多個進程安全的
共享主內存區域。Linux
的內存管理支持虛擬內存,即在計算機中運行的程序,其代碼,數據,堆棧的總量可以超過實際內存的大小,操作系統只是把當前使用的程序塊保留在內存中,其餘
的程序塊則保留在磁碟中。必要時,操作系統負責在磁碟和內存間交換程序塊。內存管理從邏輯上分為硬體無關部分和硬體有關部分。硬體無關部分提供了進程的映
射和邏輯內存的對換;硬體相關的部分為內存管理硬體提供了虛擬介面。
3.虛擬文件系統
(Virtual File
System,VFS)隱藏了各種硬體的具體細節,為所有的設備提供了統一的介面,VFS提供了多達數十種不同的文件系統。虛擬文件系統可以分為邏輯文件
系統和設備驅動程序。邏輯文件系統指Linux所支持的文件系統,如ext2,fat等,設備驅動程序指為每一種硬體控制器所編寫的設備驅動程序模塊。
4.網路介面(NET)提供了對各種網路標準的存取和各種網路硬體的支持。網路介面可分為網路協議和網路驅動程序。網路協議部分負責實現每一種可能的網路傳輸協議。網路設備驅動程序負責與硬體設備通訊,每一種可能的硬體設備都有相應的設備驅動程序。
5.進程間通訊(IPC) 支持進程間各種通信機制。
2. Linux 內存 為什麼會一直被占滿
linux的內存管理機制跟windows是不同的!
windows在用內存的時候同時會用硬碟上的虛擬內存,而且對程序的內存管理不夠好…有些程序雖然關掉,但是會有碎片占據部分內存而且不會被自動清理,所以越用越卡…
linux是盡量把內存全部利用起來盡量不用交換空間(所以一旦用到交換空間意味著配置低了該加內存了),而且內存管理是用過的程序暫時放在內存裡面等需要再用的時候直接從內存讀取,這樣速度快很多!
當然如果內存滿又要運行新的程序,系統會自動按照程序的重要性進行內存清理,關掉部分不重要的程序把部分內存資源交給需要運行的新程序…
3. linux的內存機制,和windows的內存機制一樣嗎linux要是內存使用率太高以後,會怎樣,和windows一樣嗎
Linux 系統和android 雖然都是用的是linux內核,但對處理程序內存的方式不一樣,特別是前台的上層程序,內核級程序基本是一樣的。
linux內核基本是先把數據都放在內存上的,內存不夠才放到交換分區(虛擬內存)上,細節是,只有頻繁使用的數據才會放到內存上,不頻繁操作的數據會漸漸放到交換分區上,適當時寫回硬碟里。而windows的處理方式是 內存和虛擬內存一起使用,不是以內存操作為主,這樣的結果是IO的負擔比較大,有時會拖慢處理速度。linux的哲學是,盡可能使用內存,因為內存的速度比硬碟速度快100多倍。
Android 用戶程序基本是java寫的,android有著自己一套管理體系,不同於普通的linux系統和windows系統。前台使用中的程序才會佔用CPU,放入後台的程序會被「凍結」停止使用CPU,只有服務類程序會一直佔用CPU,除非停止。android會盡可能載入程序的緩存,以便下次程序啟動時會更快,這個程序自動運行載入緩存是可以控制的,用「衛士」之類的系統軟體設置即可。android如果內存比較吃緊,會自動清除不常用程序的緩存,自動關閉不常用的程序。當然android的內存管理不是萬能的,比如1G內存,已經佔用了900M,如果再開一個300M的程序,這個程序很可能會意外退出,除非清理騰出足夠的內存來運行。
安卓是比較節能的。我們使用windows有個習慣,就是盡量結束那些不用的、佔用CPU的程序,總是要用軟體清理。安卓不一樣,只有前台程序和服務程序會佔用CPU,不用時,把前台程序放入後台即可,設置----應用----找到「正在運行」的選項卡 結束掉不用的服務即可;右上角「顯示緩存程序」,需要清理內存可以釋放掉相應的程序就能騰出內存(我們都不用費力清理內存的,不影響使用)。安卓是比較節能的前提是:不運行比較大型的軟體,適時關閉網路wifi、GPS、藍牙等不用的硬體,這樣才節能。
android即使程序開滿了內存,內核也不會崩潰的,linux系統也是一樣。但linux系統可能因為使用滿了swap交換分區,IO負擔比較重,運行會有點卡,必要時內核會強制結束一些程序。windows內存滿了,一般會彈出提示內存不夠,但比較不穩定,尤其是windows2003 和xp之類的系統,會誘發系統不穩定,系統崩潰藍屏。
起點Linux愛好者社區 為您解答
4. linux的內存管理是怎麼樣的
物理內存和虛擬內存 我們知道,直接從物理內存讀寫數據要比從硬碟讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。 物理內存就是系統硬體提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯內存,用作虛擬內存的磁碟空間被稱為交換空間(Swap Space)。 作為物理內存的擴展,linux會在物理內存不足時,使用交換分區的虛擬內存,更詳細的說,就是內核會將暫時不用的內存塊信息寫到交換空間,這樣以來,物理內存得到了釋放,這塊內存就可以用於其它目的,當需要用到原始的內容時,這些信息會被重新從交換空間讀入物理內存。 linux的內存管理採取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。 要深入了解linux內存運行機制,需要知道下面提到的幾個方面: 首先,Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑物理內存,即使並沒有什麼事情...關於Linux的學習,你可以看看《linux就該這么學》,系統的學習一下相關知識,地址是3w(dot)linuxprobe(dot)com,good luck.
5. 如何有效的學習linux內存管理
Linux內存管理機制: 一 物理內存和虛擬內存 我們知道,直接從物理內存讀寫數據要比從硬碟讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念
6. linux內存管理的特點
什麼是虛擬內存?
Linux支持虛擬內存(virtual memory),虛擬內存是指使用磁碟當作RAM的擴展,這樣可用的內存的大小就相應地增大了。內核會將暫時不用的內存塊的內容寫到硬碟上,這樣一來,這塊內存就可用於其它目的。當需要用到原始的內容時,它們被重新讀入內存。這些操作對用戶來說是完全透明的;Linux下運行的程序只是看到有大量的內存可供使用而並沒有注意到時不時它們的一部分是駐留在硬碟上的。當然,讀寫硬碟要比直接使用真實內存慢得多(要慢數千倍),所以程序就不會象一直在內存中運行的那樣快。用作虛擬內存的硬碟部分被稱為交換空間(swap space)。
Linux能夠使用文件系統中的一個常規文件或一個獨立的分區作為交換空間。交換分區要快一些,但是很容易改變交換文件的大小(也就無需重分區整個硬碟,並且可以從臨時分區中安裝任何東西)。當你知道你需要多大的交換空間時,你應該使用交換分區,但是如果你不能確定的話,你可以首先使用一個交換文件,然後使用一陣子系統,你就可以感覺到要有多大的交換空間,此時,當你能夠確信它的大小時就創建一個交換分區。
你應該知道,Linux允許同時使用幾個交換分區以及/或者交換文件。這意味著如果你只是偶爾地另外需要一個交換空間時,你可以在當時設置一個額外的交換文件,而不是一直分配這個交換空間。
操作系統術語注釋:計算機科學常常將交換[swapping](將整個進程寫到交換空間)與頁面調度[paging](在某個時刻,僅僅固定大小的幾千位元組寫到交換空間內)加以區別。頁面調度通常更有效,這也是Linux的做法,但是傳統的Linux術語卻指的是交換。
創建交換空間
一個交換文件是一個普通的文件;對內核來說一點也不特殊。對內核有關系的是它不能有孔,並且它是用mkswap來准備的。而且,它必須駐留在一個本地硬碟上,它不能由於實現的原因而駐留在一個通過NFS載入的文件系統中。
關於孔是重要的。交換文件保留了磁碟空間,以至於內核能夠快速地交換出頁面而無需做分配磁碟扇區給文件時所要做的一些事。內核僅僅是使用早已分配給交換文件的任何扇區而已。因為文件中的一個孔意味著沒有磁碟扇區分配(給該文件的孔的相應部分),對內核來說就不能使用這類有孔的文件。
創建無孔的交換文件的一個好方法是通過下列命令:
$ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 \
上面/extra-swap是交換文件的名字,大小由count=後面的數值給出。大小最好是4的倍數,因為內核寫出的內存頁面(memory pages)大小是4千位元組。如果大小不是4的倍數,最後幾千位元組就用不上了。
一個交換分區也並沒有什麼特別的。你可以象創建其它分區一樣地創建它;唯一的區別在於它是作為一個原始的分區使用的,也即,它不包括任何的文件系統。將交換分區標記為類型82(Linux交換分區)是個好主意;這將使得分區的列表更清楚,盡管對內核來說並不是一定要這樣的。
在創建了一個交換文件或一個交換分區以後,你必須在它的開頭部分寫上一個簽名;這個簽名中包括了一些由內核使用的管理信息。這是用\cmd{mkswap}命令來做到的,用法如下:
$ mkswap /extra-swap 1024
Setting up swapspace, size = 1044480 bytes
請注意此時交換空間還沒有被使用:它已存在,但內核還沒有用它作為虛擬內存。你必須非常小心地使用mkswap,因為它不檢查這個文件或分區是否已被別人使用。你可以非常容易地使用mkswap來覆蓋重要的文件以及分區!幸運的是,僅僅在安裝系統時,你才需要使用mkswap。
Linux內存管理程序限制每個交換空間最大約為127MB(由於各種技術上的原因,實際的限制大小為(4096-10) * 8 * 4096 = 133890048$ 位元組,或127.6875兆位元組)。然而,你可以同時使用多至16個交換空間,總容量幾乎達2GB。
交換空間的使用
一個已初始化的交換空間是使用命令swapon投入正式使用的。該命令告訴內核這個交換空間可以被使用了。到交換空間的路徑是作為參數給出的,所以,開始在一個臨時交換文件上使用交換的命令如下:
$ swapon /extra-swap
通過把交換空間列入/etc/fstab文件中就能被自動地使用了。
/dev/hda8 none swap sw 0 0
/swapfile none swap sw 0 0
啟動描述文件會執行命令swapon –a,這個命令會啟動列於/etc/fstab中的所有交換空間。因此,swapon命令通常僅用於需要有外加的交換空間時。
你可以用free命令監視交換空間的使用情況。它將給出已使用了多少的交換空間。
total used free shared buffers
Swap: 32452 6684 25768
輸出的第一行(Mem:)顯示出物理內存的使用情況。總和(total)列中並沒有顯示出被內核使用的內存,它通常將近一兆位元組。已用列(used column)顯示出已用內存的總和(第二行沒有把緩沖算進來)。空閑列(free column)顯示了所有未被使用的空閑內存。共享列(shared column)顯示出了被幾個進程共享的內存的大小;共享的內存越多,情況就越好。緩存列(buffer column)顯示出了當前磁碟緩存的大小。已緩沖列(cached column)顯示出了已使用的緩存的大小。
最後一行(Swap:)顯示出了與交換空間相應的信息。如果這一行的數值都是零,表示你的交換空間沒有被擊活。
也可通過用top命令來獲得同樣的信息,或者使用proc文件系統中的文件/proc/meminfo 。通常要取得指定交換空間的使用情況是困難的。
可以使用命令swapoff來移去一個交換空間。通常沒有必要這樣做,但臨時交換空間除外。一般,在交換空間中的頁面首先被換入內存;如果此時沒有足夠的物理內存來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬內存來容納所有這些頁面,Linux就會波動而不正常;但經過一段較長的時間Linux會恢復,但此時系統已不可用了。在移去一個交換空間之前,你應該檢查(例如,用free)是否有足夠的空閑內存。
任何由swapon –a而自動被使用的所有交換空間都能夠用swapoff –a命令移去;該命令參考/etc/fstab文件來確定移去什麼。任何手工設置使用的交換空間將始終可以被使用。
有時,盡管有許多的空閑內存,仍然會有許多的交換空間正被使用。這是有可能發生的,例如如果在某一時刻有進行交換的必要,但後來一個佔用很多物理內存的大進程結束並釋放內存時。被交換出的數據並不會自動地交換進內存,除非有這個需要時。此時物理內存會在一段時間內保持空閑狀態。對此並沒有什麼可擔心的,但是知道了是怎麼一回事我們也就放心了。
許多操作系統使用了虛擬內存的方法。因為它們僅在運行時才需要交換空間,以即決不會在同一時間使用交換空間,因此,除了當前正在運行的操作系統的交換空間,其它的就是一種浪費。所以讓它們共享一個交換空間將會更有效率。這是可能的,但需要有一定的了解。在HOWTO技巧文檔中含有如何實現這種做法的一些建議。
有些人會對你說需要用物理內存的兩倍容量來分配交換空間,但這是不對的。下面是合適的做法:
。估計你的總內存需求。這是某一時刻你所需要的最大的內存容量,也就是在同一時刻你想運行的所有程序所需內存的總和。通過同時運行所有的程序你可以做到這一點。
例如,如果你要運行X,你將給它分配大約8MB內存,gcc需要幾兆位元組(有些文件要求異呼尋常的大量的內存量,多至幾十兆位元組,但通常約4兆位元組應該夠了),等等。內核本身要用大約1兆位元組、普通的shell以及其它一些工具可能需要幾百千位元組(就說總和要1兆位元組吧)。並不需要進行精確的計算,粗率的估計也就足夠了,但你必須考慮到最壞的情況。
注意,如果會有幾個人同時使用這個系統,他們都將消耗內存。然而,如果兩個人同時運行一個程序,內存消耗的總量並不是翻倍,因為代碼頁以及共享的庫只存在一份。
Free以及ps命令對估計所需的內存容量是很有幫助的。
對第一步中的估計放寬一些。這是因為對程序在內存中佔用多少的估計通常是不準的,因為你很可能忘掉幾個你要運行的程序,以及,確信你還要有一些多餘的空間用於以防萬一。這需幾兆位元組就夠了。(多分配總比少分配交換空間要好,但並不需要過分這樣以至於使用整個硬碟,因為不用的交換空間是浪費的空間;參見後面的有關增加交換空間。)同樣,因為處理數值更好做,你可以將容量值加大到整數兆位元組。
基於上面的計算,你就知道了你將需要總和為多少的內存。所以,為了分配交換空間,你僅需從所需總內存量中減去實際物理內存的容量,你就知道了你需要多少的交換空間。(在某些UNIX版本中,你還需要為物理內存的映像分配空間,所以第二步中算出的總量正是你所需要的交換空間的容量,而無需再做上述中的減法運算了。)
如果你計算出的交換空間容量遠遠大於你的物理內存(大於兩倍以上),你通常需要再買些內存來,否則的話,系統的性能將非常低。
有幾個交換空間是個好主意,即使計算指出你一個都不需要。Linux系統常常動不動就使用交換空間,以保持盡可能多的空閑物理內存。即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間:當磁碟閑著,就可以提前做好交換。
可以將交換空間分散在幾個硬碟之上。針對相關磁碟的速度以及對磁碟的訪問模式,這樣做可以提高性能。你可能想實驗幾個方案,但是你要認識到這些實驗常常是非常困難的。不要相信其中一個方案比另一個好的說法,因為並不總是這樣的。
高速緩沖
與訪問(真正的)的內存相比,磁碟[3]的讀寫是很慢的。另外,在相應較短的時間內多次讀磁碟同樣的部分也是常有的事。例如,某人也許首先閱讀了一段e-mail消息,然後為了答復又將這段消息讀入編輯器中,然後又在將這個消息拷貝到文件夾中時,使得郵件程序又一次讀入它。或者考慮一下在一個有著許多用戶的系統中ls命令會被使用多少次。通過將信息從磁碟上僅讀入一次並將其存於內存中,除了第一次讀以外,可以加快所有其它讀的速度。這叫作磁碟緩沖(disk buffering),被用作此目的的內存稱為高速緩沖(buffer cache)。
不幸的是,由於內存是一種有限而又不充足的資源,高速緩沖不可能做的很大(它不可能包容要用到的所有數據)。當緩沖充滿了數據時,其中最長時間不用的數據將被舍棄以騰出內存空間用於新的數據。
對寫磁碟操作來說磁碟緩沖技術同樣有效。一方面,被寫入磁碟的數據常常會很快地又被讀出(例如,原代碼文件被保存到一個文件中,又被編譯器讀入),所以將要被寫的數據放入緩沖中是個好主意。另一方面,通過將數據放入緩沖中,而不是將其立刻寫入磁碟,程序可以加快運行的速度。以後,寫的操作可以在後台完成,而不會拖延程序的執行。
大多數操作系統都有高速緩沖(盡管可能稱呼不同),但是並不是都遵守上面的原理。有些是直接寫(write-through):數據將被立刻寫入磁碟(當然,數據也被放入緩存中)。如果寫操作是在以後做的,那麼該緩存被稱為後台寫(write-back)。後台寫比直接寫更有效,但也容易出錯:如果機器崩潰,或者突然掉電,或者是軟盤在緩沖中等待寫的數據被寫入軟盤之前被從驅動器中取走,緩沖中改變過的數據就被丟失了。如果仍未被寫入的數據含有重要的薄記信息,這甚至可能意味著文件系統(如果有的話)已不完整。
由於上述原因,在使用適當的關閉過程之前,絕對不要關掉電源(見第六章),不要在卸載(如果已被載入)之前將軟盤從驅動器中取出來,也不要在任何正在使用軟盤的程序指示出完成了軟盤操作並且軟盤燈熄滅之前將軟盤取出來。sync命令傾空(flushes)緩沖,也即,強迫所有未被寫的數據寫入磁碟,可用以確定所有的寫操作都已完成。在傳統的UNIX系統中,有一個叫做update的程序運行於後台,每隔30秒做一次sync操作,因此通常無需手工使用sync命令了。Linux另外有一個後台程序,bdflush,這個程序執行更頻繁的但不是全面的同步操作,以避免有時sync的大量磁碟I/O操作所帶來的磁碟的突然凍結。
在Linux中,bdflush是由update啟動的。通常沒有理由來擔心此事,但如果由於某些原因bdflush進程死掉了,內核會對此作出警告,此時你就要手工地啟動它了(/sbin/update)。
緩存(cache)實際並不是緩沖文件的,而是緩沖塊的,塊是磁碟I/O操作的最小單元(在Linux中,它們通常是1KB)。這樣,目錄、超級塊、其它文件系統的薄記數據以及非文件系統的磁碟數據都可以被緩沖了。
緩沖的效力主要是由它的大小決定的。緩沖大小太小的話等於沒用:它只能容納一點數據,因此在被重用時,所有緩沖的數據都將被傾空。實際的大小依賴於數據讀寫的頻次、相同數據被訪問的頻率。只有用實驗的方法才能知道。
如果緩存有固定的大小,那麼緩存太大了也不好,因為這會使得空閑的內存太小而導致進行交換操作(這同樣是慢的)。為了最有效地使用實際內存,Linux自動地使用所有空閑的內存作為高速緩沖,當程序需要更多的內存時,它也會自動地減小緩沖的大小。
在Linux中,你不需要為使用緩沖做任何事情,它是完全自動處理的。除了上面所提到的有關按照適當的步驟來關機和取出軟盤,你不用擔心它。
7. linux系統的電腦內存佔用滿,什麼問題
Linux的內存管理機制,遵循的原則是盡可能佔用,將一些程序調用過的硬碟數據讀入內存,利用內存讀寫的高速特性來提高Linux系統的數據訪問性能,所以當應用程序釋放內存的時候,系統本身不一定會把內存釋放,這樣下次應用程序啟動的時候能快速載入。只有當內存真正不夠用的時候,系統才會真正釋放內存。所以你看到內存佔用滿,只要不影響程序運行,就是正常的。
當然如果程序無法正常運行,則說明內存不夠或者程序有內存泄露。
8. Linux 內存 為什麼會一直被占滿
Linux的內存管理機制跟Windows是不同的!
Windows在用內存的時候同時會用硬碟上的虛擬內存,而且對程序的內存管理不夠好…有些程序雖然關掉,但是會有碎片占據部分內存而且不會被自動清理,所以越用越卡…
Linux是盡量把內存全部利用起來盡量不用交換空間(所以一旦用到交換空間意味著配置低了該加內存了),而且內存管理是用過的程序暫時放在內存裡面等需要再用的時候直接從內存讀取,這樣速度快很多!
當然如果內存滿又要運行新的程序,系統會自動按照程序的重要性進行內存清理,關掉部分不重要的程序把部分內存資源交給需要運行的新程序…
9. 如何熟悉Linux內存管理機制
Linux內存管理機制:
一 物理內存和虛擬內存
我們知道,直接從物理內存讀寫數據要比從硬碟讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。
物理內存就是系統硬體提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足
Linux的內存管理採取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。
要深入了解linux內存運行機制,需要知道下面提到的幾個方面:
Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑物理內存,即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間。
Linux 進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬內存,linux內核根據」最近最經常使用「演算法,僅僅將一些不經常使用的頁面文件交換到虛擬 內存,有時我們會看到這么一個現象:linux物理內存還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個佔用很大內存的進程運行時,需 要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但後來這個佔用很多內存資源的進程結束並釋放了很多內存時,剛才被交換出去的頁面 文件並不會自動的交換進物理內存,除非有這個必要,那麼此刻系統物理內存就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象了。關於這點,不 用擔心什麼,只要知道是怎麼一回事就可以了。
交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁 面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有足夠空間來存儲這些交換頁面,最終會導致linux出現假死機、服務異常等問題,linux雖 然可以在一段時間內自行恢復,但是恢復後的系統已經基本不可用了。
因此,合理規劃和設計Linux內存的使用,是非常重要的.
二 內存的監控
作為一名Linux系統管理員,監控內存的使用狀態是非常重要的,通過監控有助於了解內存的使用狀態,比如內存佔用是否正常,內存是否緊缺等等,監控內存最常使用的命令有free、top等