NIO学习笔记,从Linux IO演化模型到Netty—— Linux零拷贝
这里只是感性地认识Linux零拷贝,不涉及具体细节。
1.Linux传统的数据拷贝

用户进程是不能直接访问文件系统的,要先切换到内核态,发起系统调用,DMA把磁盘中的数据写入内核空间,内核再把数据拷贝到用户空间,用户进程才能操作这些数据。
如上把磁盘上的文件发送到网络,将会发生4次状态切换,2次cpu拷贝。
2. 2.4版本前
(1)基于mmap(可修改数据)+write

将会有4次状态切换,1次cpu拷贝。
因为内存映射总是要对齐页边界(最小单位为4kb),所以可能会造成碎片空间的浪费,一个5kb的文件要映射占用8kb的空间,浪费了3kb。
(2)基于sendFile(不可修改数据,jdk nio中transferFrom,transferTo,数据从一个channel直接传输到另一个channel便是依赖于此)

将会有2次状态切换,1次cpu拷贝。
3. 2.4版本后,基于mmap(用于修改数据,后续版本中如果共享区为多个进程共有,将会写时复制,拷贝到用户空间)+gather

Linux 2.4 版本的内核对 sendfile 系统调用进行修改,为 DMA (要硬件支持)拷贝引入了 gather 操作。它将内核空间(kernel space)的读缓冲区(read buffer)中对应的数据描述信息(内存地址、地址偏移量)记录到相应的网络缓冲区( socket buffer)中,由 DMA 根据内存地址、地址偏移量将数据批量地从读缓冲区(read buffer)拷贝到网卡设备中。
将有2次状态切换,0次cpu拷贝。
4. 2.6.17版本后,splice(用户进程不能修改数据)

splice 系统调用(不需硬件支持)可以在内核空间的读缓冲区(read buffer)和网络缓冲区(socket buffer)之间建立管道(pipeline),从而避免了两者之间的 CPU 拷贝操作。
将有2次状态切换,0次cpu拷贝。
NIO学习笔记,从Linux IO演化模型到Netty—— Linux零拷贝的更多相关文章
- 深入剖析Linux IO原理和几种零拷贝机制的实现
		
深入剖析Linux IO原理和几种零拷贝机制的实现 来源 https://zhuanlan.zhihu.com/p/83398714 零壹技术栈 公众号[零壹技术栈] 前言 零拷贝(Zero ...
 - NIO学习笔记,从Linux IO演化模型到Netty—— 从BIO到epoll模型
		
本文不涉及具体代码,只分析Linux IO演化的心路历程,学习资料来源网络,不保证一定正确,若有错误,欢迎指出. BIO 服务端创建socket(80端口),文件描述符3号. 当线程调用accept时 ...
 - NIO学习笔记,从Linux IO演化模型到Netty—— Java NIO零拷贝
		
同样只是大致上的认识. 其中,当使用transferFrom,transferTo的时候用的sendfile(). 如果系统内核不支持 sendfile,进一步执行 transferToTrusted ...
 - NIO学习笔记,从Linux IO演化模型到Netty—— 究竟如何理解同步、异步、阻塞、非阻塞
		
我的观点 首先,分开各自理解. 1. 同步:描述两个(或者多个)个体之间的协调关系. 比如,单线程中,methodA调用了methodB,methodB返回后,methodA才往下执行,那么称A同步调 ...
 - NIO学习笔记,从Linux IO演化模型到Netty—— Netty零拷贝
		
Netty的中零拷贝与上述零拷贝是不一样的,它并不是系统层面上的零拷贝,只是相对于ByteBuf而言的,更多的是偏向于数据操作优化这样的概念. Netty中的零拷贝: 1.CompositeByteB ...
 - Java NIO 学习笔记(七)----NIO/IO 的对比和总结
		
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
 - 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
		
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
 - Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe
		
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
 - Java:NIO 学习笔记-1
		
Java:NIO 学习笔记-1 说明:本笔记是根据bilibili上 尚硅谷 的课程 NIO视频 而做的笔记 主要内容 Java NIO 简介 Java NIO 与 IO 的主要区别 缓冲区(Buff ...
 
随机推荐
- Spring注解开发系列专栏
			
这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...
 - Percona-XtraDB-Cluster-57 安装操作记录
			
一.PXC集群的一些特性 Percona官网服务器位于境外,访问很困难.本次安装使用的是其官网提供的最新版本5.7.23-31.31.1.el7,当前日期为2018.10.10. PXC集群中,存储引 ...
 - 如何把您现有的流程系统数据迁徙到驰骋BPM上?
			
关键词:流程系统版本切换\ 驰骋BPM. 如何把您现有的流程系统数据迁徙到驰骋BPM上?这是一个大问题.在处理改问题之前,首先要了解驰骋bpm的数据库结构,驰骋bpm的特性在做计划. 驰骋BPM的流程 ...
 - linux 修改系统时间 同步网络时间
			
一.date命令 date -s time 修改系统时钟时间为time 设置时间和日期 例如:将系统日期设定成2018年6月8日的命令 命令 : "date -s 06/08/2018&q ...
 - RestTemplate远程调用方法
			
概述: spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值 ...
 - HDU_1175_dfs
			
http://acm.hdu.edu.cn/showproblem.php?pid=1175 dfs(x,y,i,num),xy表示位置,i表示方向,num表示转向次数,num=2时候的剪枝很重要. ...
 - constrainlayout布局
			
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/r ...
 - Java1变量数据类型和运算符
			
day02_变量数据类型和运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class jh_01_数据类型说明 { public ...
 - .Net Core中IOC容器的使用
			
打代码之前先说一下几个概念,那就是什么是IOC.DI.DIP 虽然网上讲这些的已经有很多了,我这里还是要再赘述一下 IOC容器就是一个工厂,负责创建对象的 IOC控制反转:只是把上端对下端的依赖,换成 ...
 - 在 Vs2013中查看类的内部布局
			
第一步:在Visual Studio中配置命令行环境(Command Prompt) 来自:https://blog.csdn.net/u013553529/article/details/77417 ...