Linux操作系統之線程:分頁式存儲管理

目錄

前言:

一、分頁式存儲管理

二、二級頁表的地址轉化

三、缺頁中斷

總結


前言:

我們上篇文章簡單介紹了線程的一些知識點,但是還有很多坑沒有給大家填上,包括頁表部分我們還沒為大家說明。

本篇文章我將會繼續為大家講解線程的有關內容,希望對大家有所幫助。

一、分頁式存儲管理

我們今天先繼續談論關于分頁式存儲的話題。

首先就是幫助大家深入的了解頁表。

我們之前在學習進程PCB的時候就已經接觸到了頁表,在上文我們也曾提到過:在分頁式存儲管理中,虛擬地址空間被劃分為固定大小的頁(Page)(通常為4KB),而物理內存則被劃分為相同大小的頁框(Page Frame)。操作系統通過頁表(Page Table)建立虛擬頁到物理頁框的映射關系,使得進程可以透明地訪問物理內存。

我們的每一個進程都有自己的頁表結構,這是大家之前就知道的。但是這個頁表結構具體是什么樣的呢?

我們之前只說了頁表負責存儲虛擬地址空間到物理地址的映射關系,但是頁表具體怎么存儲的呢?

在32位系統中,虛擬空間的最大空間是4GB,這是每一個用戶程序都擁有的虛擬內存空間。既然需要讓4GB的虛擬內存全部可用,那么頁表中就需要能夠表示所4GB空間的表項數量,也就是4GB/4KB=1048576個表項,如下圖所示:

但是在32位系統中,地址的長度是4個字節(4B),那么頁表中的每一個表項就是占用4個字節,所以頁表占據的總空間就是4MB的大小,也就是說映射表自己本身,就要占用4MB/4KB=1024個物理頁,這樣會存在哪些問題呢?
回想一下,我們當初為什么要使用頁表,要使用虛擬內存空間。
因為我們的物理地址是碎片化的,我們需要將進程劃分為一個個頁,可以不用連續的存放在物理內存中。
但是此時你一個頁表就需要1024個連續的頁框,這是不是和當時的目標背道而馳了?
此外,其實很多進程在一段時間內只需要訪問某幾個頁就可以正常運行了。因此我們沒有畢業一次讓所有的物理頁都常駐內存。
解決需要大容量頁表的最好方法是:把頁表看成普通的文件,對他進行離散分配,即對頁表在分頁,由此形成多級頁表的思想。
為了解決這個問題,我們可以把這個單一頁表拆分為1024個體積更小的映射表。這樣一來,1024(每個表中的表項個數)*1024(表的個數),仍然可以覆蓋4GB的物理內存空間。
即:
  • 將原1M個條目的單級頁表拆分為?1024個小頁表(每個小頁表存儲1024個條目,占4KB)。

  • 新增一個頁目錄(Page Directory),包含1024個條目,每個條目指向一個小頁表。

  • 總容量不變:1024小頁表×1024條目/頁表=1M1024小頁表?×1024條目/頁表?=1M條目,仍可覆蓋4GB空間。

?

?

頁目錄表就是用來負責管理小頁表的結構。所有小頁表的物理地址被頁目錄表項指向,而頁目錄的物理地址被CR3寄存器指向,這個寄存器中,保存了當前正在執行任務的頁目錄地址。

所以操作系統在加載用戶程序時,不僅僅需要為程序內容來分配物理地址,還需要為用來保存程序的頁目錄和頁表分配物理地址哦!!


二、二級頁表的地址轉化

事實上,20位可尋址1M個頁框 × 4KB = 4GB,與32位地址空間上限一致。并且物理頁框的基址必須是4KB的整數倍(即低12位全為0),因此存儲物理地址時無需記錄低12位,硬件會自動在拼接時補零。如0x123?→ 物理頁框基址 =?0x123000。

所以我們如果把二級頁表的32位全部用來存儲地址,會造成浪費。于是,我們的二級頁表的32位的前20位才是存儲的物理地址,而后面12位,存儲的是頁偏移。

什么意思呢?就是對我們32位的虛擬地址來說,我們可以把這32個數字劃分為三段。

第一段1-10位,表示的是這個虛擬地址代表的頁目錄,2^10次方剛好就是1024個頁目錄項。

第二段11-20位,這個是在找到了頁目錄項的基礎上,找到這個頁目錄項上面的頁表項。

第三段21-32位,表示的是偏移量,我們最后結合這個偏移量找到物理地址:

以0000000000 1111111110 111111111111為例:

?我們32位的物理地址也是差不多的理由,只不過是劃分了兩段。

