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

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

在 Linux 中,零拷贝(Zero-Copy) 是一种优化技术,用于减少数据传输时的 CPU 使用率和内存带宽消耗。传统的数据传输方式(非零拷贝)通常涉及将数据从一个内存区域复制到另一个内存区域,这样的操作需要消耗 CPU 资源并占用内存带宽。零拷贝技术的目标是减少或消除这种数据复制,特别是在网络通信和文件系统操作中.

零拷贝的核心是竟可能的减少 CPU 资源的消耗和内存带宽,其实现逻辑多种多样,例如最常见的一种方式将需要拷贝的双方映射到同一个物理页,这样的做法类似于共享内存的理念,其只需一个通知机制就可以实现用户空间虚拟内存和内核虚拟内存之间实现零拷贝。零拷贝技术带来的优势包括:

  • 减少 CPU 负载: 由于减少数据复制操作,CPU 可以处理其他任务,提高系统的整体效率
  • 降低内存带宽消耗: 减少在用户空间和内核空间之间的数据拷贝,降低内存带宽的消耗
  • 提高数据传输速率: 对于大量数据的传输,如网络通信或大文件操作,零拷贝可以显著提高数据传输的速率

零拷贝技术提供了一种思想,其可以在不同的技术中得以实现. 例如在文件的读取和写入操作中,零拷贝可以减少对磁盘和内存的操作次数, 又如在网络服务器中,零拷贝用于直接将数据从网络套接字传输到文件系统,或者反过来,减少数据传输过程中的 CPU 和内存负担. 那么接下来对不同的实现进行分析.

文件映射与零拷贝

在 Linux 里,访问普通文件(Regular File) 的方式通常有: Buffered I/OFile-MappedDirect I/O 以及 DAX(Direct Access), 通常文件访问使用 Buffered I/O 方式,它通过使用缓冲区(buffer)来管理文件数据,通常在用户空间和内核之间进行数据传输, 并提供了 POSIX 接口(Read/Write/OPEN/CLOSE) 用于文件访问。Linux 根据不同的场景,也会使用其他方式进行文件访问,这些方式直接的差异如下:

  • Buffered I/O: Buffered I/O 使用缓冲区来管理文件数据,它是默认的文件 I/O 方式。数据首先从磁盘读取到内核的 Page Cache 中,然后从 Page Cache 复制到用户空间的缓冲区。类似地,在写入文件时,数据首先被写入用户空间的缓冲区,然后从缓冲区复制到内核的 Page Cache,并最终刷新到磁盘。Buffered I/O 通过缓存来优化磁盘 I/O 操作,减少磁盘访问次数,提高文件访问速度
  • Page Cache: Page Cache 是内核中的一个缓存机制,用于存储文件数据的页。它是 Buffered I/O 的一部分,用于缓存文件数据块以加速文件读取和写入操作。Page Cache 的数据存储在内存中,并在文件 I/O 操作期间自动加载和卸载. Page Cache 的主要作用是减少磁盘 I/O,提高文件访问性能。当应用程序请求读取文件时,内核首先检查 Page Cache 中是否已经有所需的数据,如果有,就直接从内存中返回数据,而不需要从磁盘读取
  • Direct I/O: Direct I/O 是一种绕过 Page Cache 的文件 I/O 方式。它不使用内核的 Page Cache 来缓存文件数据,而是直接在用户空间和磁盘之间传输数据。这意味着数据不会在内核中缓存,而是直接读取或写入磁盘. Direct I/O 可以提供更精确的 I/O 控制,避免了Page Cache 可能引入的不确定性。它通常用于需要高度可预测性的 I/O 操作,如数据库管理系统
  • DAX(Direct Access): DAX 是一种特殊的 Direct I/O,用于直接在用户空间和存储设备之间进行数据访问,绕过了操作系统的文件系统和 Page Cache。DAX 允许应用程序将数据直接映射到存储设备上,以实现低延迟、高性能的 I/O 操作. DAX 适用于需要极低延迟和高性能的应用程序,如高速数据库系统和大规模数据分析

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

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

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