每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”
绪论:
本质编写的原因是我在复习过程中突然发现虚拟地址空间和C++内存划分我好想有点分不清时,进行查询各类资料和整理各类文章后得出的文章,本质是为了让我对Linux底层系框架有更好的理解和对C++语言和Linux系统的关系更近一步。
——————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。
C/C++内存区域划分:
在C/C++中他的内存区域划分,由上而下主要由一下分构成:
- 栈区:它主要存储着局部域中的局部变量和函数调用信息(如函数参数、返回地址等)
- 堆区:它主要存储着给用户动态分配的内存空间(通过:malloc,free,new,delete 申请/释放)
- 静态区:它主要存储着全局变量和静态变量
- 常量区:顾名思义存储着常量和常量字符串已经可执行的代码
通过下面这张图来快速的理解和练习巩固记忆:
进程的虚拟地址空间
对于虚拟地址空间来说它的区间划分如下图:
不难发现其实和C++中的差不多,其中不同的是在Linux中:
- 静态区被称为数据段:同样存储的是进程的静态变量和全局变量
- 常量区被称为代码段:主要可以理解成它存储着可执行程序的代码以及代码中的常量
- 还多了两个:
- 内核空间:是留给操作系统内核使用的,一般来说用于处理一些底层系统服务、硬件操作
- 内存映射区(包含共享区):是指多个进程可以共享的一块内存区域,常见于共享库文件或特定数据段。其主要作用包括
内存映射区(共享区)的细节:
- 内存映射区是一个描述过程,指的是操作系统将物理内存划分并映射到虚拟地址空间中的不同区域。
- 这个过程涉及将物理内存分配到内核空间、用户空间和共享区等不同区域。
内存映射区:
- 内存映射区涵盖了整个虚拟地址空间的划分,包括内核空间、用户空间和共享区等。
- 确保每个进程只能访问分配给它的内存区域,防止内核内存被用户程序访问。
- 通过段表和页表机制将物理内存映射到虚拟地址空间,实现内存的高效管理和保护
- 它是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
- 还能创建共享共享内存,做进程间通信。
共享区:
- 共享区是操作系统中允许多个进程共享相同内存区域的部分,通常用于共享库文件或特定数据段。
- 它位于用户空间,并通过特定的机制确保多个进程能够协同使用这些内存区域。
- 如下图:磁盘中的库通过物理地址加载到虚拟地址空间中的内存映射区
右下角的图来说就是:内存映射区的映射关系,每当一次和物理内存的交互就会生成一段映射区间(此处是线程的内存分配、管理和隔离中的一些和内核有关的属性)
总结
C++内存和Linux虚拟地址空间的关系是非常密切的,他们不同的在于Linux进程中多了一些其他的区域(内存映射区、内核空间),方便操作系统的操作!
本章完。预知后事如何,暂听下回分解。
如果有任何问题欢迎讨论哈!
如果觉得这篇文章对你有所帮助的话点点赞吧!
持续更新大量C++细致内容,早关注不迷路。