我们常说的32位系统为每个进程分配4G虚拟内存空间(而MMU负责把这些个4G虚拟内存映射到实际内存条的物理内存),其实只有0~3G才是真正完全属于进程本身,是我们所说的用户区;3~4G这1G是所有进程间共享的,是我们所说的内核区,我们的程序是无法直接访问内核区的。

#include<stdio.h>

int a;    //未初始化全局区 .bss
int b=; //已初始化全局区 .data
static int c=; //已初始化全局区 .data
const int d=; //只读数据段,也叫文字常量区 ro.data, d的值不能被修改
int main(void)
{
int e=; //栈区
static int f=; //已初始化全局区
const int g=; //栈区,不能通过变量名修改其值,但可通过其地址修改其值
int *p=malloc(sizeof(int)) //指针变量p在栈区,但其所指向的4字节空间在堆区
char *str="abcd"; //字符串“abcd”存在文字常量区,指针变量str在栈区,存的是“abcd”的起始地址
return ;
}

  地方教材上常说:“全局变量在编译时分配空间,局部变量在运行时分配空间”,这在像vs这种集成式开发工具中,我们写个简单的程序,直接点个“运行”,编译、运行一步到位,很容易理解,但如果在linux上用vim写代码,用gcc编译生成a.out执行文件,再./a.out运行时,其实只剩下了“运行”这一步,那编译时分配又怎么解释呢?

  其实编译时就只是确定了全局变量(静态局部变量也算)的虚拟地址,并且相关信息存在了可执行文件a.out中。我们再说一个进程(即正在执行的可执行文件)大概有4种状态:就绪(等待cpu)—>运行(占用cpu)—>挂起(等待cpu之外的资源,主动放弃cpu)—>终止    另外:初始态为进程准备阶段,常与就绪合并 ,就是在这个初始态阶段,做了很多准备工作,其中一项就是根据全局变量的虚拟地址映射物理地址为其分配空间,并初始化好。所以全局变量在程序进入main()函数之前,就已经在内存中存在了,而局部变量和堆区变量就只有程序执行到声明(或定义)它的那一条语句,才开始为其申请分配空间。

参考博客:

  https://blog.csdn.net/m0_37829435/article/details/81158960

c++内存管理5-虚拟内存4区结构图的更多相关文章

  1. Win32之内存管理之虚拟内存跟物理内存

     Win32之内存管理 一丶虚拟内存和物理内存 我们知道每个应用程序都有自己独立的4GB空间.  假设A进程的 地址123 存储了10  那么B进程的123地址 存储了20 那么它们两个是互不影响的. ...

  2. (三)java虚拟机内存管理和线程独占区和线程共享区

    一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...

  3. Linux2.6内核--内存管理(2)--区

    由于硬件的限制,内核不能对所有的页一视同仁.有些页位于内存中的特定物理地址上,所以,不能将其用于一些特别的任务.(关于内存分页机制可以查看:http://blog.csdn.net/dlutbruce ...

  4. JVM的生命周期、体系结构、内存管理和垃圾回收机制

    一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...

  5. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  6. Linux内存管理(一)

    Linux内存管理之一:基本概念篇 物理地址.线性地址(虚拟地址)和逻辑地址:阐述段式管理和页式管理基本概念:Linux操作系统内存管理和虚拟内存概念:为内核开发做一个基础铺垫. 内存是linux内核 ...

  7. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  8. 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...

  9. java内存管理(堆、栈、方法区)

    java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉 ...

  10. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

随机推荐

  1. Spring Boot 缓存 知识点

    每次调用需要缓存功能的方法时,Spring会检查指定参数的指定的目标方法是否已经被调用过:如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户.下次调用直接从缓存中获取. ...

  2. 记录一次群答问:jmeter正则提取器轻松提取一个及多个值

    图截得比较完整,电脑端浏览器放大倍数看吧^_^,手机端可以点击图片然后放大看. 一个正则提取问题 前几天,在Q群和微信群里被同时@,咨询这样一个问题:服务器返回:name="tom" ...

  3. NameNode和SecondaryNameNode

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/weixin_37838429/artic ...

  4. HDFS的Shell、java操作

    HDFS的Shell操作 1.基本语法 bin/hadoop fs 具体命令   OR  bin/hdfs dfs 具体命令 dfs是fs的实现类. 2.命令大全 [Tesla@hadoop102 h ...

  5. BZOJ 1802: [Ahoi2009]checker

    题目描述 若有两个红格相邻 第一问的答案为0,所有位置上的棋子都可以通过在这两个格子上放棋子得到 第二设f[i]表示想让第i个格子上有棋子需要放的棋子数 若没有,第一问答案为偶数格子上白格的个数,第二 ...

  6. 如何使用git把本地代码上传到远程仓库上

    初始化 git init 查看当前仓库状态 git status 将项目的文件添加到仓库中 git add test.txt git add -A git add . 将add的文件commit到仓库 ...

  7. VS设置自动压缩CSS

  8. 前端微服务初试(singleSpa)

    1.基本概念 实现一套微前端架构,可以把其分成四部分(参考:https://alili.tech/archive/11052bf4/) 加载器:也就是微前端架构的核心,主要用来调度子应用,决定何时展示 ...

  9. mybatis多参数查询问题:org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available par

    错误如下:  这个是由于在执行sql的时候无法匹配sql语句的通配符造成的,有两种方式可以解决 第一种:在sql语句中通配符这样写,用0,1匹配:  第二种:在dao接口的方法中的参数前面加param ...

  10. [原创]Android 常用adb命令总结

    [原创]Android 常用adb命令总结 1 adb介绍 1.1 adb官方网站及下载 官方网站下载安装:http://adbshell.com/downloads 1.2 adb安装是否成功检查? ...