零拷贝原理

io读写的方式

  • 中断
  • DMA

中断方式

中断方式的流程图如下:

image.png

1.用户进程发起数据读取请求
2.系统调度为该进程分配cpu
3.cpu向io控制器(ide,scsi)发送io请求
4.用户进程等待io完成,让出cpu
5.系统调度cpu执行其他任务
6.数据写入至io控制器的缓冲寄存器
7.缓冲寄存器满了向cpu发出中断信号
8.cpu读取数据至内存

缺点:中断次数取决于缓冲寄存器的大小

DMA : 直接内存存取

DMA方式的流程图如下:

image.png

1.用户进程发起数据读取请求
2.系统调度为该进程分配cpu
3.cpu向DMA发送io请求
4.用户进程等待io完成,让出cpu
5.系统调度cpu执行其他任务
6.数据写入至io控制器的缓冲寄存器
7.DMA不断获取缓冲寄存器中的数据(需要cpu时钟)
8.传输至内存(需要cpu时钟)
9.所需的全部数据获取完毕后向cpu发出中断信号

优点:减少cpu中断次数,不用cpu拷贝数据

数据拷贝

下面展示了 传统方式读取数据后并通过网络发送 所发生的数据拷贝:

image.png

1.一个read系统调用后,DMA执行了一次数据拷贝,从磁盘到内核空间
2.read结束后,发生第二次数据拷贝,由cpu将数据从内核空间拷贝至用户空间
3.send系统调用,cpu发生第三次数据拷贝,由cpu将数据从用户空间拷贝至内核空间(socket缓冲区)
4.send系统调用结束后,DMA执行第四次数据拷贝,将数据从内核拷贝至协议引擎
另外,这四个过程中,每个过程都发生一次上下文切换

  • 内存缓冲数据,主要是为了提高性能,内核可以预读部分数据,当所需数据小于内存缓冲区大小时,将极大的提高性能。
  • 零拷贝是为了消除这个过程中冗余的拷贝

零拷贝-sendfile

对应到java中
为FileChannel.transferTo(long position, long count, WritableByteChannel target)
//将数据从文件通道传输到了给定的可写字节通道
避免了第2,3步的数据拷贝,参考下图:

image.png

1.DMA从拷贝至内核缓冲区
2.cpu将数据从内核缓冲区拷贝至内核空间(socket缓冲区)
3.DMA将数据从内核拷贝至协议引擎
4.这三个过程中共发生2次上下文切换,分别为发起读取文件和发送数据
以上过程发生了三次数据拷贝,其中有一次为cpu完成
linux内核2.4以后,socket缓冲区做了调整,DMA带收集功能,如下图:

image.png

1.DMA从拷贝至内核缓冲区
2.将数据的位置和长度的信息的描述符增加至内核空间(socket缓冲区)
3.DMA将数据从内核拷贝至协议引擎

零拷贝-mmap

对应到java中为MappedByteBuffer//文件内存映射
数据不会复制到用户空间,只在内核空间,与sendfile类似,但是应用程序可以直接操作该内存。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • [TOC] 先提出两个问题:IO过程中,哪些步骤进行了拷贝?哪些地方零拷贝?Java支持哪些零拷贝? 哪里听说过零...
    tracy_668阅读 1,049评论 0 2
  • 1 什么是零拷贝 zery-copy 2,为什么kafka中使用 zery-copy 3, 零拷贝技术实现方案有哪...
    滔滔逐浪阅读 436评论 0 0
  • 在谈论Kafka高性能时不得不提到零拷贝。Kafka通过采用零拷贝大大提供了应用性能,减少了内核和用户模式之间的上...
    攀山客阅读 24,104评论 4 27
  • 大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域。但是没有数据的复制,怎么可能实现数据的传输呢?...
    saberjava阅读 271评论 0 1
  • 零拷贝的好处 减少或避免不必要的CPU数据拷贝,从而释放CPU去执行其他任务零拷贝机制能减少用户空间和操作系统内核...
    long_c2b7阅读 525评论 0 0