【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据

news/2025/2/26 5:41:42


每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论:
本质编写的原因是我在复习过程中突然发现虚拟地址空间和C++内存划分我好想有点分不清时,进行查询各类资料和整理各类文章后得出的文章,本质是为了让我对Linux底层系框架有更好的理解和对C++语言和Linux系统的关系更近一步。
——————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。


C/C++内存区域划分:

在C/C++中他的内存区域划分,由上而下主要由一下分构成:

  1. 栈区:它主要存储着局部域中的局部变量和函数调用信息(如函数参数、返回地址等)
  2. 堆区:它主要存储着给用户动态分配的内存空间(通过:malloc,free,new,delete 申请/释放)
  3. 静态区:它主要存储着全局变量和静态变量
  4. 常量区:顾名思义存储着常量和常量字符串已经可执行的代码

通过下面这张图来快速的理解和练习巩固记忆:
在这里插入图片描述

进程的虚拟地址空间

对于虚拟地址空间来说它的区间划分如下图:
不难发现其实和C++中的差不多,其中不同的是在Linux中:

  1. 静态区被称为数据段:同样存储的是进程的静态变量和全局变量
  2. 常量区被称为代码段:主要可以理解成它存储着可执行程序的代码以及代码中的常量
  3. 还多了两个:
  4. 内核空间:是留给操作系统内核使用的,一般来说用于处理一些底层系统服务、硬件操作
  5. 内存映射区(包含共享区):是指多个进程可以共享的一块内存区域,常见于共享库文件或特定数据段。其主要作用包括
    在这里插入图片描述

内存映射区(共享区)的细节:

  • 内存映射区是一个描述过程,指的是操作系统将物理内存划分并映射到虚拟地址空间中的不同区域。
  • 这个过程涉及将物理内存分配到内核空间、用户空间和共享区等不同区域。

内存映射区:

  1. 内存映射区涵盖了整个虚拟地址空间的划分,包括内核空间、用户空间和共享区等。
  2. 确保每个进程只能访问分配给它的内存区域,防止内核内存被用户程序访问。
  3. 通过段表和页表机制将物理内存映射到虚拟地址空间,实现内存的高效管理和保护
  4. 它是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
  5. 还能创建共享共享内存,做进程间通信。

共享区:

  1. 共享区是操作系统中允许多个进程共享相同内存区域的部分,通常用于共享库文件或特定数据段。
  • 它位于用户空间,并通过特定的机制确保多个进程能够协同使用这些内存区域。
  • 如下图:磁盘中的库通过物理地址加载到虚拟地址空间中的内存映射区

右下角的图来说就是:内存映射区的映射关系,每当一次和物理内存的交互就会生成一段映射区间(此处是线程的内存分配、管理和隔离中的一些和内核有关的属性)
在这里插入图片描述

总结

C++内存和Linux虚拟地址空间的关系是非常密切的,他们不同的在于Linux进程中多了一些其他的区域(内存映射区、内核空间),方便操作系统的操作!


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++细致内容,早关注不迷路。


http://www.niftyadmin.cn/n/5868080.html

相关文章

django filter 不等于

然,我很乐意帮助你解决关于Django Filter的问题。首先,请确保你具体指的是Django的django-filter库,这是一个非常流行的第三方库,用于在Django项目中提供更复杂的搜索和过滤功能。 不等于的过滤 如果你需要在Django中使用django-…

Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案

Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案 拿了一个比较老的项目部署在本地,然后先安装依赖npm install,最后npm run serve,在run serve的时候报错:报错error:0308010C:digital envelope routines::unsupported&#xff…

【MySQL】表连接原理

目录 1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4】嵌套循环连接【5】join buffer 4、总结 1、背景 在进行sql查询时有时需要多张表的查询结果组成一个共同的结果返回,这时就用到了mysql中连接的用法,接下来就以两张表…

Maven 从下载到实战:一站式配置与使用指南

一、Maven 简介 Maven 是一款基于 POM(Project Object Model) 的 Java 项目管理工具,支持依赖管理、构建自动化、标准化项目结构等功能。其核心优势包括: 依赖管理:自动下载和管理第三方库(JAR 包&#xf…

数据中心“失宠”与AI算力争夺加剧的深度剖析与未来展望

一、案例分析:微软取消数据中心租约事件 1.1 事件回顾 2025 年2月,微软取消数据中心租约这一事件在科技行业引起轩然大波。据投行 TD Cowen 的报告显示,微软通过对供应链渠道的深入调查,发现微软已取消了总计 “数百兆瓦” 容量…

【Java项目】基于SpringBoot的【旅游管理系统】

【Java项目】基于SpringBoot的【旅游管理系统】 技术简介:采用Java技术、MySQL数据库、Spring框架实现。 系统简介:系统包括管理员、用户二个用户角色,管理员功能可以管理个人中心、用户管理、景区分类管理、景区信息管理、景区商城管理、商品…

django:更新页面但未生效

一、前言 在运维一个三方django项目时发现: 新打包上传的vue静态页面并没有被django替换,页面请求时,仍响应的是老版本的页面内容(该内容实际上已经被删除)。 尽管清理了浏览器缓存,仍无法解决这一问题。 二…

平滑升级旧版nginx,支持lua动态代理转发多个云平台VNC画面

nginx是部署在华为欧拉的docker容器中,版本是2203sp1.x86_64 查看旧版nginx的版本与编译配置信息: nginx -Vnginx version: nginx/1.24.0 built by gcc 10.3.1 (GCC) built with OpenSSL 1.1.1wa 16 Nov 2023 TLS SNI support enabled configure argum…