主頁 > 作業系統 > Linux 記憶體管理 pt.2

Linux 記憶體管理 pt.2

2023-05-05 09:48:50 作業系統

哈嘍大家好我是咸魚,在《Linux 記憶體管理 pt.1》中我們學習了什么是物理記憶體、虛擬記憶體,了解了記憶體映射、缺頁例外等內容

那么今天我們來接著學習 Linux 記憶體管理中的多級頁表和大頁

多級頁表&大頁

在《Linux 記憶體管理 pt.1》中我們知道了內核為每個行程都維護了一張頁表,這張頁表用來記錄行程虛擬記憶體與物理記憶體的映射關系

頁表實際上存盤在 MMU 當中,MMU(Memory Management Unit,記憶體管理單元)是CPU內部的一個硬體模塊

MMU 負責將虛擬地址轉換為物理地址,從而實作行程間記憶體地址隔離和虛擬記憶體的實作

 

每個行程都有一張頁表,一張頁表中有很多頁表項(頁),每個頁表項大小為 4KB

也就是說,每一個記憶體映射關系,都需要一個 4 KB 或者 4 KB 整數倍的記憶體空間

小伙伴們有沒有想過這樣一個疑問:為什么 Linux 默認頁大小是 4KB ?

這其實是一個歷史遺留問題,后續咸魚有時間的話會單獨寫一篇來聊聊

現在我們應該把目光放到另一個點上:一個 32 位系統會為每個行程分配 4G 的虛擬地址空間(虛擬記憶體),這樣的話會導致一張頁表里面會有特別多頁(一百多萬)

而且每個頁為一個地址,占用 4 個位元組,32 位系統中一張頁表有 1048576 張頁,那就是一張頁表占 1048276 * 4 / 1024 = 4M

也就是說一個行程啥都不干,光是頁表大小就占了 4M,如果每張頁都有映射關系那也就算了,問題是絕大部分程式僅僅就使用了幾張頁

先不說這樣會導致一個頁表里面有大量的頁,占用大量的空間,如果想要找到存盤了對映關系的那一張頁,得從頭開始查找,這樣會導致查詢效率很慢

為了解決頁表項過多這個問題,Linux 提供了兩種機制,也就是多級頁表和大頁

多級頁表

我們知道,每個行程自身都會維護一個虛擬記憶體,而每個行程虛擬記憶體比物理記憶體要大得多,只有在使用的時候才會被分配到物理記憶體

多級頁表就是把被分配了物理記憶體的虛擬記憶體記憶體分成了一塊一塊,將原來的映射關系改成了區塊索引和區塊內的偏移量

多級頁表將頁表分為多級,每級頁表僅用于管理對應的物理記憶體空間,這樣就可以大大減少頁表中的項數以及頁表大小,從而減輕系統負擔

多級頁表通常由多個頁目錄和多個頁表組成,每個頁表存盤了該頁的物理地址、讀寫權限等資訊;而頁目錄項則存盤了指向該頁表的地址

Linux 采用四級頁表來管理記憶體頁,如下圖所示

 

多級頁表和一級頁表的區別

在Linux中,多級頁表和一級頁表的最大區別在于多級頁表只存盤有映射關系(即被分配了物理記憶體)的頁,而一級頁表存盤了所有頁表項

用一級頁表的話,整個頁表都得存放在記憶體當中,而使用多級頁表的話,只有被分配了物理記憶體的頁會存在記憶體中

舉個例子,一級頁表就相當于一本厚厚的字典,我們在一級頁表中查找存盤了映射關系的頁就相當于在這本字典中從開始位置查找 而多級頁表相當于把這本厚厚的字典拆成了多本字典,如果要查東西,直接去對應的小字典上查找即可,減少了大字典中要從開始處查找的不必要時間,提高了效率

大頁

比普通頁更大的記憶體塊,常見的大小有 2MB 和 1GB

大頁通常用在使用大量記憶體的行程上,比如 Oracle、DPDK 等

通過上面這些機制,在頁表的映射下行程就可以通過虛擬記憶體來訪問物理記憶體了,那么行程是如何使用被分配了物理記憶體的虛擬記憶體呢

我們來看下虛擬記憶體中的用戶空間記憶體

 

上圖所示,用戶空間記憶體被分割成了五個不同的記憶體段:

  • 只讀段:代碼和常量等
  • 資料段:全域變數等
  • 堆:動態分配的記憶體
  • 檔案映射段:動態庫、共享記憶體等
  • 堆疊:區域變數和函式呼叫的背景關系等,堆疊的大小是固定的,一般是 8 MB

感謝閱讀,喜歡作者就動動小手[一鍵三連],這是我寫作最大的動力

   

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/551686.html

標籤:Linux

上一篇:聊聊開關和CPU之間故事

下一篇:返回列表

