CPU:别再拿我当搬砖工!

时间:2022-10-19 19:34 来源:网络 阅读量:5625   
CPU:别再拿我当搬砖工!

数据搬运工

你好,我是CPU一车间的Q,有段时间没见了。

还记得上次我说我们厂用了DMA技术后,我们终于解放了,再也不用奔波于网卡、硬盘、内存之间传输数据了。

前段时间去二车间看望老虎,发现他满头大汗。

“兄弟,你接到什么任务了?看你给你忙”

老虎见我来了,擦了擦头上的汗,说:“我带着数据呢。我刚搬完一批,累死了。”

我有点疑惑:“我们现在不是有DMA技术吗?为什么找个外包的DMA控制器来扛,自己亲自上阵?”

DMA用来在I/O外部设备和内存之间传输数据。我现在的任务就是复制复制记忆。这个DMAC帮不上忙,我还得自己抄。”

我干脆,干脆,“太忠,我希望我不要接到这种任务”

“我先不跟你说,但是有工作要做。”还没热起来,你又起来上班了,我就起来准备回去了。

“我靠!怎么又复制了这批数据!”刚走了两步就听到没什么吐槽的声音。

我转身问:“怎么了?”

“我只是将这些数据从内核地址空间复制到用户地址空间一次。还没喘过气来,又让我从用户态转移到内核地址空间。我受不了了!”

我拍拍他的肩膀说:“哎,我们也没办法。我们只是在工作。让我们挑选哪一轮。加油!”

我一边给他打气,一边暗暗祈祷不要给我这种活,又累又没技术含量。

天气变幻莫测,我回到一号车间没多久,就发生了这种事。老话说,真的是怕什么来什么。

一开始,我还能忍受。时间久了,我抑制不住自己的不满。直到摔在自己身上才知道痛。

四份数据副本

第二天和你约好去操作系统内存管理部汇报这件事。

内存管理部门居然踢皮球,说不归他们管。让我们去I/O部门,但是没有办法。我们来到I/O部门对此做出反应。

听了我们的抱怨,I/O部门的人也很无奈:“伙计们,真的不是我们故意耍你们。之前真的没有办法让你移动两次数据。这是上面的应用程序应该写的。他们必须读出硬盘上的文件,然后通过网卡发送出去。读完写完不用搬两次吗?”

File.readSocket.send(socket,buf,len);

“硬盘?网卡?这,这,这,我们不是有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帝国的协议栈部门处理才能拿到,太慢了”

“能不能绕过协议栈直接抓取数据包?”

声明:免责声明:此文内容为本网站转载企业宣传资讯,仅代表作者个人观点,与本网无关。仅供读者参考,并请自行核实相关内容。

同类资讯
热门内容