爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【Linux】翻山越岭——进程地址空间

      首页 知识中心 其他 文章详情页

      【Linux】翻山越岭——进程地址空间

      2023-07-26 08:09:55 阅读次数:427

      linux,地址,进程

      一、是什么

      回顾我们学习C/C++时的地址空间:

      【Linux】翻山越岭——进程地址空间

      有了这个基本框架,我们对于语言的学习更加易于理解,但是地址空间究竟是什么❓我们对其并不了解,是不是内存呢?对于是什么这个问题,我们需要通过一个例子来进行切入,见一见现象

      下面我们通过代码看现象:

      【Linux】翻山越岭——进程地址空间

      【Linux】翻山越岭——进程地址空间

      我们发现子进程把全局变量global_value修改之后,子进程和父进程的值是不同的,这些我们都能理解,因为进程之间具有独立性。但是这里global_value的地址居然是相同的!!!多进程在读取同一个地址的时候怎么可能出现不同的结果,地址相同说明了这里的地址并不是对应的物理地址,如果是物理地址改完之后打印出来的值是一样的,这也很好理解。

      这里的地址实际上是虚拟地址(线性地址),Linux也有可能叫做逻辑地址。

      我们可以感性地理解虚拟空间。

      进程会认为自己是独占系统资源的,然而实际上并不是。操作系统会给每个进程创建地址空间,然后通过页表映射到物理内存,找到

      虚拟空间。所以对于我们而言,直接使用虚拟地址,操作系统再从虚拟地址到页表加载到内存,在通过页表映射,找到对应的物理内存。也就是说,操作系统自动完成。

      【Linux】翻山越岭——进程地址空间

      所以,对于我们刚开始的现象很好解释了:

      父进程和子进程都有自己的独立的进程地址空间,且都有自己的页表结构,子进程由父进程创建,所以子进程的地址空间是从父进程拷贝而来,刚开始的g_val经过映射指向同一个物理内存,所以刚开始看到的都是100

      后来子进程修改了自己地址空间的g_val的值,当操作系统通过页表映射发现g_val的值是共享的,但是我们知道进程具有独立性,所以操作系统为了保证进程的独立性,当子进程或者父进程任何一方尝试对共享数据进行写入,那么操作系统会在物理内存上重新开辟一块新的内存空间,拷贝数据,然后在修改映射关系,不再指向老的变量,在整个修改的过程中,和父子进程的虚拟地址没有任何关系,只是底层经过页表映射到不同的区域,所以我们看到了地址是一样的,但是内容却是不一样的,这就是现象的由来!

      写时拷贝

      上述的任何一方尝试写入,操作系统先进行数据拷贝,更改页表映射,然后再让进程进行修改的技术称为写时拷贝

      进程地址空间上的地址从全0到全1按照正常的方式排列,所以是连续的地址,所以这个地址空间也被称为线性地址;对于磁盘程序内部的地址称为逻辑地址,在Linux下,虚拟地址到线性地址、逻辑地址是一样的,但在其他地方,区分比较明确,


      二、为什么

      了解了进程地址空间是什么了以后,那为什么存在进程地址空间呢?

      • 进程地址空间保证了数据的安全性

      每个进程都有进程地址空间,所有的进程都要通过页表映射到物理内存,如果进程直接访问物理内存,万一进程越界非法访问、非法读写时,页表就可以进行拦截,而且直接访问物理内存对于账号信息是非常不安全的,所以保证了内存数据的安全性

      • 地址空间的存在,可以更方便的进行进程和进程的数据代码的解耦,保证了进程独立性的特征

      对于进程而言,都有独立的地址空间及页表,通过页表映射到不同的物理内存上,所以一个进程数据的改变不会影响到另一个进程,保证了进程的独立性,而对于上面我们所说的父进程和子进程而言,子进程的地址空间从父进程拷贝,页表都指向同一块物理内存,但是即使此时的数据是共享的,在修改数据的时候也会发生我们所说的写时拷贝,保证了进程的独立性

      • 让进程以统一的视角,看待进程对应的代码和数据各个区域,方便编译器也以统一的视角来进行编译代码

      可执行程序被编译器编译的时候每个代码和数据在内存中已经有虚拟地址了(在磁盘上称为逻辑地址),也就是说,地址空间对于操作系统和编译器都是遵守的。所以当程序被加载到内存成为进程后,每个变量/函数都具备了物理地址。

      所以我们现在有两套地址:1.标识物理内存中代码和数据的地址2.在程序内部互相跳转的时候的虚拟地址

      加载完成之后,代码的各个区域的地址已经知道。进程被调度时,CPU拿到虚拟地址,经过地址空间查页表通过映射,进行访问查到物理地址往后执行。也就是CPU通过了虚拟地址——页表映射——物理地址执行。也就是在整个CPU运行过程中,CPU并没有见到物理地址,用的都是虚拟地址。

      另外,对于磁盘内可执行程序编译好,这个可执行程序的地址不叫虚拟地址,是逻辑地址。但是对于Linux而言,虚拟地址、线性地址、逻辑地址都是一样的。


      三、怎么做

      由操作系统管理进程地址空间。并且操作系统会为每个进程创建进程地址空间,但是对于操作系统来说,存在着比较多的进程,所以操作系统需要对进程地址空间进行管理。如何去管理?先描述,在组织。这是我们之前所说的。

      进程本身是需要被管理的(通过先描述,在组织),所以操作系统会使用内核数据结构对地址空间进行管理,这个地址空间实际是内存的一种数据结构mm_struct,OS会为每个进程创建一个mm_struct对象,进行管理。

      说了这么多,mm_struct是什么样子的,打开VScode,我们可以来看一看mm_struct的源代码:

      【Linux】翻山越岭——进程地址空间

      【Linux】翻山越岭——进程地址空间

      每个进程都有对应的task_struct,在其属性中有mm_struct,可以找到进程的地址空间。

      区域划分和调整

      地址空间有很多个区域,比如栈区、堆区、数据区、代码段,那进程地址空间是如何进行区域划分和区域调整的:把一个区域的end和start进行调整和维护内存区域

      struct mm_struct{
          uint32_t code_start,code_end;
          uint32_t data_start,data_end;
          uint32_t heap_start,heap_end;
          uint32_t stack_start,stack_end;
      }
      

      所谓的区域调整,本质就是修改各个区域的end或start.

      补充:

      对于区域划分,进程地址空间的划分实际上是这个样子:

      【Linux】翻山越岭——进程地址空间

      0-3G是用户空间,而命令行参数和环境变量是在用户空间的,这也是为什么我们可以在main()函数通过第三个参数env获取环境变量的原因。3-4G是内核空间。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/weixin_60478154/article/details/127931257,作者:平凡的人1,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【Linux】shell命令行简单解释器

      下一篇:【Linux】项目自动化构建工具——make/Makefile及拓展

      相关文章

      2025-05-19 09:04:53

      查看RISC-V版本的gcc中默认定义的宏

      查看RISC-V版本的gcc中默认定义的宏

      2025-05-19 09:04:53
      c++ , linux
      2025-05-19 09:04:44

      地址与指针

      地址与指针

      2025-05-19 09:04:44
      char , 地址 , 指向
      2025-05-16 09:15:24

      WCF 配置文件分解

      WCF 配置文件分解

      2025-05-16 09:15:24
      localhost , WCF , 地址 , 服务 , 配置
      2025-05-16 09:15:10

      Linux系统基础-进程信号超详细讲解

      Linux系统基础-进程信号超详细讲解

      2025-05-16 09:15:10
      kill , 信号 , 命令 , 进程
      2025-05-14 10:33:31

      计算机小白的成长历程——数组(1)

      计算机小白的成长历程——数组(1)

      2025-05-14 10:33:31
      strlen , 个数 , 元素 , 内存 , 十六进制 , 地址 , 数组
      2025-05-14 10:33:25

      超级好用的C++实用库之网络

      在网络相关的项目中,我们经常需要去获取和设置设备的IP地址、子网掩码、网关地址、MAC地址等信息。这些信息一般与操作系统相关,在Windows系统和Linux系统上调用的接口是不一样的。

      2025-05-14 10:33:25
      Linux , 参数 , 地址 , 接口 , 网卡 , 返回值
      2025-05-14 10:02:58

      Linux top 命令使用教程

      Linux top 是一个在Linux和其他类Unix 系统上常用的实时系统监控工具。它提供了一个动态的、交互式的实时视图,显示系统的整体性能信息以及正在运行的进程的相关信息。

      2025-05-14 10:02:58
      CPU , 信息 , 内存 , 占用 , 备注 , 进程
      2025-05-14 09:51:21

      python向IP地址发送字符串

      在Python中,向IP地址发送字符串通常意味着你需要通过某种协议来实现通信。最常见的协议包括TCP和UDP。这里,我将分别给出使用TCP和UDP协议向指定IP地址发送字符串的示例代码。

      2025-05-14 09:51:21
      TCP , UDP , 协议 , 地址 , 示例 , 端口
      2025-05-13 09:53:13

      计算机萌新的成长历程18——指针

      计算机要存储数据的话有以下几种途径,按访问速度由快到慢来排列分别是:寄存器>高速缓存>内存>硬盘。它们的存储空间大小是依次增大的,寄存器的存储空间大小最小,硬盘存储空间大小最大。

      2025-05-13 09:53:13
      内存 , 变量 , 地址 , 寄存器 , 指针
      2025-05-13 09:51:29

      ogg在启动应用进程时报错OGG-00412

      ogg在启动应用进程时报错OGG-00412

      2025-05-13 09:51:29
      ogg , OGG , 时报 , 进程
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5274830

      查看更多

      最新文章

      查看RISC-V版本的gcc中默认定义的宏

      2025-05-19 09:04:53

      地址与指针

      2025-05-19 09:04:44

      ogg在启动应用进程时报错OGG-00412

      2025-05-13 09:51:29

      复原 IP 地址

      2025-05-12 08:45:17

      【Linux 从基础到进阶】进程管理与性能调优

      2025-05-09 08:51:09

      MFC如何打开和关闭进程、动态获取进程号、关闭自身进程

      2025-05-07 09:08:16

      查看更多

      热门文章

      Linux crontab 任务误删恢复及备份步骤

      2023-03-20 08:19:07

      Linux 趣味小知识--软硬连接以及应用

      2023-04-23 09:32:49

      Linux常用命令总结

      2023-05-12 07:20:42

      linux-压缩与解压缩

      2023-05-15 10:03:24

      linux基本命令(47)——iostat命令

      2023-05-12 07:21:43

      Linux中文本搜索命令grep用法详解

      2023-06-07 07:36:41

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      linux xfs 和 ext4的区别

      LVM逻辑卷企业实战实例

      指针四番启新章,常量开篇趣满腔

      Linux之查看文件内容命令 cat more gedit 管道

      IPv4的地址真的用光了吗

      Shell 跨脚本间变量传递

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号