概念
物理内存就是指内存条,虚拟内存是逻辑概念。每个进程都有自己独立的虚拟地址空间,32位有4G大小,64位有256T大小。一个进程同一时刻不可能所有变量数据都会访问到,只需要在访问某部分数据时,把这一块虚拟内存映射到物理内存,其他没有实际访问过的虚拟地址空间并不会占用到物理内存,这样对物理内存的消耗就大大减少了 。
虚拟内存划分
从虚拟地址的角度来看,内存空间如下划分:
- 32位系统最高的1G空间保留给内核使用,多个进程共享;64位系统最高的128T空间保留给内核使用并且不被进程共享。
- 栈,栈向低地址方向延伸,用于存放局部变量和进程上下文。栈是一块连续的内存的区域,用来记录函数调用过程中的栈帧,在函数调用时栈的参数由右往左入栈,然后是返回地址、函数中的局部变量。(静态变量存储在静态存储区,所以不入栈)当函数调用结束后,按照栈后进先出的顺序退栈,栈顶指针指向最开始存的地址,程序由该点继续运行。
- MMAP区(文件映射内存,如动态库等),当malloc/free申请释放内存大于128K时(且堆内部的内存不能满足malloc调用),通过mmap系统调用分配一块虚拟地址空间;32位系统向低地址扩展,64位向高地址扩展。
- 堆,堆向高地址方向延伸,当malloc/free申请释放内存小于128K时(且堆内部的内存不能满足malloc调用),通过brk/sbrk系统调用,控制堆顶指针向高地址偏移(malloc)或者低地址偏移(free);操作系统是用链表来存储的空闲内存地址的,所以堆的内存是不连续的。
参考