啃了一下的Linux的內存管理部分,大概框框理解了一下,下面本身總結下備忘。算法
1. 內存管理涉及的概念不少,包括地址映射、虛擬地址空間等等。
緩存
2. 內存管理主要分爲內核的內存管理以及進程(用戶空間)的內存管理,內核通常使用1G,進程使用3G。ide
3. 進程的內存管理:(小內存brk實現,大內存mmap實現)函數
1)進程所使用的內存是虛擬地址,並非直接的物理內存,中間須要必定的機制進行映射,這裏不討論映射機制,瞭解便可。學習
2)每一個進程須要用到內存的主要有text、data、bss、heap、stack,就是一些程序、變量等,主要分兩類,靜態分配的關於變量等,動態分配的使用heap的,這裏主要學習動態分配的heap(堆)。(靜態分配會自動釋放,動態分配要手工free釋放)spa
3)進程如何動態分配內存:使用malloc()函數,就能夠取得內存。orm
4)虛擬地址與物理地址:進程經過malloc()得到的只是虛擬地址空間,並未實際佔用物理內存,直到真正使用的時候才進行地址映射,取得物理內存的空間。對象
5)malloc細節:glibc的函數maloc經過系統調用brk()或mmap()來分配內存。進程
小塊內存(<=128kbytes),使用brk()內存
大塊內存(>128kbytes),使用mmap()
6)brk():是堆機制,內存分配一直往上堆,儘可能先從現有的堆中分配,沒有的話,經過brk()增大堆。這裏涉及如何分配的各類算法,這裏不討論。
7)mmap():大塊內存的時候申請。
8)重點_brk()的free:若是是經過brk()申請的空間,使用free()釋放後,並不會立刻釋放給系統,而是釋放給glibc管理器統一分配協調。glibc是經過查看堆頂的連續空間是否有大於必定的值,若是有的話,才進行釋放,不然不釋放。
例子:若是進程申請了10塊堆的空間,其中9塊已經釋放了,有1塊在離堆頂最近的地方可是沒有釋放,那麼這十塊就都沒有辦法釋放。
9)mmap()的free:mmap會直接free掉,不會出現brk()的問題。
4. 內核的內存管理:經過slab機制,主要解決小內存的問題。
1)內核的內存主要有對象和控制結構使用。
2)slab爲內核中經常使用的對象創建專門的對象池,好比task結構的池。
3)維護通用的對象池,好比32字節大小的對象池
4)控制結構有兩種方式,若是控制結構較大,使用專門的頁面,若是較小,使用對象池。
5. 內存管理的緩存:內存中會有一部內存被暫時保存,以便下次調用的時候不須要從新分配和初始化,主要有cache和buffer兩種類型。只有等到系統內存不夠的時候,
能夠用cache和buffer中的內存,因此能夠這裏理解cache和buffer:是已經分配可是當前不可用的內存,當系統內存不足的時候能夠用。
6. free命令:
total used free shared buffers cached
-/+ buffers/cache: 40 60
Swap: 10 10 10
簡單解釋下:buffers和cached就是已經分配,可是還未用的。
Mem:這一行的used就是包括buffer/cache的,free就是當前目前立刻可用的。
第3行:used是不包括buffer/cache的,就是實際使用的,free是包括buffer和cache的。
總結下:其實就是從2個角度看系統內存的狀態,一個是從不算上buffer和cache的角度,一個是算上cache/buffer的角度。