什么是 anonymous page
分类:os| 发布时间:2024-12-23 14:10:00
概述
本文章通过 GPT 辅助生成
匿名页面(Anonymous Pages) 是一种内存页面类型,指的是没有与磁盘上的文件或其他外部存储进行映射的内存页面。
在操作系统中,内存被划分为若干页面,每个页面可能会与一个文件或设备(如磁盘)相关联,或者不相关联。
没有与磁盘文件关联的内存页面就是 匿名页面。
匿名页面的特点
- 不与文件关联:匿名页面通常不代表磁盘上的任何文件。这些页面一般用于存储由进程动态分配的内存,例如程序的堆和栈。
- 动态分配:它们通常由程序在运行时动态分配,并在进程的生命周期内存在。
- 交换到磁盘:当系统内存不足时,匿名页面可以被交换到磁盘(即 swap)中,以释放物理内存供其他任务使用。这个过程是操作系统的内存管理的一部分。
匿名页面的示例
- 堆内存:程序通过 malloc 或类似函数请求的内存(即在堆上分配的内存)通常是匿名的,因为它不是映射到文件或磁盘上。
- 栈内存:每个线程的栈内存(用来存储函数调用和局部变量)也是匿名页面。
- flags 带上 MAP_ANONYMOUS 创建的 mmap
匿名页面与文件映射页面的区别
- 文件映射页面(File-backed Pages):这些页面与磁盘上的文件(如程序执行文件、库文件或数据文件)相关联。如果文件中的数据发生变化,文件映射页面中的数据也会随之变化。
- 匿名页面:不与任何文件直接关联,它们代表进程在运行时请求的内存空间,通常在系统内存不足时可能会被交换到磁盘。
匿名页面的交换(Swapping)
- 交换到磁盘:由于匿名页面不与文件相关联,因此它们可以被操作系统交换到磁盘上的交换空间(swap space)。如果系统内存压力较大,操作系统会将这些匿名页面写入交换空间,以释放 RAM 中的空间给更重要的任务。
- 性能影响:频繁的交换会导致性能下降,因为访问磁盘比访问内存要慢得多。
匿名页面在容器中的使用
- 在 Docker 或其他容器化环境中,容器内运行的应用程序会使用匿名页面来存储动态分配的内存(如堆、栈等)。
当容器使用过多的内存时,内核可能会将一些匿名页面交换到磁盘,尤其在容器没有足够内存或设置了交换空间的情况下。
- 通过设置 --memory-swappiness 等参数,可以控制容器对匿名页面的交换行为。
例如,--memory-swappiness=0 会避免交换匿名页面,--memory-swappiness=100 会增加交换的倾向。
总结
- 匿名页面 是不与文件映射的内存页面,通常用于程序动态分配的内存(如堆、栈)。
- 它们在内存不足时可能被交换到磁盘(交换空间),但是频繁的交换会影响性能。
- 操作系统的内存管理通过控制匿名页面的交换来优化内存的使用。