內存管理 : 04段頁結合的實際內存管理

一、課程核心主題引入

這一講,我要給大家講的是真正的內存管理,也就是段和頁結合在一起的內存管理方式。之前提到過,我們先學習了分段管理內存的工作原理,知道操作系統采用分段的方式,讓用戶程序能以分段的結構進行編寫;后來又學習了分頁管理內存,明白操作系統在管理物理內存時,通過分頁機制更高效地利用內存。分段對用戶和應用程序友好,分頁對物理內存管理高效,所以這兩種機制必須結合起來。
在這里插入圖片描述

這一講的關鍵,就在于探究段和頁這兩種機制如何結合,以及結合后實際的物理內存管理是什么樣的。程序員希望用段來編寫程序,物理內存希望用頁來進行管理,而操作系統作為中間橋梁,既要讓上層用戶滿意,又要高效管理下層物理內存資源,所以必須將分段和分頁兩種機制融合。接下來,我先給大家講講段頁結合的思路,再深入探討這種結合方式的具體實現。

二、段頁結合的思路解析

  1. 回顧分段與分頁工作原理
    • 先來回顧一下分段是怎么工作的。想象一下,有一個程序和一塊內存,我們在內存中采用分區的方法,根據程序分段的數量劃分出相應的區域。比如程序分成兩段,就割出兩個區域,然后將用戶程序中的段和這些區域建立映射,把代碼段放在一個區域,數據段放在另一個區域,這樣應用程序就放到內存的段中了。
    • 再看看分頁的工作方式。物理內存會被打散成一頁一頁固定大小的片,我們的程序同樣也會被打散。假設程序有兩個段,將這兩個段也打散成若干頁,然后把這些頁映射到物理內存的空閑頁上,分頁機制的工作就完成了。
  2. 段頁結合的具體方式
    • 現在要把段和頁結合起來,該怎么做呢?仔細觀察分段和分頁的工作過程圖,我們可以發現一個巧妙的方法。把程序中的段先映射到一個類似物理內存的地方,但它不是真正的物理內存,只是一個地址空間。這個地址空間可以劃分成一塊一塊的,就像物理內存一樣,不過劃分出來的只是地址,還不能直接訪問真實的物理內存,我們把它叫做虛擬內存

    • 具體來說,從應用程序角度出發,在虛擬內存給定的地址空間上,割出一個區域給程序中的段,這樣就實現了對段的支持,段有了對應的映射。但是虛擬內存本身不能直接使用,它只是一個虛擬的地址空間,所以還需要把虛擬內存中的段再分割成固定大小的頁,然后將每頁映射到物理內存上。經過這兩次映射,就形成了既有段又有頁的內存管理模式。在這里插入圖片描述

    • 從用戶的角度看,程序對應到虛擬內存上,感覺就像在使用段,他們不用關心底層的復雜映射過程,只知道自己的程序段在一段地址空間上,并且可以像使用段一樣連續地進行尋址訪問。而從物理內存的角度,是把虛擬內存中的段映射到物理內存頁上,實現了分頁管理。通過引入虛擬內存這個概念,完美地將段和頁結合在了一起,這就是段頁式內存管理的核心輪廓。

三、段頁同時存在時的重定位過程

  1. 重定位的必要性
    我們已經知道段頁是如何結合工作的了,但要讓程序在內存中順利運行,還需要進行重定位,也就是地址翻譯。因為用戶發出的邏輯地址,像程序中使用的段號加上段的偏移地址,需要經過轉換,才能找到真正的物理地址,這樣程序才能在內存中正確地取指執行。

  2. 重定位的具體步驟在這里插入圖片描述

    • 當用戶發出邏輯地址(段號 + 段偏移)時,首先要根據段表找到一個地址,這個地址是虛擬地址。在只有分段的情況下,這個地址就是物理內存地址,但在段頁結合的模式下,它還不是真正的物理地址,只是虛擬內存中的地址。
    • 得到虛擬地址后,操作系統還要根據分頁機制再進行一次映射。通過虛擬地址算出頁號,再結合頁內偏移,組合形成物理地址。最后,操作系統把這個物理地址發送到地址總線上,程序就能訪問到真正的物理內存單元,取出數據或執行指令了。整個過程需要經過兩層地址翻譯,第一層基于分段,第二層基于分頁,這樣既支持了分段,又支持了分頁,用戶感覺自己在使用段,而物理內存則按照頁的方式進行管理和分配。

