数据搬运工 你好,我是CPU一车间的Q,有段时间没见了。 还记得上次我说我们厂用了DMA技术后,我们终于解放了,再也不用奔波于网卡,硬盘,内存之间传输数据了。 前段时间去二车间看望老虎,发现他满头大汗。 兄弟,你接到什么任务了。看你给你忙 老虎见我来了,擦了擦头上的汗,说:我带着数据呢我刚搬完一批,累死了 我有点疑惑:我们现在不是有DMA技术吗为什么找个外包的DMA控制器来扛,自己亲自上阵 DMA用来在I/O外部设备和内存之间传输数据我现在的任务就是复制复制记忆这个DMAC帮不上忙,我还得自己抄 我干脆,干脆,太忠,我希望我不要接到这种任务 我先不跟你说,但是有工作要做还没热起来,你又起来上班了,我就起来准备回去了 我靠!怎么又复制了这批数据!刚走了两步就听到没什么吐槽的声音。 我转身问:怎么了。 我只是将这些数据从内核地址空间复制到用户地址空间一次还没喘过气来,又让我从用户态转移到内核地址空间 我拍拍他的肩膀说:哎,我们也没办法我们只是在工作让我们挑选哪一轮 我一边给他打气,一边暗暗祈祷不要给我这种活,又累又没技术含量。 天气变幻莫测,我回到一号车间没多久,就发生了这种事老话说,真的是怕什么来什么 一开始,我还能忍受时间久了,我抑制不住自己的不满直到摔在自己身上才知道痛 四份数据副本 第二天和你约好去操作系统内存管理部汇报这件事。 内存管理部门居然踢皮球,说不归他们管让我们去I/O部门,但是没有办法我们来到I/O部门对此做出反应 听了我们的抱怨,I/O部门的人也很无奈:伙计们,真的不是我们故意耍你们之前真的没有办法让你移动两次数据这是上面的应用程序应该写的他们必须读出硬盘上的文件,然后通过网卡发送出去读完写完不用搬两次吗 File.readSocket.send, 硬盘网卡这,这,这,我们不是有DMA技术吗,只是解决了和他们的数据传输为什么我们要从一个内存复制到另一个内存我问 对方看出了我们的疑惑,在旁边的白板上画了一张图: 你看,数据最终从硬盘到网卡因为有应用的参与,它们需要先读取自己在用户空间的缓存区,然后再发送出去,这样总共有四次数据传输其中,DMAC可以帮助你从硬盘到内核空间,从内核空间到网卡的承载但是,剩下的用户空间和内核空间两个副本是来回的,由你来扛 我明白了,唉,看来是没有办法避免了我们先回去吧你看完图难过的说 但是我不想放弃我想找出这张图有哪些可以优化和改进的地方 能不能要求数据不要去应用,直接在内核空间复制一次就好,这样我们就可以少带了,我抛出一个问题 这怎么可能呢如果他不看,以后怎么发出去不,I/O部门连连摇头 你还是可以寄的你看,像这样,到最后,数据无论如何都会从内核空间发送到网卡,只是白白省去了数据去用户空间的浪费我改了他的画,不肯放弃解释 对方被我的话惊醒,眼珠左右转动,想了又想。 过了一会儿,我回:还是不行万一有人想修改或解密读取的文件数据,还是要读取他的用户空间缓存 我想了一下,似乎不可避免,说:那我们就承认这种情况吧反正以我的经验,你说的这种情况不多在大多数情况下,数据从内核到用户空间是完整的,从用户空间回到内核也是完整的 I/O部门也没再有什么说辞,就点头同意了,说等我们把意见上报Linux帝国高层讨论后再做决定我们先回去等消息吧 零拷贝技术 但是后来工作太忙,操作系统也没有消息慢慢的,我们就把这事忘了,直到前几天 阿q,你听说了吗最近在Linux帝国里新成立了一家公司,居然可以绕过我们的CPU,把网卡的数据写到硬盘,你急着来找我 不可能,按照我们之前的计划,至少要复制一次。 一点也不,他们自称是零拷贝技术 让我们放下手中的工作,了解一下情况。 原来Linux帝国最近推出了一个叫做sendfile的新API。 ssize _ tsendfile 只有指定打开文件的描述符和要发送的网络接口的描述符,才能直接通过网络发送文件。 我们又一次来到了操作系统I/O部门对方一见是我们,就热情接待了我们 你来的正好,我还没来得及告诉你你上次提到的想法很好,帝国高层非常重视我一反应过来,马上采纳了你们的意见不,你可能知道,已经引入了一个新的API供应用程序使用,它可以免费节省数据进入用户空间的成本一推出就大受欢迎,我得为此感谢你 原来是这样,我说最近怎么处理数据的工作少了但是你是怎么做到零拷贝的 I/O部门的人看了我们几眼,得意地笑了在讨论你的方案时,帝国高层觉得还可以进一步优化只需把从硬盘读取的数据缓冲区的地址和长度给网络套接字描述符,就不用再携带数据了,彻底解放你 我们互相点头称赞。 这还没完呢!我们的Linux帝国也把这种技术延伸到了文件数据复制上,增加了另一个API:splice,这样文件复制也可以减轻你以后的负担。 ssize _ tsplice 我们回去后,把这个消息告诉了全厂,大家都喜出望外原来所有的作坊都苦了很久 1个鸡蛋 在遥远的Windows帝国。 部长,我听说Linux帝国推出了一个sendfile,叫做零拷贝 有这种事吗我们不要落后,去研究一下 两个鸡蛋 Linux帝国有一家新公司,专注于网络包分析。 老板,数据包每次都要经过Linux帝国的协议栈部门处理才能拿到,太慢了 能不能绕过协议栈直接抓取数据包。 郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。 |