上一篇文章学了堆,栈以及静态存储区。它们实际上都是针对进程来说的。那么程序与进程有什么区别呢?

本文不细讲程序与进程。

1 程序与进程

1.1 什么是程序

写完的.c文件是源文件。也叫源代码。

将源代码编译后,会生成可执行文件程序(Linux下是.out,windows下是.exe)。这个文件就是程序。也叫作可执行代码。

比如下面的源代码对应的可执行文件的内容:

那么程序文件中,各个段的作用是什么?

  • 堆和栈是在程序运行开始后才正式存在。是程序运行的基础
  • .bss段存放的是未初始化的全局变量和静态局部变量(初始化为0的也算未初始化这里)
  • .text段存放的是程序中的可执行代码
  • .data段存放的是已经初始化了的全局变量和局部静态变量.
  • .rodata段存放的是程序中的常量值。如字符串字面量。

上述图中,程序中的函数的局部变量是在程序运行开始后才在栈空间分配内存。那么在可执行文件中,局部变量是怎么记录的?

实际上在可执行文件中有一个符号表,这个符号表记录了所有符号(变量和函数名)的信息。当程序加载到内存的时候,加载器根据符号表里记录的关于局部变量的信息来为局部变量分配栈空间。

1.2 什么是进程

程序是可执行文件。那么将可执行文件加载到内存中去运行就形成了进程。进程的内存布局与可执行程序文件的布局的关系大致如下(不够细致,这里只是笼统的讲解它们的区别):

可以看到进程中是没有File Header字段的。

1.3 程序与进程的不同点

  • 程序是静态的概念。表现形式为一个可执行文件
  • 进程是动态的概念。由操作系统加载程序运行后变为进程
  • 每个程序可以对应多个进程
  • 每个进程只能对应一个进程

1.4 程序术语的对应关系

  • 静态存储区通常指进程(或者程序也一样)中的:.data,.bss,段
  • 只读存储区通常指进程中的:.rodata段
  • 局部非静态变量所占空间为栈空间 .是进程里的
  • 动态空间为堆中的空间 ,也是进程里的
  • 程序的可执行代码存在于.text段。是只读的。

2 总结

  • 熟练的区分程序与进程的一些概念。概念很容易说错。

【C语言进阶深度学习记录】三十六 程序与进程的区别(程序的内存布局)相关推荐

  1. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  2. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  3. 【C语言进阶深度学习记录】十五 编译过程简介

    文章目录 1 初识编译器 2 总结 1 初识编译器 我们平时口中所说的编译器,是广泛的编译器.实际上,编译器包括了以下四个部分: 一个C代码被编译为可执行代码,包括以下几个过程: 下面就对上述的各个过 ...

  4. 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式

    文章目录 1 三目运算符 1.1 三目运算符的返回类型的代码案例分析 2 逗号表达式 2.1 逗号表达式代码案例分析 2.2 如何用一行代码实现 strlen函数 3 总结 1 三目运算符 三目运算符 ...

  5. 【C语言进阶深度学习记录】十八 条件编译的使用与分析

    文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...

  6. 【C语言进阶深度学习记录】十二 C语言中的:字符和字符串

    文章目录 1 C语言中的单引号和双引号 1.1 双引号带来的BUG 2 总结 1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量 C语言中的双引号用来表示字符串字面量,存储于全局的只读存 ...

  7. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

    本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...

  8. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  9. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  10. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

最新文章

  1. 500个普通人名_2020年世界500强汽车行业排名:大众公司第一,丰田汽车公司第二...
  2. python 语言教程(3)数据类型
  3. 【Python】关于jupyter几个不得不知道的tips
  4. ubuntu下KDvelop中怎么显示行号
  5. 修改内核配置解决busybox的mdev -s启动速度慢的问题
  6. 【Css】基础属性(一)
  7. java中函数_java中的函数
  8. Ubuntu解决依赖关系问题
  9. WPF中自定义MarkupExtension
  10. 使用ssh工具连接window虚拟机中的linux系统
  11. 应用计算机测pn结正向电压,PN结正向压降与温度关系的研究实验报告
  12. 聊天机器人-基于QQ聊天记录训练
  13. 自动设置微信朋友圈权限
  14. 老毛桃u盘装系统linux,老毛桃U盘装系统综合教程
  15. 报错:TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the
  16. python中scale啥意思_scale什么意思
  17. 微信京东手机怎么联系客服人工服务器,微信人工客服电话是多少?打不通怎么办?...
  18. 学习新手给Android新手的一些学习建议
  19. 从头开始搞懂 MySQL(07)为什么同一条 SQL 时快时慢
  20. windows下MySQL数据库如何移动到其它盘

热门文章

  1. python之lambda
  2. CSS之基于视窗单位的排版
  3. java 图片阴影_Java 为 PPT 中的图形添加阴影效果
  4. kali字典_kali黑客系统wpscan工具扫描wordpress漏洞入侵攻击测试教程
  5. Ajax技术简单入门
  6. js基础---js组成以及基本认知
  7. .NET深入实战系列—Linq to Sql进阶
  8. jquery通过attr取html里自定义属性原来这么方便啊
  9. 【2016.11.16】HTML学习笔记
  10. Android 触摸手势基础 官方文档概览