用户态、内核态及零拷贝

用户空间:user space。

内核空间:kernel space。

应用程序在访问磁盘文件时,会先利用DMA技术把文件内容读取到内核缓冲区,然后再把内容从内核缓冲区copy到用户缓冲区中。如果程序要输出,则会把用户缓冲区的内容再copy到内核的socket缓冲区中,利用DMA输出。以下是原理图:

mmap():利用DMA将文件内容拷贝到内核缓冲区,然后应用程序和操作系统共享这块区域,从而减少了内核缓冲区到用户缓冲区的这一步拷贝。以下是原理图:

sendfile():sendfile利用DMA技术将文件内容读取到内核缓冲区,然后将带有文件位置和长度信息的缓冲区描述符添加到socekt缓冲区去,此过程不需要将数据从操作系统内核缓存区拷贝到socket缓存区。sendfile只适用于文件到socket的传输。以下是原理图:

splice():splice在两个文件描述符之间移动数据,不需要数据在内核空间和用户空间来回拷贝。splice利用了linux的管道缓冲区机制,所以至少一个描述符要为管道。splice不限于sendfile的功能,允许任意两个文件之间相互连接。

DMA:全称是Direct Memory Access,中文翻译为直接存储器访问。

posted on   koushr  阅读(1753)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示