第一段1-20位表示物理頁框號,第二段21-32位表示標志位,包括讀寫權限這些。


在CPU內部,有一個叫做MMU的硬件電路。以上其實就是MMU的工作流程,他的速度很快,主要工作還是進行內存管理,地址轉化只是他承接的任務之一。

然而還有一個問題,MMU要先進行兩次頁表查詢確定物理地址,在確定了權限等問題之后,MMU再將這個物理地址發送給總線,內存收到之后開始讀取對應的地址的數據并返回。那么當頁表變為N級的時候,就變成了N次檢索加1次讀寫。可見,頁表的級數越多,他所花費的步驟越多,那么對于CPU來說,等待的時間也就越長。

(總線是計算機系統中用于在各部件之間傳輸數據、地址和控制信號的?公共通信通道。它相當于計算機的“神經系統”,負責連接CPU、內存、I/O設備等組件,確保它們能高效協同工作)

所以多級頁表是一個雙刃劍,在減少連續存儲要求且減少存儲空間的同時降低了查詢效率(以時間換取空間)?

有沒有提升效率的辦法呢?
計算機科學中的所有問題都能通過加一個中間層解決,MMU就引入了一個新武器:TLB,江湖人稱快表。
這個TLB,實際上就是一個緩存,類似于Redis,都是通過緩存高頻訪問的數據來加速性能。
當CPU發出虛擬地址時,MMU首先查詢TLB——若命中(TLB Hit),直接返回物理地址,省去訪問頁表的開銷?;若未命中,查詢頁表(觸發多級頁表遍歷),并且還會把這個未命中的映射關系傳給TLB讓它記錄下來方便下一次。

三、缺頁中斷

操作系統采用了按需分配的惰性策略,進程的虛擬地址空間雖然理論上覆蓋整個范圍(如32位系統的4GB),但實際僅對當前使用的區域初始化頁表映射。(因為我們之前說過進程運行只需要幾張物理頁就行),如果我們把映射關系全部初始化,會浪費大量內存存儲未使用的頁表項。所以,當我們CPU給MMU的虛擬地址,在TLB與頁表都沒找到對應的物理頁,該怎么辦呢?

這個時候,就想到我們之前說過的延時分配機制,這個我們在講進程的寫實拷貝與動態內存管理申請空間時也提到過一點。比如在動態內存分配(malloc)時,操作系統并不會立即分配實際的物理頁,而是等到程序首次訪問這塊內存時才通過缺頁中斷來真正分配;又如在 fork() 創建子進程時,父子進程共享相同的物理頁,只有當某個進程嘗試寫入時,才會觸發缺頁中斷并執行真正的頁面復制。

寫實拷貝真實是怎么做到的呢?原因是什么呢?

就是因為映射關系在頁表上并未全部給你加載到內存上(雖然所有的映射關系早就初始化了),當程序首次訪問未分配的堆內存、文件映射區域或換出到磁盤的頁面時, MMU 在頁表項中發現"存在位"(Present Bit)為0時,表明該虛擬頁要么尚未關聯物理頁,要么對應的數據還未加載到內存中(可能被換出到交換空間)。這時,作為 CPU 一部分的 MMU 就會觸發一個特殊的軟中斷,將控制權交給操作系統的缺頁處理程序。內核會根據不同的缺頁原因采取相應措施:對于未分配的頁面會分配新的物理頁;對于被換出的頁面會從磁盤換回;對于權限不足的訪問則會拋出段錯誤。處理完成后,操作系統會更新頁表映射,并讓 CPU 重新執行引發缺頁的指令。

這個中斷,就叫做缺頁中斷(缺頁異常)。

正是通過缺頁中斷這個橋梁,現代操作系統才能如此優雅地實現虛擬內存管理,讓每個進程都"錯覺"自己獨占了整個地址空間,而實際上物理內存資源在被所有進程高效共享。


總結

計算機系統的內存管理是一個環環相扣的精妙體系。當進程運行時,它看到的是一個連續的虛擬地址空間(32位系統為4GB),這個設計抽象了物理內存的碎片化問題。但虛擬地址必須轉換為真實的物理地址才能訪問內存,這個轉換過程通過頁表(Page Table)實現,而頁表本身也存儲在物理內存中。

而我們為了高效管理這個轉換過程,采用多級頁表結構(如x86的兩級頁表)。第一級是頁目錄,存儲1024個頁目錄項(PDE),每個PDE指向一個頁表;第二級頁表存儲1024個頁表項,每個PTE最終指向4KB的物理頁框。這種層級結構通過虛擬地址的10-10-12分拆實現:高10位定位頁目錄項,中間10位定位頁表項,低12位作為頁內偏移。

