目录

引言

虚拟地址空间的本质

关键观察

进程地址空间布局

虚拟内存管理: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;探讨其在直播带货背景下的…