一个程序能运行起来,需要如下几个步骤:
- 用代码编译出来的执行包;
- 运行执行包的时候,执行包会自动向系统申请内存,这个内存类似数据库,用来存储变量,当然还需要调用计算指令。
系统不会预先分配固定内存,而是根据程序需求动态调整。
下面就模拟一个程序运行起来的,需要不同类型的功能区来存储不同的变量,这个功能区可以想象成不同的房间,一个程序都需要住进哪几个房间?这些房间都提供了什么服务?
高地址 +------------------+
| 环境变量区 | ← 环境变量(房间的空气)
+------------------+
| 命令行参数区 | ← 命令行参数(入户门)
+------------------+
| 栈区 | ← 函数调用,局部变量
| |
+------------------+
| ↓↓↓ | ← 栈向下增长
| |
+------------------+
| 自由 | ← 未使用的内存空间
| |
+------------------+
| ↑↑↑ | ← 堆向上增长
| |
+------------------+
| 堆区 | ← 动态分配内存
| |
+------------------+
| 未初始化数据段 | ← 未初始化的全局变量
| (BSS段) |
+------------------+
| 已初始化数据段 | ← 已初始化的全局变量
| (Data段) |
+------------------+
低地址 | 代码段 | ← 程序的指令代码
+------------------+
每个内存房间都有特定的功能,当然也会有特定的限制。那为什么要去了解内存空间?
为什么要了解内存布局?
想象一下,你搬进了一栋新房子,却不知道卧室、厨房、卫生间、杂物室....分别在哪儿,你每天起床找个马桶都跟玩密室逃脱似的,是不是很崩溃?
计算机的内存就像你的"数字房子",不了解它的布局,代码写着写着就容易"走错房间",结果就是 —— 程序崩溃,电脑蓝屏,领导白眼...
理解这些机制有助于优化程序性能和稳定性。
和数据库的区别?
上文说了它和数据库很像,只不过数据库是持久存储,内存是临时存储,只要关机了,就什么都没有了。
当然还有功能上的区别,数据库的库和表和字段是根据业务去设计出来的。内存上的功能分区都是前人规定好了,后人默认遵守使用。
浙公网安备 33010602011771号