地址轉換時,MMU首先查詢TLB快表(緩存結構),若未命中則需遍歷頁表。為提升效率,操作系統采用按需分配策略:不會為整個4GB空間初始化頁表,而是僅維護當前活躍區域的映射。當訪問未映射的區域時,MMU發現頁表項中"存在位"(Present Bit)為0,觸發缺頁異常

缺頁處理程序會根據不同情況采取行動:

  1. 若是首次訪問的堆內存(如malloc分配),則分配物理頁并建立映射

  2. 若是被換出的頁面,則從交換空間換入

  3. 若是寫時復制(COW)場景,則復制物理頁并更新映射

這種機制與物理內存管理緊密耦合:操作系統通過伙伴系統管理物理頁框分配,通過頁緩存加速磁盤數據讀取。

希望對大家有所幫助。

明天我們將重新講回線程的知識點,這個知識點時講到線程了順帶引出的,但也很重要!!!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89413.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

xss1-8

Level-1<script>alert()</script>基礎反射型 無任何過濾Level-2"> <script>alert()</script> <"閉合屬性&#xff1a;">用來閉合當前標簽的value屬性注入新標簽&#xff1a;閉合屬性后&#xff0c;插入獨立的<script>…

51c嵌入式~單片機~合集1

自己的原文哦~ https://blog.51cto.com/whaosoft/11897656 一、STM32的啟動模式配置與應用 三種BOOT模式 所謂啟動&#xff0c;一般來說就是指我們下好程序后&#xff0c;重啟芯片時&#xff0c;SYSCLK的第4個上升沿&#xff0c;BOOT引腳的值將被鎖存。用戶可以通過設…

Typecho分類導航欄開發指南:從基礎到高級實現

文章目錄 Typecho分類導航欄深度解析:父分類與子分類的完美呈現 引言 一、Typecho分類系統基礎 1.1 Typecho分類結構 1.2 獲取分類數據的基本方法 二、基礎分類導航輸出 2.1 簡單的平鋪式導航 2.2 帶計數器的分類導航 三、層級分類導航實現 3.1 遞歸輸出父子分類 3.2 使用Type…

C++異步編程工具 async promise-future packaged_task等

深入探討 C11 中引入的四個核心異步編程工具&#xff1a;std::async, std::future, std::promise, 和 std::packaged_task。它們共同構成了 C 現代并發編程的基礎。 為了更好地理解&#xff0c;我們可以使用一個餐廳點餐的類比&#xff1a; std::future (取餐憑證)&#xff1…

Linux-網絡管理

網絡管理1. 網絡基礎1.1 TCP/IP 協議棧&#xff08;四層模型&#xff09;1.2 網絡設備配置與基礎概念1.3 網絡接口命名規則1.4 網絡配置文件位置2. 常用網絡配置命令2.1 查看網絡接口信息2.2 配置 IP 地址2.3 啟用/禁用網卡2.4 修改網卡 MAC 地址2.5 配置網卡的 MTU&#xff08…

Linux鎖的概念及線程同步

目錄 1.常見鎖概念 死鎖 死鎖四個必要條件 避免死鎖 避免死鎖算法 2. Linux線程同步 條件變量 同步概念與競態條件 條件變量函數 初始化 銷毀 等待條件滿足 喚醒等待 簡單案例&#xff1a; 條件變量使用規范 1.常見鎖概念 死鎖 死鎖是指在一組進程中的各個進程均占有不會釋放的…

docker更換國內加速器-更換華為加速器2025-717親測可用docker 拉取鏡像出錯

[rootlocalhost ~]# docker pull nginx Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)報錯原因就是…

Unity VR多人手術模擬恢復2:客戶端移動同步問題分析與解決方案

Unity VR多人手術模擬恢復2&#xff1a;客戶端移動同步問題分析與解決方案 &#x1f3af; 問題背景 在開發基于Unity Mirror網絡架構的VR多人手術模擬系統時&#xff0c;我們遇到了一個復雜的客戶端移動同步問題&#xff1a; 主要操作者&#xff08;第一個客戶端&#xff09;&a…

uni-app開發的頁面跳轉全局加載中

uni-app開發的頁面跳轉全局加載中首先需要下載插件創建加載中頁面組件app.vue頁面中監聽跳轉首先需要下載插件 https://ext.dcloud.net.cn/plugin?id20613 創建加載中頁面組件 <!-- 全局自定義加載中 --> <template><view v-if"visible" class&qu…

XXE漏洞4-XXE無回顯文件讀取-PentesterLab靶場搭建

