图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

目录

  • CPR 技术原理

    • CPR 技术实现
  • CPR 技术源码分析

  • CPR 技术应用场景

    • CPR 技术拷贝匿名内存页表场景

    • CPR 技术不拷贝匿名内存页表场景

    • CPR 技术不拷共享内存页表场景

    • CPR 技术不拷贝文件映射内存页表场景

    • CPR 技术拷贝 PFNMAP 映射内存页表场景

    • CPR 技术拷贝 UFFD-WP 内存页表场景

    • 禁止 CPR 技术拷贝内存页表场景

    • CPR 技术拷贝 HugeTLB 内存页表场景

图片无法显示,请右键点击新窗口打开图片


CPR 技术原理

图片无法显示,请右键点击新窗口打开图片

Copy-Page-Range(CPR) 技术是一种用来加速 FORK 复制父进程页表到子进程. 在没有 CPR 技术之前,执行 FORK 操作之后,内核不得不采取不同的方式来复制父进程的内存到子进程,例如逐页复制内存性能是非常低, 这样做的会导致如下问题:

  • 性能下降: 逐页复制内存相比于页表的复制会消耗更多的 CPU 时间,因为涉及到实际数据的复制而不是仅仅复制页表条目
  • 内存使用增加: 在复制每个页面时都需要分配新的物理内存来存放副本,这会导致在 FORK 操作期间瞬间增加内存使用
  • 启动延迟: 新的子进程开始执行前需要更多的时间来完成内存的复制,特别是对于拥有大量内存的进程来说
  • Copy-on-Write 的效率下降: 没有 CPR 机制的时候,操作系统可能不得不更频繁地使用写时复制策略,这意味着每次写入操作都要复制整个页,而不是更有效地只处理页表项

在 Linux 系统中,FORK 系统调用非常关键,它被用来创建新的进程,很多传统的 UNIX 服务和应用程序依赖于 FORK 或其相关的 EXEC 系统调用来处理新的任务或请求. 以下是一些严重依赖 FORK 操作的服务和应用程序类型, 如果 FORK 性能严重不足,那么这些服务将收到严重影响:

  • Web服务器: 如 Apache HTTP Server,在处理新的客户端请求时经常使用 FORK 或 PREFORK 模型来创建子进程
  • 数据库服务器: 如 PostgreSQL,使用 FORK 来创建新的工作进程来处理客户端请求
  • 邮件服务器: 如 Sendmail 或 Postfix,在接收新邮件或处理邮件队列时使用 FORK
  • Shell环境: 如 Bash 或 Zsh,每当用户启动新的命令或脚本时通常会调用 FORK
  • CGI脚本处理器: 在处理网页请求时,CGI 程序会通过 FORK 创建新进程来执行外部脚本
  • FTP服务器: 在处理并发的文件传输请求时,FTP 服务器为每个连接 FORK 一个新的进程
  • 系统守护进程: 很多守护进程(DAEMON) 在启动时通过 FORK 创建一个或多个工作进程
  • SSH服务器: 如 OpenSSH 在每个连接到服务器的客户端都会使用 FORK 来创建一个独立的会话进程

图片无法显示,请右键点击新窗口打开图片

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片