1.再看fork函数
- 当fork函数被当前进程调用时,内核为新进程创建1)各种数据结构,如当前进程的mm_struct;2)PID,并将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时复制;
- 当两个进程中的任一个后来进行写操作时,写时复制机制才创建新页面。
2.再看execve函数
假设在当前进程中的程序执行了如下的execve调用:
execve("a.out", null, null);
加载并运行a.out需要以下几个步骤:
- 删除已存在的用户区域。 删除当前进程虚拟地址的用户部分中的已存在的区域结构。
- **映射私有区域。**为新程序的代码、数据、bss和栈区域创建新的区域结构。
- 映射共享区域。 共享对象动态链接到a.out,即映射到用户虚拟地址空间中的共享区域内。
- 设置程序计数器(PC)。 execve做的最后一件事情就是设置当前进程上下文中的程序计数器,使之指向代码区域的入口点。下一次调度这个进程时,它将从这个入口点开始执行。

3.显式分配器与隐式分配器
- 显示分配器:要求应用显示地释放任何已分配的块。如C++中的new与delete组合,C中的malloc与free组合。
- 隐式分配器:隐式分配器叫做垃圾收集器,它自动释放未使用的已分配的块(垃圾收集)。
4.垃圾收集器的基本知识
- 垃圾收集器将内存视为一张有向可达图。垃圾收集器通过释放不可达节点且将它们返回给空闲链表,来定期地回收它们
