零拷贝

Linux零拷贝函数SendFile应用

天涯浪子 提交于 2019-12-07 09:42:05
项目需要,使用linux零拷贝函数SendFile来传输文件。 传统的read/write方式进行网络文件传输的方式,要经过四次copy操作: 硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈 而sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数。 硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈 更加具体的资料请参考: linux的sendfile()系统调用 、 Linux kernel 的 sendfile 是如何提高性能的 这里提供一种SendFile的具体应用,供大家使用SendFile时参考。程序主要实现了文件下载: client与server建立tcp连接。 client告知server,我要下载哪个文件。 server将文件传输给client。 其中实现了两种server,一种是通过SendFile发送文件,一种是通过普通的Socket方式发送文件。具体代码如下: client.cpp:client端,文件接收端 //Client端 #include <arpa/inet.h> #include <netinet/in.h> #include <sys/types

JAVA Zero Copy的相关知识

喜你入骨 提交于 2019-12-07 09:41:50
介绍 java 的zero copy多在网络应用程序中使用。Java的libaries在linux和unix中支持zero copy,关键的api是java.nio.channel.FileChannel的transferTo(),transferFrom()方法。我们可以用这两个方法来把bytes直接从调用它的channel传输到另一个writable byte channel,中间不会使data经过应用程序,以便提高数据转移的效率。 许多web应用都会向用户提供大量的静态内容,这意味着有很多data从硬盘读出之后,会原封不动的通过socket传输给用户。这种操作看起来可能不会怎么消耗CPU,但是实际上它是低效的:kernal把数据从disk读出来,然后把它传输给user级的application,然后application再次把同样的内容再传回给处于kernal级的socket。这种场景下,application实际上只是作为一种低效的中间介质,用来把disk file的data传给socket。 data每次穿过user-kernel boundary,都会被copy,这会消耗cpu,并且占用RAM的带宽。幸运的是,你可以用一种叫做Zero-Copy的技术来去掉这些无谓的 copy。应用程序用zero copy来请求kernel直接把disk的data传输给socket