深入理解進程地址空間:虛擬內存與進程獨立性

目錄

引言

虛擬地址空間的本質

關鍵觀察

進程地址空間布局

虛擬內存管理:mm_struct

虛擬內存的優勢

總結


引言

在操作系統中,每個進程都運行在自己的獨立區域中,這個區域就是??進程地址空間??。今天我們就來探討這個看似真實實則虛擬的內存世界,以及操作系統如何通過精妙的設計實現進程間的隔離與保護。

虛擬地址空間的本質

進程地址空間是操作系統為每個進程分配的??虛擬內存布局??,它定義了進程可以訪問的內存區域及其權限(如代碼、數據、堆、棧等)。關鍵點在于:系統給用戶顯示的程序空間地址都是??虛擬的??,操作系統必須將這些虛擬地址轉換為實際的物理內存地址。

讓我們通過一個簡單的C程序來觀察這一現象:

#include<stdio.h>
#include<unistd.h>int flag = 100;
int main(){int ret = fork();if(ret < 0) return 1;else if(ret == 0){while(1){printf("我是子進程,我的進程id為%d,我的父進程id為%d,flag:%d,flag的地址為:%p\n",getpid(),getppid(),flag,&flag);flag++;sleep(1);}}else{while(1){printf("我是父進程,我的進程id為%d,我的父進程id為%d,flag:%d,flag的地址為:%p\n",getpid(),getppid(),flag,&flag);sleep(1);}}return 0;
}

程序運行的部分輸出結果:

我是父進程,我的進程id為4881,我的父進程id為30195,flag:100,flag的地址為:0x601054
我是子進程,我的進程id為4882,我的父進程id為4881,flag:100,flag的地址為:0x601054
我是父進程,我的進程id為4881,我的父進程id為30195,flag:100,flag的地址為:0x601054
我是子進程,我的進程id為4882,我的父進程id為4881,flag:101,flag的地址為:0x601054
...

關鍵觀察

  1. ??相同的虛擬地址??:父進程和子進程中flag變量的地址都是0x601054
  2. ??獨立的值變化??:子進程修改flag的值不會影響父進程中flag的值
  3. ??進程隔離??:盡管虛擬地址相同,但實際訪問的是不同的物理內存

這完美展示了??進程地址空間的虛擬性??和??進程間的獨立性??。操作系統通過虛擬內存機制,為每個進程提供了看似獨占的地址空間。

進程地址空間布局

進程地址空間由低地址到高地址依次為:

  • ??保留區??:最低地址部分(如0x0~0x400000),不可訪問,防止程序對NULL解引用錯誤
  • ??代碼段(.text)??:存儲可執行指令(函數,控制語句等),權限為只讀
  • ??數據段(.data)??:存儲全局變量和靜態變量,可讀寫
  • ??堆(heap)??:mallocnew動態申請的內存,由低地址向高地址增長
  • ??內存映射區??:用于文件映射、共享庫等
  • ??棧(stack)??:存儲局部變量、函數參數、返回地址等,由高地址向低地址增長
  • ??內核空間??:存儲內核代碼、數據結構、進程管理等,用戶進程不可訪問

虛擬內存管理:mm_struct

操作系統通過mm_struct結構體管理每個進程的虛擬地址空間。其簡化定義如下:

struct mm_struct {unsigned long start_code;  // 代碼段起始地址unsigned long end_code;    // 代碼段結束地址unsigned long start_data;  // 數據段起始地址unsigned long end_data;    // 數據段結束地址unsigned long start_brk;   // 堆起始地址unsigned long brk;         // 堆當前結束地址(堆頂)unsigned long start_stack; // 棧起始地址pgd_t *pgd;                // 頁表(虛擬地址→物理地址的映射)struct vm_area_struct *mmap; // 內存區域鏈表
};

其與task_struct和物理內存的關系如下圖:

關鍵點:

  1. 每個進程都有自己獨立的mm_struct
  2. 通過管理各內存區域的起始和結束地址來管理虛擬內存
  3. 通過頁表(pgd)實現虛擬地址物理地址的映射
  4. 內存映射鏈表(mmap)管理動態內存和文件映射等
    ?

虛擬內存的優勢

  1. ??解耦??:進程控制和內存控制相互獨立,互不干擾
  2. ??安全性??:進程無法直接訪問物理內存,只能通過操作系統提供的虛擬地址
  3. ??隔離性??:每個進程有自己的地址空間,不會相互干擾
  4. ??靈活性??:物理內存可以按需分配,不受虛擬地址空間的限制
  5. ??簡化編程??:程序員無需關心物理內存的實際布局

