0.想找个理由出门逛gai…
关于NIO的底层实现、demo CSDN-方志朋
linux的zero-copy操作 by 公众号- 朱小厮的博客
各种IO的基础讲解 by 公共号-朱小厮的博客
BIO、NIO、AIO的大白话 by CSDN-涂有
java中的AIO、demo by CSDN-茅坤宝骏氹
IO设计模式:Reactor和Proactor对比 by segmentfault-大CC
1. zero-copy
一次IO中用户、内核进程
减少由内核到用户上下文的一次切换
借助偏移减少内核中buffer数据传输的效率(较copy)
减少一次“拷贝”中不必要的1次copy(内存中从内核空间到用户空间之间的上下文切换)
通过操作系统的支持(linux下的sendFile()),可以将文件不透过用户空间,直接传入到套接字
java针对zero-copy的支持即NIO相关API:XxxChannel.transferTo()
2. IO对比
BIO
每个连接需要创建一条线程以轮询socket
适合连接数较小
NIO
non-blocking io
事件驱动的IO
由单线程的selector(多路复用器)以间接的轮询socket
适合多连接、小量数据
AIO
有说法管他叫 —— NIO 2.0(较NIO多了异步,基于OS内核的支持实现)
不需要轮询,内核中真正的IO一旦完成,将告知用户进程
将数据的读写操作放到内核进程中完成,用户进程只做处理
适合连接数多、数据量大
3. NIO
五种IO模型
IO阻塞的时机
等待数据准备 (Waiting for the data to be ready)
将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
socket阻塞process->socket线程各自recvfrom轮询->通知process
selector阻塞process->selector recvfrom轮询socket线程->通知process->可复用的IO
4. java关于NIO的api
Buffer
针对用于缓冲数据的数组的一个封装
Selector
单线程的处理多个channel的连接
Channel
对比stream来说,channel是双向的(读/写)
包括 文件、UDP、TCP的IO
5. AIO
实现方式:
将来式
基于多线程实现(用户进程)
回调
靠的就一手OS的支持(内核线程)
将来式
回调