四、段頁式內存下程序載入內存的過程

  1. 程序載入內存的總體步驟在這里插入圖片描述
    在這里插入圖片描述

    • 我們的目標是讓操作系統管理內存,使用戶程序能夠放入內存并正常執行。在段頁式內存管理下,程序載入內存的過程可以分為幾個關鍵步驟。第一步,要在虛擬內存上割出一段區域,分配給用戶程序的代碼段、數據段等,然后建立段表,記錄虛擬內存區域和程序段的對應關系,這一步相當于“假裝”把程序段放入了內存。
    • 第二步,雖然在虛擬內存中有了映射,但程序還沒有真正放到物理內存中,所以接下來要在物理內存中找到空閑頁,建立頁表,將虛擬內存中的區域和物理內存的頁關聯起來。通過磁盤讀寫操作,把程序真正載入到物理內存中。
    • 第三步,完成前面的操作后,程序已經在內存中了,但要能正常使用內存,還需要進行重定位,也就是前面講的地址翻譯過程,讓程序中的地址能夠正確對應到物理內存單元,這樣程序就能順利執行了。
  2. 結合代碼分析具體操作(以fork為例)在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

    • 我們從fork函數開始分析程序載入內存的過程。fork函數用于創建子進程,在這個過程中會涉及到內存的分配和映射。copy_process函數會進行一系列操作,其中copy_mem函數中的代碼實現了關鍵步驟。

    • set_base等代碼用于設置段表,這對應著第一步在虛擬內存上分配區域并建立段表的操作。通過計算,給每個進程分配一定大小的虛擬內存空間(如這里每個進程分配64兆),并將虛擬內存的起始地址賦給段表中的基址,完成對虛擬地址的分割和段表的初始化。在這里插入圖片描述

    • 接下來是分配物理內存和建立頁表。由于子進程是通過復制父進程創建的,所以在copy_page_tables函數中,子進程可以共用父進程已經分配好的物理內存頁,只需要拷貝頁表即可。通過一系列代碼操作,先確定父進程和子進程的頁目錄,為子進程分配新的頁目錄項(如果需要),然后將父進程頁表中的內容拷貝到子進程的頁表中,并將共享的頁設置為只讀,同時更新內存使用計數等信息。這樣,父子進程就都有了自己的虛擬內存、物理內存,并且段表和頁表都已正確建立,程序成功載入內存。
      在這里插入圖片描述

五、程序使用內存的過程及多進程地址分離在這里插入圖片描述

  1. 程序使用內存的操作
    當操作系統把段表和頁表做好后,程序就可以使用內存了。以*p = 7為例,假設p的邏輯地址經過編譯后是300,首先根據邏輯地址(段號 + 段偏移)和段表中的基址算出線性地址(虛擬地址),然后內存管理單元(MMU)會根據虛擬地址和頁表算出物理地址。由于這個地址轉換過程如果用軟件實現會比較慢,所以CPU設計了MMU這個硬件來自動完成轉換功能。MMU算出物理地址(如7300)后,將其打到地址總線上,就把7存儲到對應的物理內存單元中,實現了*p = 7的操作。
  2. 多進程地址分離與相互影響消除
    • 當有多個進程時,比如父子進程執行同樣的代碼,子進程執行*p = 8p還是300。在執行過程中,由于父子進程的段表基址不同(子進程的段表基址是根據其自身分配的虛擬內存計算的),所以算出的虛擬地址不同。
    • 又因為之前將共享的頁設置為只讀,當子進程要寫入數據(如寫入8)時,就會觸發寫時復制機制。此時會新申請一個內存頁,修改頁表,建立新的映射,將新的物理地址(如8300)與虛擬地址關聯起來。這樣,父進程和子進程就通過各自的映射表實現了地址的分離,避免了相互影響,每個進程都能獨立地訪問和使用自己的內存空間,就像我們之前講過多進程在內存中相互影響的問題,通過段表和頁表的配合,得到了完美解決。

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

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

相關文章

