我们都知道,互联网的世界其实就是数据的世界,无论你是在微信上聊天,在玩王者荣耀,还是逛淘宝,看小姐姐直播,背后其实都是数据的传输。
相信大部分学过计算机操作系统的程序员都知道,假如我们的数据存放在计算机的文件上(数据库实际上也是存放在文件上),要把文件上的内容拷贝给用户,需要经过多少次复制呢?
首先,我们需要把内容从文件中拷贝到我们的应用中,虽然这听起来只有一次拷贝,实际上操作系统会进行两次拷贝,首先会先把文件拷贝到操作系统内核,然后再从操作系统内核上拷贝到应用当中。同理,我们把内容拷贝到Socket传输给用户的过程也是一样的,需要先拷贝给操作系统内核,再拷贝给对应的Socket。一个简单的功能,竟然要经过4次拷贝。
那么如何优化这么一个过程呢?linux有一个非常牛的技术,叫做零拷贝,那么在JAVA中如何实现呢?我发现很多Java程序员,虽然说是精通Java更多的是精通JavaWeb。其实Java也是非常博大精深的,Java的NIO其实已经帮我们解决了这个问题。
在Java NIO中,我们可以通过FileChannel.map,可以越过内核态,直接从文件拷贝数据到应用当中,同样,可以把越过内核态,直接把数据从应用中拷贝到Socket中发送给用户。这样子,我们的系统调用,就变成了文件到应用到Socket,只要进行2次拷贝即可。
同时,我们Java NIO还提供给我们另外一个方法,可以不用经过应用,直接从文件中拷贝到Socket中,这就是FileChannel.transferTo。它会把数据从文件拷贝到内核中,然后从内核直接把数据再次拷贝给接收的Socket发送给用户。
好了,这就是Java当中的零拷贝技术了。JavaNIO,在程序员面试中也是经常出现的,如果你有兴趣,欢迎关注我,我们一起学习,共同进步。同名公众号(沙茶敏碎碎念)