在多任务操作系统中, 每个进程都有自己的内存沙盘, 使用的内存地址都是自己内存中的相对地址,当CPU时间片轮转到的时候, 操作系统将对应进程的内存页调入寄存器, 进程开始运行。因此不同进程间的内存地址是没有关联的, 都是自己的相对地址。
内存分布图
这个图是32位机器的, 2 32 = 4 G B 2^{32} = 4GB 232=4GB, 64位机器就有点大了, ( 4 G B ) 2 (4GB)^2 (4GB)2 额…… 反正你用不到这么大就行了。 分配比例差不多吧, 不是很了解。
概要:
这图上部是高地址, 最下面是0, 共分为两部分, 内核区和用户区
内核区:
内核区不允许用户代码访问, 只要访问就会出现段错误, 内核区主要有PCB(进程控制块), 保存进程运行的信息
栈区:
保存的内容:
-
函数内定义的局部变量(非static)
-
中断发生时存放的运行环境
用户区第一块区域,当函数结束时, 局部变量自动销毁, 内存自动释放, 因此这部分内存不需要程序员自己管理
增长方向为向下增长(向减小的方向增长), 与堆区相反。
内存映射区:
这里保存动态链接库, 地址在栈区和堆区之间。
堆区:
这里保存用户自己申请的内存, 这部分内存需要用户自己释放, 例如new申请的内存要用delete释放, 同理malloc 与 free。
.bss 未初始化全局变量区
此处保存全局变量和静态变量
.data 已初始化全局变量区
同上, 只是这里保存的是已初始化的
.text
程序代码, 即CPU可执行的二进制代码, 不是C或C++等代码
常量: 如const 和 1 、 ”helloword“等