RAID磁盤陣列配置

RAID磁盤陣列配置 文章目錄 RAID磁盤陣列配置一、磁盤管理其他相關命令1.fsck-檢查文件的正確性2.dd-建立和使用交換文件3.mkswap-建立和設置SWAP交換分區 二、RAID配置 一、磁盤管理其他相關命令 1.fsck-檢查文件的正確性 [rootlocalhost ~]# fsck -aC /dev/sda1 //檢查文…

網站服務器出現異常的原因是什么?

網站時企業和個人用戶進行提供信息和服務的重要平臺,隨著時間的推移,網站服務器出現異常情況也是常見的問題之一,這可能會導致網站無法正常訪問或者是運行緩慢,會嚴重影響到用戶的體驗感,本文就來介紹一下網站服務器出…

LINUX528 重定向

2>&1 我的理解: 2>&1,2stderr錯誤輸出,1stdout輸出,stderr一般和stdout是分別輸出(管道符只傳遞stdout,據元寶,stderr默認輸出到終端;如果重定向符不進行2顯示重定向&…

【Python高階】面向對象

目錄 ?? 前言??? 技術背景與價值?? 當前技術痛點??? 解決方案概述?? 目標讀者說明?? 一、技術原理剖析?? 核心知識圖譜?? 核心作用講解?? 關鍵技術模塊說明?? 技術選型對比??? 二、實戰演示?? 環境配置要求?? 核心代碼實現案例1:面向對象電商系統…

榕壹云醫療服務系統:基于ThinkPHP+MySQL+UniApp的多門店醫療預約小程序解決方案

在數字化浪潮下,傳統醫療服務行業正面臨效率提升與客戶體驗優化的雙重挑戰。針對口腔、美容、診所、中醫館、專科醫院及康復護理等需要預約或診斷服務的行業,我們開發了一款基于ThinkPHP+MySQL+UniApp的多門店服務預約小程序——榕壹云醫療服務系統。該系統通過模塊化設計與開…

Vue-過濾器

過濾器 時間戳格式化 實現方式 計算屬性方法過濾器 基礎依賴 day.min.js 下載鏈接放到 相對路徑 js 目錄下 Computed 代碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>過濾器</title>…

Linux 下 C 語言實現工廠模式

Linux 下 C 語言實現工廠模式&#xff1a;設計理念與實戰 &#x1f9e0; 一、工廠模式簡介什么是工廠模式&#xff1f;C 語言實現設計模式的挑戰 &#x1f3d7;? 二、實現簡單工廠模式&#xff08;Simple Factory&#xff09;1. 定義傳感器接口&#xff08;device.h&#xff0…

用 Appuploader,讓 iOS 上架流程真正“可交接、可記錄、可復用”:我們是這樣實現的

你可能聽說過這樣一類人&#xff1a;上線必找他&#xff0c;證書只有他有&#xff0c;Transporter 密碼在他電腦上&#xff0c;描述文件什么時候過期&#xff0c;只有他知道。 如果你團隊里有這樣一位“發布大師”&#xff0c;他可能是個英雄——但也是個單點風險源。 我們團…

工控機安裝lubuntu系統

工控機安裝lubuntu系統指南手冊 1. 準備 1個8G左右的U盤 下載Rufus&#xff1a; Index of /downloads 下載lubuntu系統鏡像&#xff1a; NJU Mirror Downloads – Lubuntu 下載Ventoy工具&#xff1a; Releases ventoy/Ventoy GitHub 下載后&#xff0c;解壓&#…

MAC上怎么進入隱藏目錄

在Mac上&#xff0c;由于系統保護的原因&#xff0c;一些系統目錄如/usr默認是隱藏的&#xff0c;但可以通過以下方法進入&#xff1a; 方法一&#xff1a;使用Finder的“前往文件夾”功能 打開Finder。使用快捷鍵Command Shift G&#xff0c;或者在菜單欄中選擇“前往”-“…

流媒體基礎解析:視頻清晰度的關鍵因素

在視頻處理的過程中&#xff0c;編碼解碼及碼率是影響視頻清晰度的關鍵因素。今天&#xff0c;我們將深入探討這些概念&#xff0c;并解析它們如何共同作用于視頻質量。 編碼解碼概述 編碼&#xff0c;簡單來說&#xff0c;就是壓縮。視頻編碼的目的是將原始視頻數據壓縮成較…

tomcat服務器以及接受請求參數的方式

1.javaee&#xff1a;意為java企業版&#xff0c;指java企業級開發的規范總和&#xff0c;包含13項技術規范 2.事實上服務器和客戶端進行交互的過程中&#xff0c;有一個前端控制器在中間運作&#xff0c;這個控制器為DispatcherServlet&#xff0c;它負責將客戶端請求的信息包…

武警智能兵器室系統架構設計與關鍵技術解析

在現代化武警部隊建設中&#xff0c;武器彈藥的安全管理與快速響應能力直接影響部隊戰斗力。本文基于某實戰化智能兵器室建設案例&#xff0c;深入解析其系統架構設計、關鍵技術實現及創新管理機制&#xff0c;為安防領域提供可借鑒的解決方案。 整體拓撲結構 系統采用分層分布…

RLHF獎勵模型的訓練

由于 RLHF 的訓練過程中需要依賴大量的人類偏好數據進行學習&#xff0c;因此很難在訓練過程中要求人類標注者實時提供偏好反饋。為此&#xff0c;我們需要訓練一個模型來替代人類在 RLHF 訓練過程中實時提供反饋&#xff0c;這個模型被稱為獎勵模型 &#x1f538;一、 目標函…

reverse_ssh 建立反向 SSH 連接指南 混淆AV [好東西喲]

目錄 &#x1f310; 工具簡介 ?? 前提條件 攻擊主機 (Linux) 目標主機 (Windows) &#x1f4cb; 詳細步驟 步驟 1&#xff1a;安裝 Go 環境 步驟 2&#xff1a;安裝必要依賴 步驟 3&#xff1a;下載并編譯 reverse_ssh 步驟 4&#xff1a;配置密鑰 步驟 5&#xff…

Ubuntu 下搭建ESP32 ESP-IDF開發環境,并在windows下用VSCode通過SSH登錄Ubuntu開發ESP32應用

Ubuntu 下搭建ESP32 ESP-IDF開發環境&#xff0c;網上操作指南很多&#xff0c;本來一直也沒有想過要寫這么一篇文章。因為我其實不太習慣在linux下開發應用&#xff0c;平時更習慣windows的軟件操作&#xff0c;只是因為windows下開發ESP32的應用編譯時太慢&#xff0c;讓人受…

Rust使用Cargo構建項目

文章目錄 你好&#xff0c;Cargo&#xff01;驗證Cargo安裝使用Cargo創建項目新建項目配置文件解析默認代碼結構 Cargo工作流常用命令速查表詳細使用說明1. 編譯項目2. 運行程序3.快速檢查4. 發布版本構建 Cargo的設計哲學約定優于配置工程化優勢 開發建議1. 新項目初始化?2. …

免費且好用的PDF水印添加工具

軟件介紹 琥珀掃描.zip下載鏈接&#xff1a;https://pan.quark.cn/s/3a8f432b29aa 今天要給大家推薦一款超實用的PDF添加水印工具&#xff0c;它能夠滿足用戶給PDF文件添加水印的需求&#xff0c;而且完全免費。 這款PDF添加水印的軟件有著簡潔的界面&#xff0c;操作簡便&a…

NW969NW978美光閃存顆粒NW980NW984

NW969NW978美光閃存顆粒NW980NW984 技術解析&#xff1a;NW969、NW978、NW980與NW984的架構創新 美光&#xff08;Micron&#xff09;的閃存顆粒系列&#xff0c;尤其是NW969、NW978、NW980和NW984&#xff0c;代表了存儲技術的前沿突破。這些產品均采用第九代3D TLC&#xf…

Mysql常用知識3:Kafka和數據庫優化

文章目錄 一、分布式消息系統&#xff08;Kafka相關問題5-10&#xff09;5. Kafka如何保證消息不丟失&#xff1f;6. 項目中Kafka具體怎么使用的&#xff1f;7. 消息異常未發送成功怎么解決&#xff1f;8. 重試具體怎么做的&#xff0c;循環嗎&#xff1f;9. 重試多次失敗怎么辦…