一.PentesterLab靶場搭建(實驗環境搭建)介紹&#xff1a;PentesterLab 是一個全面的漏洞演示平臺&#xff0c;但是它是收費的&#xff0c;我們這里只使用它的 xxe 演示案例。安裝 PentesterLab 虛擬機:下載好鏡像&#xff1a; 1.打開VMware新建虛擬機&#xff0c;選擇典型就行。…

【機器學習】圖片分類中增強常用方式詳解以及效果展示

圖片增強常用方式詳解 引言 圖片數據的質量和多樣性對模型的訓練效果起著至關重要的作用。然而&#xff0c;實際獲取的圖片數據往往存在數量不足、分布不均衡等問題。圖片增強技術應運而生&#xff0c;它通過對原始圖片進行一系列變換&#xff0c;生成更多具有多樣性的圖片&…

【URL 轉換為PDF】HTML轉換為PDF

1、方法1 pdfkit 安裝依賴 # 安裝 wkhtmltopdf&#xff08;系統級&#xff09; # Ubuntu/Debian sudo apt install wkhtmltopdf# macOS brew install wkhtmltopdf# Windows 下載安裝&#xff1a;https://wkhtmltopdf.org/downloads.html# 安裝 Python 庫 pip install pdfkitimp…

單鏈表的定義、插入和刪除

一、定義一個單鏈表 struct LNode{ //定義單鏈表節點類型ElemType data; //存放節點數據元素struct LNode *next; //指針指向下一個結點 }; //增加一個新節點&#xff1a;在內存中申請一個結點所需空間&#xff0c;并用指針p指向這個結點 struct LNode * p (struc…

Nextjs官方文檔異疑惑

第一個區別&#xff1a;不同的頁面對應的路由器設定&#xff01; 繼續用 app 路由器&#xff08;推薦&#xff0c;Next.js 未來主流&#xff09; 路由規則&#xff1a;app 目錄下&#xff0c;文件夾 page.tsx 對應路由。例如&#xff1a; app/page.tsx → 對應 / 路由&#xf…

突破AI模型訪問的“光標牢籠”:長上下文處理與智能環境隔離實戰

> 當AI模型面對浩瀚文檔卻只能處理零星片段,當關鍵信息散落各處而模型“視而不見”,我們該如何打破這堵無形的墻? 在自然語言處理領域,**輸入長度限制**(常被稱為“光標區域限制”)如同一個無形的牢籠,嚴重制約了大型語言模型(LLM)在真實場景中的應用潛力。無論是分…

AI 智能質檢系統在汽車制造企業的應用?

某知名汽車制造企業在其龐大且復雜的生產流程中&#xff0c;正面臨著棘手的汽車零部件質檢難題。傳統的人工質檢方式&#xff0c;完全依賴人工的肉眼觀察與簡單工具測量。質檢員們長時間處于高強度的工作狀態&#xff0c;精神高度集中&#xff0c;即便如此&#xff0c;由于人工…

設計模式》》門面模式 適配器模式 區別

// 復雜子系統 class CPU {start() { console.log("CPU啟動"); } } class Memory {load() { console.log("內存加載"); } } class HardDrive {read() { console.log("硬盤讀取"); } }// 門面 class ComputerFacade {constructor() {this.cpu ne…

windows內核研究(驅動開發 第一個驅動程序和調試環境搭建)

驅動開發 第一個驅動程序 驅動的開發流程 1.編寫代碼 -> 生成.sys文件 -> 部署 -> 啟動 -> 停止 ->卸載 // 編寫我們的第一個驅動程序 #include<ntddk.h>// 卸載函數 VOID DrvUnload(PDRIVER_OBJECT DriverObject) {DbgPrint("我被卸載了\n"…

ABP VNext + 多級緩存架構:本地 + Redis + CDN

ABP VNext 多級緩存架構&#xff1a;本地 Redis CDN &#x1f4da; 目錄ABP VNext 多級緩存架構&#xff1a;本地 Redis CDN一、引言 &#x1f680;二、環境與依賴 &#x1f6e0;?三、架構概覽 &#x1f310;請求全鏈路示意 &#x1f6e3;?四、本地內存緩存層 &#x1…

RGBA圖片格式轉換為RGB格式(解決convert轉換的失真問題)

使用convert轉換的問題 OpenCV 的 cv2.cvtColor(…, cv2.COLOR_BGRA2GRAY) 會直接忽略 Alpha 通道的含義&#xff0c;將它當作第四個顏色通道來處理。 轉換公式如下&#xff1a; gray 0.114*255 0.587*0 0.299*0 ≈ 29也就是說&#xff0c;即使 Alpha 為 0&#xff08;完全透…