Linux 內核給每個進程都提供了一個獨立的虛擬地址空間,並且這個地址空間是連續的。這樣,進程就可以很方便地訪問內存,更確切地說是訪問虛擬內存。虛擬地址空間的內部又被分為內核空間和用戶空間兩部分。並不是所有的虛擬內存都會分配物理內存,只有那些實際使用的虛擬內存才分配物理內存,並且分配后的物理內存,是通過內存映射來管理的。
內存映射,其實就是將虛擬內存地址映射到物理內存地址。為了完成內存映射,內核為每個進程都維護了一張頁表,記錄虛擬地址與物理地址的映射關系。頁表實際上存儲在 CPU 的內存管理單元 MMU 中。而當進程訪問的虛擬地址在頁表中查不到時,系統會產生一個缺頁異常,進入內核空間分配物理內存、更新進程頁表,最后再返回用戶空間,恢復進程的運行,這是一個次缺頁異常(minor page fault)。minor page fault 也稱為 soft page fault, 指需要訪問的內存不在虛擬地址空間,但是在物理內存中,只需要MMU建立物理內存和虛擬地址空間的映射關系即可。
major page fault指需要訪問的內存不在虛擬地址空間,也不在物理內存中,進入內核空間分配物理內存,更新進程頁表,還需要swap從磁盤中讀取數據換入物理內存中。
什么是page fault
當進程訪問它的虛擬地址空間中的PAGE時,如果這個PAGE目前還不在物理內存中,此時CPU是不能干活的,Linux會產生一個hard page fault中斷。系統需要從慢速設備(如磁盤)將對應的數據PAGE讀入物理內存,並建立物理內存地址與虛擬地址空間PAGE的映射關系。然后進程才能訪問這部分虛擬地址空間的內存。
page fault 又分為幾種,major page fault、 minor page fault、 invalid(segment fault)。
major page fault 也稱為 hard page fault, 指需要訪問的內存不在虛擬地址空間,也不在物理內存中,需要從慢速設備載入。從swap 回到物理內存也是 hard page fault。
minor page fault 也稱為 soft page fault, 指需要訪問的內存不在虛擬地址空間,但是在物理內存中,只需要MMU建立物理內存和虛擬地址空間的映射關系即可。
- 當一個進程在調用 malloc 獲取虛擬空間地址后,首次訪問該地址會發生一次soft page fault。
- 通常是多個進程訪問同一個共享內存中的數據,可能某些進程還沒有建立起映射關系,所以訪問時會出現soft page fault
invalid fault 也稱為 segment fault,指進程需要訪問的內存地址不在它的虛擬地址空間范圍內,屬於越界訪問,內核會報 segment fault錯誤。
轉自:https://blog.csdn.net/wangquan1992/article/details/105036282/