在linux2.6.17之后,内核提供了一个splice/tee系统调用,这可以让用户直接操作内核缓冲区了,这个特性特别适合做网络代理,本文简短的说明一下,快下班了。
在linux2.6.17之后,内核提供了一个splice/tee系统调用,这可以让用户直接操作内核缓冲区了,splice系统调用通过管道 (pipe)可以将文件描述符和管道联系起来,这里的管道实际上是内核借用的一个现成的概念而并不是传统意义上的管道,正如文档中说,它作为队列的作用被 削弱了,它的作用就是一个缓冲区,内核的缓冲区,这样的话,splice就可以将文件描述符数据(传统文件,套接字等等)直接拷贝到这个pipe即拷贝到 内核的缓冲区,或者将内核缓冲区的数据拷贝到文件。既然实现了这个splice,而这个splice看来粒度更加细化了,更加原始了,原来内核中的 sendfile系统调用就没有存在的意义了,完全可以由两次splice来代替,可是还是保留了下来,就是实现机制变化了,完全用splice来实现, 简单点说就是将in文件的数据植入pipe,然后再将pipe的数据植入out文件,两次植入只操作指针并没有实际拷贝数据,最终下来还是在内核拷贝了一 次数据,即从in文件缓冲区到out文件缓冲区,用splice实现sendfile印证了linux中能用现有机制组合实现的机制就不再单独提供一个机 制。当然原来的sendfile是用file_operations接口的read/write来实现的,方案也是不错的,只是耦合性大了点,用 splice实现后,数据操作完全分离了,就是说in文件不再直接和out文件打交道了,而是通过它们的二传手pipe来互相拷贝数据。
正如文档所说,splice相当于内核缓冲区的read/write,而tee则相当于内核缓冲区的memcpy,这种说法非常直观。看来内核越来越是可 控的了,这种控制不是随便的控制,而是有机的控制,不是为了将权力交给用户,而是为了更好更灵活的提供机制,将一部分机制的实现也交给了用户而已。有了 splice和tee,内核就相当于提供了一个把手或者叫扳子,通过这个把手用户再也不用总把数据拉出来处理完再放回去了,直接操作这个把手就可以了,相 当于一个杠杆。烧锅炉的师傅不用把煤从锅炉弄出来翻完再弄进去,而是直接用火筒就可以了。linux中提供了系统调用接口,这个系统调用接口不也是把手扳 子杠杆吗?从某种意义上说系统调用接口更像是一个代理把门的,他站在固定的地方帮你做事或者帮你把请求传递给里面的人,而不是直接让你自己去做 事,splice就不是简单代理帮你做事或传递请求了,而是真正把工具给你,把扳子,钳子都给你,不过也仅仅让它们这些工具露出一端,另一端还是不让你掌 控,这露出的一端已经足够你用了,你拿着这些把手使劲搅拌吧,成果自然流露。

splice和sendfile相关推荐

  1. Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee

    文章目录 传统文件传输的问题 Linux中实现零拷贝的方法 传统文件传输的问题 在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用writ ...

  2. 计算机科学精彩帖子收集

    linux源码 LXR 源自"the Linux Cross Referencer",中间的"X"形象地代表了"Cross".与 Sourc ...

  3. 面试题:如何理解 Linux 的零拷贝技术?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科, ...

  4. 为什么 P8 程序员的代码你写不出来?零拷贝了解一下

    计算机处理的任务大体可以分为两类:CPU密集型与IO密集型. 当前流行的互联网应用更多的属于IO密集型,传统的IO标准接口都是基于数据拷贝的,这篇文章我们主要关注该怎样从数据拷贝的角度来优化IO性能, ...

  5. Linux 操作系统原理 — 零拷贝技术

    目录 文章目录 目录 Linux I/O 缓存背景 为什么需要零拷贝? 零拷贝技术(Zero-Copy) 方法一:用户态直接 I/O 方法二:mmap + write 方法三:Sendfile 方法四 ...

  6. java使用原始套接字技术进行数据包截获_Linux零拷贝技术,看完这篇文章就懂了...

    本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux 算是比较基础的技术,所以,学好 Linux 对于云计算的学习会有比较大的帮助. 为什么需要零拷贝 传统的 ...

  7. java transferto_小六六学Netty系列之Java 零拷贝

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了 ...

  8. 为什么TCP连接不可靠

    原文链接:http://watter1985.iteye.com/blog/1924977 原文在此 这篇文章是关于TCP网络编程的一个不起眼的小问题.几乎人人都并不太明白这个问题是怎么回事.曾经我以 ...

  9. 一篇文章彻底弄懂零拷贝底层原理

    前言 零拷贝是网络编程的关键,很多性能优化都离不开零拷贝,很多优秀的开源框架底层都用的零拷贝,如Netty.RocketMQ.Spark等 正文 1. 再看IO 在深入零拷贝机制之前,先来了解下传统B ...

最新文章

  1. 社区O2O的发展与未来
  2. 中国平安:杀进智能合约,你怕不怕?
  3. 前端学习(3276):js中this的使用
  4. 【kafka】kafka 消息 重放 从 一个 topic 导入 另外一个 topic
  5. 【less-6】sqli-labs靶场第六关(类似less-5)
  6. linux数据库安装
  7. 树莓派搭建全功能NAS服务器(07):管理你的书库随心阅读
  8. excel 方框打钩
  9. 蓝屏维修记录: IRQL_NOT_LESS_OR_EQUAL、WiseTDIFw64与iaStorAVC问题
  10. 三极管与稳压管恒流电路
  11. 在 Windows 系统下常用的 bat 脚本分享
  12. FreeSWITCH软电话互打
  13. Android LiveData初识
  14. 托福网考网上报名程序说明
  15. ESP32 入门笔记05: BLE 蓝牙客户端和服务器 (ESP32 for Arduino IDE)
  16. 设计模式总结 By李建忠老师
  17. 纯干货!Java后端开发十二条经验分享!
  18. 如何在MAC OS中使用HAXM?
  19. html 没有单位的数据,计算机中最小的数据单位是什么
  20. 计算机三维设计论文摘要,(硕士论文)毕业设计 计算机三维设计.doc

热门文章

  1. 上班聊天,摸鱼神器,手写一款即时通讯工具(附源码!!!)
  2. clappr:可扩展网页媒体播放器使用(在vue中的使用)
  3. UI设计课程教程分享:Banner的设计和技巧
  4. 《连载 | 物联网框架ServerSuperIO教程》- 15.数据持久化接口的使用。附:3.2发布与版本更新说明。...
  5. cocos2d 简单消除游戏算法 (一)
  6. cad转图片,cad图纸该如何转换成svg格式图片呢?
  7. 东大18秋计算机基础在线作业3,东大18秋学期《计算机应用基础》在线作业3.pdf...
  8. UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
  9. 打造类手机刷机的win10 recovery镜像
  10. Java(二十二) -- 生产者消费者模式