CSAPP[9]虚拟内存

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.垃圾收集器的基本知识

  • 垃圾收集器将内存视为一张有向可达图。垃圾收集器通过释放不可达节点且将它们返回给空闲链表,来定期地回收它们
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/113919940