详解Linux中的零拷贝技术
|
从上图中可以看出,共产生了四次数据拷贝,即使使用了DMA来处理了与硬件的通讯,CPU仍然需要处理两次数据拷贝,与此同时,在用户态与内核态也发生了多次上下文切换,无疑也加重了CPU负担。 在此过程中,我们没有对文件内容做任何修改,那么在内核空间和用户空间来回拷贝数据无疑就是一种浪费,而零拷贝主要就是为了解决这种低效性。 什么是零拷贝技术(zero-copy)? 零拷贝主要的任务就是避免CPU将数据从一块存储拷贝到另外一块存储,主要就是利用各种零拷贝技术,避免让CPU做大量的数据拷贝任务,减少不必要的拷贝,或者让别的组件来做这一类简单的数据传输任务,让CPU解脱出来专注于别的任务。这样就可以让系统资源的利用更加有效。 我们继续回到引文中的例子,我们如何减少数据拷贝的次数呢?一个很明显的着力点就是减少数据在内核空间和用户空间来回拷贝,这也引入了零拷贝的一个类型: 让数据传输不需要经过 user space。 使用 mmap 我们减少拷贝次数的一种方法是调用mmap()来代替read调用: buf = mmap(diskfd, len); write(sockfd, buf, len); 应用程序调用mmap(),磁盘上的数据会通过DMA被拷贝的内核缓冲区,接着操作系统会把这段内核缓冲区与应用程序共享,这样就不需要把内核缓冲区的内容往用户空间拷贝。应用程序再调用write(),操作系统直接将内核缓冲区的内容拷贝到socket缓冲区中,这一切都发生在内核态,最后,socket缓冲区再把数据发到网卡去。同样的,看图很简单:
(编辑:拼字网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 面对通用嵌入式Linux系统
- 我叫mt online技能升级和卡牌获取来源最全攻略
- 僵尸农场1.17怎么刷脑子,无限脑子修改方法教程
- linux – 可执行文件上的setuid似乎不起作用
- 在liunx中创建启动器(window下的快捷方式) && linux下,
- 从Linux上载10,000,000个文件到Azure blob存储
- linux中挂载硬盘报错youmustspecifythefilesystemtype
- killbackground怎么设置,killbackground使用教程
- 在Linux环境中获取类似Active Directory的系统需要什么?
- linux – shell脚本如何判断它是否在支持256色的xterm窗口中