總結

進程地址空間是操作系統提供的一種抽象,它讓每個進程都以為自己獨占整個內存空間。通過mm_struct和頁表機制,操作系統實現了虛擬地址到物理地址的轉換,既保證了進程間的隔離性,又提高了內存使用的靈活性。這種設計是現代操作系統能夠安全、高效運行多個進程的基礎。

理解進程地址空間對于深入掌握操作系統原理、進行系統級編程和調試內存相關問題都至關重要。希望本文能幫助你更好地理解這一核心概念。

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

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

相關文章

Apache ActiveMQ 任意文件寫入漏洞(CVE-2016-3088)復現利用

漏洞原理 Apache ActiveMQ是Apache軟件基金會所研發的開放源代碼消息中間件&#xff0c;由于ActiveMQ是一個純Java程序&#xff0c;因此只需要操作系統支持Java虛擬機&#xff0c;ActiveMQ便可執行 本漏洞出現在fileserver應用中&#xff0c;漏洞原理其實非常簡單&#xff0c…

谷歌地球與ArcGIS Pro查看三維地形

&#xff08;1&#xff09;Google Earth Web端 通過網站&#xff1a;https://earth.google.com/&#xff0c;進入谷歌地球Web端&#xff0c;可以查看歷史影像、三維地形數據、導入kml文件等。 &#xff08;2&#xff09;ArcGIS Pro查看三維場景 加載3D地形數據&#xff0c;轉…

Day06_C語言網絡編程20250718

01.思維導圖1 什么是 modbus他是一個在工控領域非常好用的通信寫 modbus協議本質上是一個 基于 tcp 協議二次封裝的一個協議 什么叫做基于tcp二次封裝的協議&#xff1a;我們自己寫的pack_t(無論靜態還是動態)&#xff0c;都是屬于二次封裝的協議modbus協議是一種 “主從問答式…

web開發-HTML

web開發——HTML 學習目標&#xff1a;學習HTML的基礎&#xff0c;學會get和post方法區別 一、HTMLHTML是什么&#xff1f; 前端網頁界面開發語言。開發工具 PyCharm、vscodePyCharm個性化設置&#xff08;字體和背景顏色&#xff09; File - setting - appearance - theme&…

主流編程語言全景圖:從Python到Rust的深度解析

2024年編程語言生態報告顯示&#xff0c;全球開發者使用的語言數量已達260&#xff0c;但真正主導行業的不到20種。本文帶你穿透技術迷霧&#xff0c;掌握8大核心語言的本質差異。一、選擇編程語言的黃金標準圖表代碼二、八大主流語言對比解析1. Python - 通用膠水語言特性&…

若依框架下前后端分離項目交互流程詳解

在企業級前后端分離項目開發中&#xff08;如若依RuoYi&#xff09;&#xff0c;前端與后端的數據交互、安全認證、權限校驗、響應處理都是必須關注的重點。本文將以“課程管理列表查詢”為例&#xff0c;詳細梳理整個交互流程&#xff0c;每一步均有解析說明和典型代碼&#x…

cartorgapher的編譯與運行

目錄 cartorgapher的編譯環境 cartorgapher的編譯 cartographer的運行 參數的詳解與調參總結 降低延遲與減小計算量 cartorgapher的編譯環境 系統環境 推薦在ubuntu16.04或者18.04上進行編譯 推薦使用剛裝好的ubuntu系統 將ubuntu的軟件源設置成清華的或者其他的中國境內的…

淺談車載電控和機器人一體化關節電控區別和聯系

類別車載電機關節電機&#xff08;伺服電機)電機PMSM 有軸 永磁體內嵌IPMPMSM&BLDC 永磁體表貼 SPM&#xff0c;轉速不高&#xff0c;減少體積 關節和推桿用無框力矩電機&#xff1a;只有定子和轉子&#xff0c;無軸&#xff0c;無外殼和端蓋&#xff0c;便于和編碼器減速器…

【數據結構】堆(下)+ 二叉樹

上期回顧&#xff1a;【數據結構】樹&#xff08;堆&#xff09;上 一.堆的應用 1.1堆排序&#xff08;向下調整在上一期&#xff09; 向上調整算法建堆&#xff1a; 首先先回顧一下向上調整算法 void AdjustUP(HPDataType* arr, int child) {int parent (child - 1) / 2…

Elasticsearch MCP 服務器現已在 AWS Marketplace 上提供

作者&#xff1a;來自 Elastic Udayasimha Theepireddy (Uday), Matt Ryan, Srinivas Pendyala 我們很高興地宣布&#xff0c;Elasticsearch Model Context Protocol&#xff08; MCP &#xff09;服務器現已在 AWS Marketplace 上提供。 使用 MCP 將代理連接到 Elasticsearch …

