0x00 前言
在寫完了 CPU 的的性能分析筆記後,接下來是分析內存的性能問題,在分析內存的性能問題以前,確定是須要瞭解內存的原理,這裏的原理指的是內存軟件層面的原理,如內存如何進行分配、釋放等等,而不是說內存的硬件結構、內存寄存器、TLB 等等。算法
0x01 內存映射
經常咱們在買電腦前,咱們都關心一個參數:內存大小,這直接關係到咱們電腦的性能,但這裏的大小指的是物理內存的大小,而在操做系統上,咱們的程序在運行的過程當中並非直接使用物理內存的,而是用到了虛擬內存,即經過將物理內存映射成虛擬內存供進程使用,這也正是計算機世界的規則之抽象和分層。緩存
當程序被執行的時候,全部用到的內存地址都是虛擬內存的地址,而後再由操做系統將虛擬地址轉換成物理地址,這樣程序便無需關心真正的物理地址是什麼,從而在程序編譯的時候無需知道真正的物理地址,同時不一樣的進程之間也起到的隔離的做用。ide
具體的內存映射能夠總結出如下幾點:函數
- 虛擬地址分爲內核空間和用戶空間,同時虛擬內存模型是一個倒着的棧,棧底是高地址。以下所示:
- 虛擬地址和物理地址之間是要經過一個東西關聯的,就像一個索引,而這個東西就是頁表,Linux 用的是四級頁表
0x02 內存分配與回收
分配
C 標準庫使用 malloc 函數提供內存分配,有兩種實現方式:性能
- brk():分配小於 128k 的內存,經過移動堆頂的位置
- mmap():分配大於 128k 的內存,在文件映射段找一塊空閒的內存分配出去
- slab 分配器: 分配小於 1k 的內存,用的內存是 blk 釋放的被緩存起來的內存
優缺點
- brk(): 頻繁內存分配會形成內存碎片
- mmap:內存用完了會放掉,而後再次申請會有缺頁異常,使內核的負擔增大
釋放
- 回收緩存: LRU算法
- 回收不常訪問的內存,swap 到磁盤:可能會致使性能問題
- OOM:使用 oom_score 的權重殺進程
0x03 內存參數
free(全局)
- total: 總內存
- used: 已使用內存
- free: 未使用內存
- shared: 共享
- buff/cache: 緩存和緩衝
- available: 新進程
top (單個進程)
- VIRT(Virtual): 進程虛擬內存,只要申請過就會計算,即便沒分配物理內存,因此會比實際的物理內存大不少
- RES(Resident): 常駐內存,即實際物理內存,不包括 swap
- SHR(Shared): 共享內存,好比根據前面的虛擬內存圖所示,動態庫段和程序代碼段都屬於共享內存,但也不是全部 Shared 都是共享的,有些非共享的動態庫也算在了裏面
- MEM%: 物理內存的佔用百分比了
0x04 總結
今天的筆記總結下來就是,先不討論內存的物理結構(或許後續會總結下計算機原理的內存硬件結構~),在軟件層面使用內存:spa
- 不直接使用物理內存,進程是使用虛擬內存,這也是計算機抽象的一種體現
- 內存的分配和回收的方式的種類和方式
- 在 Linux 上如何查看內存的參數
在瞭解了內存的基本一些原理後,咱們即可以進行深刻的內存性能分析了。操作系統