linux中的free -m可以檢視目前的記憶體使用情況
這裡會讓人奇怪的就是為什麼除了used和free,還有個buffers,cached的使用。
buffer是系統把将要寫入磁盤的資料先存放起來,然後一次性寫入磁盤。cache則是将要從磁盤讀取的資料先緩存起來,等待下次讀取或者一次性讀取。對于人來說,我們認為這一部分的緩存是已經使用了的,但是對于作業系統來說,這一部分的記憶體是“沒有使用”的。因為這部分的記憶體随時可以釋放。是以這部分意思是:
total: 總共有的記憶體
used: 已經使用的記憶體數(人的角度看的,既: 程序實際使用的記憶體+buffers+cached)
free: 空閑記憶體(人的角度看的)
shared: 程序共享記憶體
buffers: 作業系統預留的為程序IO讀取使用的緩沖區
cached: 作業系統為最近打開的檔案進行的緩存
-/+ buffer: 作業系統角度看的實際使用的記憶體數
我們在使用top指令看程序的時候,會看到下面的幾個東西:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2344 vagrant 20 0 98276 2020 1052 S 0.0 0.4 0:00.49 sshd
2345 vagrant 20 0 105m 1868 1488 S 0.0 0.4 0:00.08 bash
1136 nginx 20 0 45676 1740 440 S 0.0 0.4 0:00.00 nginx
1022 root 20 0 308m 1604 820 S 0.0 0.3 0:05.10 VBoxService
這裡會看到幾個屬性:
VIRT RES SHR
這三個值都是表示這個程序的記憶體使用狀況,其中的VIRT指的是程序使用的虛拟記憶體,RES指的是程序使用的實體記憶體,SHR指的是程序使用的共享記憶體。
打一個形象的比喻,一列車從北京到上海,有1500公裡,我們應該要鋪設1500公裡的鐵軌。但是,我們想了個取巧的辦法,我們實際隻需要三公裡的鐵軌,當列車快行駛完成鐵軌的時候,我們把已經走過的鐵軌鋪設到列車前方,這樣,列車就可以使用3公裡的鐵軌就進行行駛了。在這個例子中,虛拟記憶體就是代表1500公裡,而實體記憶體就是代表3公裡。我們一個程序在作業系統中實際使用的實體記憶體會遠遠小于配置設定的虛拟記憶體。比如一個php-fpm程序實際使用大概20-30M的實體記憶體,而你看他的虛拟記憶體,大概會有150M左右。
我們機器的記憶體是恒定的,那麼這些大出來的虛拟記憶體是存放在哪裡的呢?當然是硬碟。對于計算機來說,處理資訊查找會先在L1緩存中找需要的資料,如果沒有,在L2緩存中查找,如果還沒有,在記憶體中查找,如果還沒有,先去硬碟中的虛拟記憶體區域找,如果還沒有,再去硬碟中找,如果都沒有,就跳過這次處理(可能程式崩潰或者藍屏)。
引入虛拟記憶體技術的好處是程式不需要再管實體記憶體中哪塊空閑,哪塊有用了。這些全部交給作業系統來管理,再程式面前,就像是有一塊連續的,未使用的記憶體空間一樣。當程式啟動的時候,系統會為每個程式配置設定一定的記憶體空間。在32bit的機器上,這個記憶體空間的上限是4G(0x00000000 - 0xffffffff),而其中分為兩個部分,使用者态使用的記憶體,核心态使用的記憶體。其中3G(0x00000000 - 0xbfffffff)是使用者态可以使用的記憶體,而1G(0xc0000000 - 0xffffffff)是核心态使用的記憶體。是以在許多windows的x86機器上,安裝的記憶體條大小最多是4G的,因為安裝再大的記憶體,可以使用的記憶體大小也是有限制的。
而對于64bit的機器,這個記憶體是沒有4G的上限的,理論上可以支援2^64的大小的記憶體位址的。是以一般伺服器上對記憶體的最大上限都不做限制,這點可以使用ulimit -a 得到驗證:
對于虛拟記憶體和實體記憶體,這裡其實最複雜的是他們的映射機制。這個機制是作業系統核心要實作的東東,這裡就不繼續看下去了。
本文轉自軒脈刃部落格園部落格,原文連結:http://www.cnblogs.com/yjf512/p/4884953.html,如需轉載請自行聯系原作者