【Linux】Makefile(一)-介紹

Makefile 本篇博客是作者在學習Linux方面知識過程中&#xff0c;對Makefile片面的了解&#xff0c;從而產生了對Makefile有一個全面的認識的想法&#xff0c;在知道《跟我一起寫Makefile》此書后&#xff0c;作者學習閱讀過程中整理出的筆記。 目錄Makefilemakefile介紹:規則&…

Java爬蟲與正則表達式——用正則來爬取數據

APIJava幫我們寫好的各種功能的Java類。這些Java類統稱為API。正則表達式就是API幫我們寫好的類。正則表達式例子&#xff1a; 字符類&#xff1a;[abc]&#xff1a;只能是a&#xff0c;b或c[^abc]&#xff1a;除了a&#xff0c;b&#xff0c;c之外的任何字符[a-zA-Z]&#xff…

【后端】.NET Core API框架搭建(8) --配置使用RabbitMQ

目錄 1.添加包 2. 連接配置 2.1.連接字符串 2.2.連接對象 3.創建連接服務 3.1.添加配置獲取方法 3.2.服務實現類 3.3.服務接口 4.創建生產者服務 4.1.生產者實現類 4.2.生產者接口 5.創建消費者服務 5.1.消費者服務接口 5.2.消費者接口 6.注冊 7.簡單使用案例 7.1.實現…

Apache SeaTunnel配置使用案例

前置操作 Apache SeaTunnel詳解與部署&#xff08;最新版本2.3.11&#xff09;-CSDN博客 mkdir /usr/local/soft/apache-seatunnel-2.3.11/job/ 一、MySQL to HDFS 官方配置參考&#xff1a; MySQL | Apache SeaTunnel Hdfs文件 | Apache SeaTunnel 1、配置確認 將mysq…

GitCode 使用高頻問題及解決方案

GitCode 作為一款強大的版本控制系統&#xff0c;在軟件開發流程中起著舉足輕重的作用。然而&#xff0c;在使用過程中&#xff0c;開發者們常常會遇到各種各樣的問題。本文將匯總 GitCode 使用中的高頻問題&#xff0c;并提供詳細的解決方案&#xff0c;幫助開發者們更順暢地使…

在FreeBSD系統使用chroot進入Ubuntu仿真環境使用Localsend軟件發送和接受文件

LocalSend是一款非常實用的在不同系統&#xff08;Windows、MacOS、Linux、Android和IOS&#xff09;傳遞文件的程序。我們這次的實踐&#xff0c;就是要在FreeBSD下也能發送和接收文件。 安裝LocalSend 跟在Ubuntu下安裝非常類似&#xff0c;只是不需要下面的第一步&#xf…

交叉熵損失F.cross_entropy在分類模型中的應用

一、核心思想&#xff1a;通過概率分布懲罰錯誤交叉熵損失的本質是&#xff1a; 比較模型預測的概率分布 vs 真實標簽的概率分布&#xff0c;懲罰兩者之間的差異。例如&#xff1a;真實標簽&#xff1a;圖像 0 → 文本 0&#xff08;獨熱編碼 [1, 0, 0, ...]&#xff09;模型預…

測試學習之——Pytest Day3

引言Pytest 作為 Python 中最受歡迎的測試框架之一&#xff0c;以其簡潔的語法、強大的功能和豐富的插件生態系統&#xff0c;極大地提升了自動化測試的效率和可維護性。在本文中&#xff0c;我們將深入探討 Pytest 的兩大核心特性&#xff1a;Fixture 和插件管理&#xff0c;幫…

控制Vue對話框顯示隱藏

正確做法 — 使用 Vue 數據驅動控制顯隱你不需要手動設置 display: block&#xff0c;因為 Element Plus 的 <el-dialog> 是基于 v-model 或 :visible.sync 控制的。&#x1f527; 修改模板部分&#xff1a;將原來的&#xff1a;<el-dialog title"報文詳情"…

直播帶貨與開源AI智能名片鏈動2+1模式S2B2C商城小程序:重塑電商營銷新格局

摘要&#xff1a;本文聚焦于直播帶貨對互聯網供需關系的深刻影響&#xff0c;分析其如何改變傳統電商營銷模式&#xff0c;實現從“人找貨”到“貨找人”的轉變。同時&#xff0c;引入開源AI智能名片鏈動21模式S2B2C商城小程序這一創新概念&#xff0c;探討其在直播帶貨背景下的…