1. 内存分配场景
内核为进程分配内存,有两种情况:
- 创建进程时。
- 进程申请动态内存。
2. 创建进程时的内存分配
在Linux系统中,创建进程有两种场景:
- 一个程序使用
多进程结构并行处理业务。 - 启动一个程序。
2.1. 多进程
想要将一个程序分成多个进程进行处理,需要使用fork()函数。fork函数基于当前进程(父进程)创建一个完全一样的新进程(子进程)。两个进程一起从fork函数返回,从此开始执行不同的代码。但是需要注意,在父进程中,fork返回子进程的ID,而子进程中的fork返回0。
fork创建新进程的速度还是很快的,因为这个fork并不会复制父进程的内存空间,而是和父进程共享一个写时复制的内存空间,两个进程可以同时自由的读取内存,但是任意一个进程需要修改内存时,就会复制一份给修改方单独使用。
2.2. 启动一个程序
在fork后,我们可以在新进程中使用exec()族函数来拉取一个新的二进制文件,也就是使用新的内存映像替换当前的映像,并从入口开始执行。
3. 进程申请动态内存
进程开始运行后,如果需要申请更多内存,就会向内核发出内存申请请求。然后内核在可用内存中分出一块相应大小的内存块,并将起始地址返回给进程。