流殃的博客

| Comments

匿名内存是用户空间的概念,不涉及内核态内存。匿名内存的概念是指一段虚拟内存映射是否与之相关联的对象,如果没有关联对象就称为匿名的。本章就主要学习缺页异常的匿名映射,其中涉及到以下内容

匿名映射的概念
匿名映射的流程

概念

由于应用程序申请内存后,内核分配了虚拟内存,当访问所需要的的内存时候,才会分配实际的物理内存,才能节省实际内存的使用。我们来看看匿名映射和文件映射的区别

匿名页面,是指那些没有关联到文件页,如进程堆、栈、数据段和任务已修改的共享库等,不是以文件形式存在,因此无法和磁盘文件交换
文件页面,也就是映射文件的页,对于文件映射背景的页面,程序可以通过read/write/mmap去读,当通过任何一种方式从磁盘读取文件时,内存都会给你申请一个pace cache来缓存硬盘内容。例如通过mmap映射文件到虚拟内存然后读文件,进程的代码段等,这些页都是由缓存

匿名映射缺页异常的触发情况

我们知道了匿名页,那么在什么情况下会触发匿名映射的缺页异常呢?我们比较常见的有

  • 当我们应用程序使用malloc来申请一块内存(堆分配),在没有使用这块内存之前,仅仅是分配了虚拟内存,并没有分配物理内存,当第一次去访问的时候,才会通过缺页异常来分配物理页面,建立和虚拟页面的映射关系
  • 当我们应用程序使用mmap来创建匿名的内存映射的时候,页同样只是分配了虚拟内存,并没有分配物理内存,第一次去访问的时候,才会通过触发缺页异常来分配物理页面,建立和虚拟页的映射关系
  • 当函数的局部变量比较大,或者函数调用的层次比较深,导致当前的栈不够用,这个时候需要扩大栈,这个时候也会触发缺页异常来分配物理页面

参考

Comments

评论