<一>关于进程虚拟地址空间区域内存划分和布局
C++代码在编译完成后会生产.exe程序(windows平台), .EXE以文件的形式存储在磁盘上,当运行.exe程序的时候
操作系统会将磁盘上的.exe文件加载到内存中,那么在加载到内存中的时候,操作系统是如何在内存中存放这个exe程序的?
有没有区域的划分?那么是如何划分的?
首先需要了解一点,程序加载到内存中,是不能直接加载到物理内存中的
现在我们以 X86平台的Linux 环境举例
当我们一个程序(进程)在启动执行时,操作系统会为其分配一个4G(2的32次方)的内存空间(就是进程的虚拟内存地址空间)
如下图内存分配图

点击查看代码
#incclude <iostrea>
using namespace std;
int gdata1=1;
int gdata2=0;
int gdata3;
static int gdata4=10;
static int gdata5=0;
static int gdata6;
int main(){
int a=100;
int b=0;
int c;
static int d=1000;
static int e=0;
static int f;
return 0;
}
如上面代码中的全局变量
gdata1,gdata2,gdata3,gdata4,gdata5,gdata6
无论是普通的还是静态的,他们都叫"数据",每一个数据在编译后,在符号表中都会产生符号.
gdata1和gdata4 初始化了的,而且值部不为0,所以存储在.data段
gdata2和gdata5 初始化了,但是值为0,所以存储在.bss段
gdata3和gdata6 未初始化,存储在.bss段
main 函数中的 a,b,c 不是数据,不会在符号表中产生符号,他们编译只产生指令
例如:move dword prt[a], och ,他们是存储在.text段,当程序运行到这里时,他们是在栈上分配空间的
对于静态的局部变量 如 d,e,f 也是数据,存放在数据段,也会在符号表中产生符号,
程序启动的时候不会初始化,而是在第一次运行到的时候才会初始化, d存储在.data段,e,f存储在.bss段
打印C的值,是一个栈上的随机值,打印f,由于存储在.bss段,系统会负责为.bss段做初始化,置0,所以打印出来f为0

上面红框部分存储在代码段,蓝色框部分存储在数据段
注意:不同的进程之间,用户空间是私有的,内核空间是共享的
<一>关于进程虚拟地址空间区域内存划分和布局的更多相关文章
- java内存划分
运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域.这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启动 ...
- Windows进程通信 -- 共享内存(1)
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...
- JVM内存划分
JVM内存划分吗? 前言: 大家都知道虚拟机,都知道JVM,其实这些都是基于sun公司[oracle公司]的HotSpot虚拟机,当然本篇博文也是以sun公司为基础.还有其他的虚拟机,常见的就有JRo ...
- Java运行时内存划分
这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...
- java 虚拟机内存划分,类加载过程以及对象的初始化
涉及关键词: 虚拟机运行时内存 java内存划分 类加载顺序 类加载时机 类加载步骤 对象初始化顺序 构造代码块顺序 构造方法 顺序 内存区域 java内存图 堆 方法区 虚拟机栈 本地 ...
- 深入理解java虚拟机(一)虚拟机内存划分
Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区.这些区域有不同的特性,起不同的作用.它们有各自的创建时间,销毁时间.有的区域随着进程的启动而创建,随着进程结束而销毁,有的 ...
- Windows进程通信 -- 共享内存
享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 Wi ...
- PG进程结构和内存结构
本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...
- Linux进程的虚拟内存区域划分
Linux进程的虚拟内存区域分为:代码区.只读常量区.全局区.BSS段.堆区.栈区 代码区:存储功能代码,函数名所在的区域 只读常量区:存放字符串常量,以及const修饰的全局变量 全局区/数据区:存 ...
随机推荐
- H5移动端实现一键复制或长摁复制
今天接到了一个新的需求,要求我们对表单中的某一个字段进行复制,这个表单是不可选的,拿到需求的时候有点懵,不清楚下手点在哪,后来网上找了找,终于有了点眉目,感觉网上有些是实现不了的,特地在这里记录下进行 ...
- centos7设置虚拟机静态ip
转自http://blog.csdn.net/y534560449/article/details/60134301 一.设置VM的NAT方式 1.打开VM->编辑->虚拟网络编辑器-&g ...
- Pinhole类声明和实现
针孔相机,带旋转,移动等功能. 类声明: #pragma once #ifndef __PINHOLE_HEADER__ #define __PINHOLE_HEADER__ #include &qu ...
- 达人专栏 | 还不会用 Apache Dolphinscheduler?大佬用时一个月写出的最全入门教程【三】
作者 | 欧阳涛 招联金融大数据开发工程师 02 Master启动流程 2.10 WorkFlowExecutorThread 里执行 Submit StandByTask 方法 SubmitStan ...
- Luogu3090 [USACO13NOV]空荡荡的摊位Empty Stalls (动态规划)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- Druid学习之查询语法
写在前面 最近一段时间都在做druid实时数据查询的工作,本文简单将官网上的英文文档加上自己的理解翻译成中文,同时将自己遇到的问题及解决方法list下,防止遗忘. 本文的demo示例均来源于官网. D ...
- Android蓝牙线控切歌、连接状态监听(无线耳机也适用)
1. 监听蓝牙设备(音频)连接状态 所有代码已测试在Android11也能正常使用 (Android SDK 30) 首先新建一个广播类 BluetoothStateReceiver /** * @a ...
- mybatis_config xml配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- sklearn中MLPClassifier源码解析
神经网络 .fit() 首先传入类私用方法._fit() 确定hidden_layer_size是可迭代的 调用_validate_hyperparameters验证超参数是否合法 验证输入的x和y是 ...