目录


一个程序能运行起来,需要如下几个步骤:

  • 用代码编译出来的执行包;
  • 运行执行包的时候,执行包会自动向系统申请内存,这个内存类似数据库,用来存储变量,当然还需要调用计算指令。

系统不会预先分配固定内存,而是根据程序需求动态调整。

下面就模拟一个程序运行起来的,需要不同类型的功能区来存储不同的变量,这个功能区可以想象成不同的房间,一个程序都需要住进哪几个房间?这些房间都提供了什么服务?

高地址  +------------------+
       |    环境变量区    | ← 环境变量(房间的空气)
       +------------------+
       |    命令行参数区  | ← 命令行参数(入户门)
       +------------------+
       |       栈区       | ← 函数调用,局部变量
       |                  |
       +------------------+
       |       ↓↓↓        | ← 栈向下增长
       |                  |
       +------------------+
       |       自由       | ← 未使用的内存空间
       |                  |
       +------------------+
       |       ↑↑↑        | ← 堆向上增长
       |                  |
       +------------------+
       |       堆区       | ← 动态分配内存
       |                  |
       +------------------+
       |    未初始化数据段 | ← 未初始化的全局变量
       |     (BSS段)      |
       +------------------+
       |    已初始化数据段 | ← 已初始化的全局变量
       |     (Data段)     |
       +------------------+
低地址  |     代码段       | ← 程序的指令代码
       +------------------+

每个内存房间都有特定的功能,当然也会有特定的限制。那为什么要去了解内存空间?

为什么要了解内存布局?
想象一下,你搬进了一栋新房子,却不知道卧室、厨房、卫生间、杂物室....分别在哪儿,你每天起床找个马桶都跟玩密室逃脱似的,是不是很崩溃?

计算机的内存就像你的"数字房子",不了解它的布局,代码写着写着就容易"走错房间",结果就是 —— 程序崩溃,电脑蓝屏,领导白眼...

理解这些机制有助于优化程序性能和稳定性。

和数据库的区别?
上文说了它和数据库很像,只不过数据库是持久存储,内存是临时存储,只要关机了,就什么都没有了。

当然还有功能上的区别,数据库的库和表和字段是根据业务去设计出来的。内存上的功能分区都是前人规定好了,后人默认遵守使用。

Reference

https://www.cnblogs.com/xiaokang-coding/p/18799190

posted on 2025-04-03 17:45  Mysticbinary  阅读(71)  评论(0)    收藏  举报