一、内存管理
用户层
STL 自动分配/释放内存 调用C++
C++ new/delete 调用C
c malloc/free 调用POSIX或Linux
POSIX brk/sbrk 调用内核
Linux mmap/munmap 调用内核kernal
系统层
kernal kmalloc/vmalloc 调用驱动
驱动 get_free_page
二、进程映像
程序是存储在磁盘上的可执行文件,当执行程序时,系统会把可执行程序
加载到内存中,在内存中形成了进程(一个程序可以同时加载多个进程)
进程的内存分布情况就是所谓的进程映像,从低地址到高地址依次分布
为:
text 代码段 二进制指令、常量(字符串字面值、被const修饰过
的初始化过的原data的数据)
data 数据段 初始化过的全局变量和静态局部变量
bss 静态数据段 未初始化过的全局变量和静态局部变量
程序运行前,会自动清0
heap 堆 由程序员手动管理的体量较大的数据
stack 栈 局部变量、块变量
environ 环境变量表 环境变量
每个进程都有一份,修改也不会影响其他进程
argv 命令行参数 通过程序运行前命令行附加的参数
练习1:定义各个内存段的数据,然后分别打印它们的地址编号,
与该进程的maps内存记录文件中对应
/proc/进程id/maps
查询进程id 命令:ps -aux ./a.out
函数:getpid()
三、虚拟内存
1、系统会为每个内存进程分配4G的虚