Linux基礎之內存

物理內存和虛擬內存

定義

物理內存: 物理內存條提供的的內存空間,真正存儲數據的地方;
虛擬內存: 每個進程的邏輯內存,特點是獨立、連續,只是邏輯上存在,並不能真正存儲數據;

內存映射

  因爲所有進程的虛擬內存加起來會遠超物理內存,所以操作系統只會給進程真正使用的虛擬內存分配物理內存,通過頁表維護進程的虛擬內與與物理內存之間的映射關係,每個頁表都有一個單獨的頁表,如下圖所示:
在這裏插入圖片描述

虛擬內存好處

  • 進程隔離:每個進程擁有獨立的虛擬地址空間,進程間互不影響;
  • 地址空間:虛擬地址空間是連續、無限大的(64位系統),降低應用程序開發難度;
  • 物理內存管理:物理內存完全由操作系統管理,更加安全高效;
  • 共享內存:進程間共享的數據只需在物理內存中維護一份即可;

內核空間和用戶空間

 爲了避免用戶進程直接操作內核,保證內核安全,操作系統將進程的虛擬內存劃分爲兩部分,一部分是內核空間(Kernel-space),一部分是用戶空間(User-space),如下圖所示:
在這裏插入圖片描述
在這裏插入圖片描述

用戶空間

  用戶的程序運行在用戶空間,稱爲“用戶態”。處於用戶態的進程不能訪問內核空間中的數據,也不能直接調用內核函數,必須要先切換爲“內核態”纔行。用戶空間內存可以分爲五部分:

  • 只讀段,包括代碼和常量等;
  • 數據段,包括全局變量等;
  • 堆,包括動態分配的內存,從低地址開始向上增長;
  • 文件映射段,包括動態庫、共享內存等,從高地址開始向下增長;
  • 棧,包括局部變量和函數調用的上下文等。棧的大小是固定的,一般是 8 MB;

內核空間

  內核空間是爲操作系統的內核保留的,按訪問權限可以分爲進程私有和進程共享兩塊區域:

  • 進程私有的虛擬內存:每個進程都有單獨的內核棧、頁表、task 結構以及 mem_map 結構等;
  • 進程共享的虛擬內存:屬於所有進程共享的內存區域,包括物理存儲器、內核數據和內核代碼區域。雖然每個進程的地址空間都包含了內核空間,但這些內核空間,其實關聯的都是相同的物理內存,如下圖所示:
    在這裏插入圖片描述

內存查看

系統整體使用及各進程使用 — top

  • VIRT 是進程虛擬內存的大小,只要是進程申請過的內存,即便還沒有真正分配物理內存,也會計算在內;
  • RES 是常駐內存的大小,也就是進程實際使用的物理內存大小,但不包括 Swap 和共享內存;
  • SHR 是共享內存的大小,比如與其他進程共同使用的共享內存、加載的動態鏈接庫以及程序的代碼段等;
  • %MEM 是進程使用物理內存佔系統總內存的百分比;

系統整體使用 — free/vmstat

各進程使用 — pidstat

參考:

  1. 支撐百萬併發的“零拷貝”技術,你瞭解嗎?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章