標籤雲
其他(158463) Python(38117) JavaScript(25400) Java(18012) C(15222) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7162) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5335) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • Linux 記憶體管理 pt.2

    哈嘍大家好我是咸魚,在《Linux 記憶體管理 pt.1》中我們學習了什么是物理記憶體、虛擬記憶體,了解了記憶體映射、缺頁例外等內容 那么今天我們來接著學習 Linux 記憶體管理中的多級頁表和大頁 多級頁表&大頁 在《Linux 記憶體管理 pt.1》中我們知道了內核為每個行程都維護了一張頁表,這張頁表用來記 ......

    uj5u.com 2023-05-05 09:48:50 more
  • 聊聊開關和CPU之間故事

    作者:小牛呼嚕嚕 | https://xiaoniuhululu.github.io 大家好,我是呼嚕嚕,在先前的一篇文章計算機中數值和字串怎么用二進制表示?中,我們知道了計算機為什么會采用 0 和 1 組成的二進制,來表示所有的資訊,比如機器指令、數字、字串、聲音、圖片、視頻等等。 我們本篇文 ......

    uj5u.com 2023-04-28 13:04:16 more
  • 快速上手Linux核心命令(九):檔案備份與壓縮

    (檔案備份與壓縮) 這期呢主要說一說Linux中檔案備份與壓縮命令,一共6個命令。這6個命令都是平常作業中非常非常常用的。 tar 打包備份 1、簡介 tar 可以將多個檔案壓縮打包、壓縮。是作業中經常用到的命令 2、語法格式 tar [引數選項] [檔案或目錄] 3、引數說明 | 引數 | 引數說 ......

    uj5u.com 2023-04-28 13:03:24 more
  • 聊聊開關和CPU之間故事

    作者:小牛呼嚕嚕 | https://xiaoniuhululu.github.io 大家好,我是呼嚕嚕,在先前的一篇文章計算機中數值和字串怎么用二進制表示?中,我們知道了計算機為什么會采用 0 和 1 組成的二進制,來表示所有的資訊,比如機器指令、數字、字串、聲音、圖片、視頻等等。 我們本篇文 ......

    uj5u.com 2023-04-28 12:50:59 more
  • 快速上手Linux核心命令(九):檔案備份與壓縮

    (檔案備份與壓縮) 這期呢主要說一說Linux中檔案備份與壓縮命令,一共6個命令。這6個命令都是平常作業中非常非常常用的。 tar 打包備份 1、簡介 tar 可以將多個檔案壓縮打包、壓縮。是作業中經常用到的命令 2、語法格式 tar [引數選項] [檔案或目錄] 3、引數說明 | 引數 | 引數說 ......

    uj5u.com 2023-04-28 12:38:53 more
  • 明解STM32—GPIO應用設計篇之API函式及配置使用技巧

    一、前言 本篇開始對STM32的GPIO在實際開發設計中的使用配置和技巧進行探討,可以先去回顧下之前介紹的GPIO的相關理論基礎知識包括基本結構,作業模式和暫存器原理。 了解過STM32的GPIO相關的理論知識,這樣在應用GPIO開發程序中,能更好的理解GPIO的特點,應用起來會更加的得心應手。 后 ......

    uj5u.com 2023-04-27 10:02:09 more
  • Linux查看各用戶硬碟占用大小

    Linux查看各用戶硬碟占用大小 在Linux中,如果要統計各用戶占用硬碟的大小,可以執行如下的命令 du -sh /home/* 這條命令會以K、M、G等單位輸出 /home 下各用戶目錄占用硬碟的總大小,例如下面這樣: [root@localhost ~]# du -sh /home/* 24K ......

    uj5u.com 2023-04-27 10:01:31 more
  • 快速上手Linux核心命令(六):Linux的文本編輯器vi和vim

    @(Linux的文本編輯器) 前言 上一篇中已經預告,我們這篇主要說Linux中vi/vim 編輯器。它是我們使用Linux系統不可缺少的工具,學會了,你就可以在Linux世界里暢通無阻,學廢了,常用操作你也會了,也是夠用了,O(∩_∩)O 簡介 vi是Linux系統下標準編輯器,就相當于Windo ......

    uj5u.com 2023-04-27 10:00:55 more
  • CentOS搭建squid正向代理

    squid介紹 官網地址:http://www.squid-cache.org/ Squid cache(簡稱為 Squid)是一個流行的自由軟體(GNU 通用公共許可證)的代理服務器和 Web 快取服務器。Squid 有廣泛的用途,從作為網頁服務器的前置 cache 服務器快取相關請求來提高 We ......

    uj5u.com 2023-04-27 10:00:29 more
  • 明解STM32—GPIO應用設計篇之API函式及配置使用技巧

    一、前言 本篇開始對STM32的GPIO在實際開發設計中的使用配置和技巧進行探討,可以先去回顧下之前介紹的GPIO的相關理論基礎知識包括基本結構,作業模式和暫存器原理。 了解過STM32的GPIO相關的理論知識,這樣在應用GPIO開發程序中,能更好的理解GPIO的特點,應用起來會更加的得心應手。 后 ......

    uj5u.com 2023-04-27 09:59:24 more