首页 > 系统相关 >linux零拷贝

linux零拷贝

时间:2024-05-30 14:01:54浏览次数:25  
标签:操作系统 内核 linux 缓冲区 拷贝 拷贝到 数据

什么是零拷贝

零拷贝(Zero-Copy)就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术,是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。

零拷贝的好处

避免操作系统内核缓冲区之间进行数据拷贝操作
避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作
用户应用程序可以避开操作系统直接访问硬件存储
避免不必要的系统调用和上下文切换
数据传输尽量让 DMA 来做,需要拷贝的数据可以先被缓存起来,对数据进行处理尽量让硬件来做

Linux中零拷贝实现
Linux 中零拷贝技术实现方式通常有 2 种:
mmap() + write()
sendfile()
零拷贝的实现原理

mmap() + write():
mmap() 系统调用函数会直接把内核缓冲区里的数据映射到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。具体过程:
应用进程调用了 mmap() 后,DMA 会把磁盘的数据拷贝到内核的缓冲区里,接着应用进程跟操作系统内核共享这个缓冲区
应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中,这一切都发生在内核态,由 CPU 来搬运数据
最后,把内核的 socket 缓冲区里的数据,拷贝到网卡的缓冲区里,这个过程是由 DMA 搬运的

sendfile():
在 Linux 内核版本 2.1 中,提供了一个专门发送文件的系统调用 sendfile()。具体过程:
发起 sendfile() 系统调用,操作系统由用户态空间切换到内核态空间
通过 DMA 引擎将数据从磁盘拷贝到内核态空间的输入的 socket 缓冲区中
将数据从内核空间拷贝到与之关联的 socket 缓冲区
将 socket 缓冲区的数据拷贝到协议引擎中
sendfile() 系统调用结束,操作系统由用户态空间切换到内核态空间

标签:操作系统,内核,linux,缓冲区,拷贝,拷贝到,数据
From: https://www.cnblogs.com/xiaolibiji/p/18222195

相关文章

  • mac,linux 查看文件编码
    查看文件编码可以通过以下几种方式:在类unix编程时,在读取文本的时候会遇到文本的编码问题,这时候就要查看文件内容的编码了,下面是查看编码的几种方式1.在Vim中可以直接查看文件编码:setfileencoding即可显示文件编码格式。如果你只是想查看其它编码格式的文件或者想解决用Vim......
  • Linux 内核启动流程
    链接脚本vmlinux.lds示例代码36.1.1vmlinux.lds链接脚本492OUTPUT_ARCH(arm)493ENTRY(stext)494jiffies=jiffies_64;495SECTIONS496{497/*498*XXX:Thelinkerdoesnotdefinehowoutputsectionsare499*assignedtoinputsectionswhentherearem......
  • linux磁盘分区
    磁盘分区在Linux中,磁盘是通过分区来使用的。分区是将一个硬盘划分成几个逻辑部分来使用,在每个分区中可以使用不同的文件系统。因此,在挂载磁盘之前,我们需要先对磁盘进行分区。磁盘分区的过程可以通过命令行工具或图形界面工具来完成。常用的磁盘分区工具有:cfdisk:命令行工具,适用......
  • 三、Linux系统收发网络包
    学习自[小林coding]学习自小林coding仅用来学习。网络模型OSI网络模型:开放式系统互联通信参考模型使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题。TCP/IP模型更为常见。应用层:负责向用户提供一组应用程序,如HTTP\DNS\FTP传输层:负责端到端......
  • Red Hat Enterprise Linux (RHEL) 8.10 发布 - 红帽企业 Linux 8 完美终结版
    RedHatEnterpriseLinux(RHEL)8.10(x86_64,aarch64)-红帽企业Linux红帽企业Linux8完美终结版请访问原文链接:RedHatEnterpriseLinux(RHEL)8.10(x86_64,aarch64)-红帽企业Linux,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2024年5月......
  • Qt window和Linux通过进程名称判断是否有进程存在
    boolCommFunction::isProcessRunning(constQString&processName){QProcessprocess;#ifdefWIN32process.start("tasklist",QStringList()<<"/FI"<<"IMAGENAMEeq"+processName);process.waitForF......
  • 在联网linux中编译nginx源码迁移到离线linux使用指南
    nginx没有预先编译好的npm包,通常需要通过编译源代码得到执行文件,下面介绍如何操作:1.找一台联网的linux服务器,安装必要的编译工具和依赖项sudoyumgroupinstall"DevelopmentTools"sudoyuminstallpcre-develzlib-developenssl-devel2.下载nginx源代码包wgethttp:/......
  • 在Linux中,如何进行安全审计?
    在Linux中进行安全审计是一个涉及多个步骤和工具的过程,以下是一个详细的指导,按照不同方面进行了分点表示和归纳:1.强化系统配置关闭无关的服务和端口:通过禁用不必要的服务和端口来减少攻击面。禁止不必要的服务:确保只有需要的服务在运行,减少潜在的安全风险。限制用户权限:通过......
  • 在Linux中,如何进行Web服务器调优?
    在Linux中进行Web服务器调优主要涉及以下几个方面:选择合适的Web服务器软件、配置Web服务器设置、优化网络和硬件资源、以及确保安全性。以下是一些针对常见Web服务器软件(如Apache和Nginx)的调优步骤:1.对Apache进行调优安装Apache:sudoapt-getupdatesudoapt-getinstalla......
  • 在Linux中,如何进行数据库调优?
    在Linux中进行数据库调优是一个复杂但重要的过程,它涉及到硬件、数据库配置、查询优化等多个方面。以下是一个详细的指导,按照不同方面进行了分点表示和归纳:1.硬件优化磁盘:使用SSD(固态硬盘)替代HDD(机械硬盘),以提高I/O性能。将数据库文件和日志文件放置在不同的物理磁盘上,以避免......