高端建设网站企业,浏阳市商务局网站溪江农贸市场建设,湛江网站设计软件,江苏省住房与城乡建设厅网站BIO实战、NIO编程与直接内存、零拷贝深入辨析
长连接、短连接
长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁#xff0c;点对点的通讯#xff0c;避免频繁socket创建造成资源浪费#xff0c;比如TCP 短连接 socket连接后发送完数据后就断开早期的http服…BIO实战、NIO编程与直接内存、零拷贝深入辨析
长连接、短连接
长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁点对点的通讯避免频繁socket创建造成资源浪费比如TCP 短连接 socket连接后发送完数据后就断开早期的http服务采用的短连接
网络编程 网络编程 BIO 一个连接一个线程客户端有连接请求时服务端就需要启动一个线程进行处理线程开销大 BIO是面向流的各种流都是阻塞的并且是单向的 伪异步IO 将请求连接放入线程池一对多但线程依旧是宝贵资源 NIO 一个请求一个线程但客户端发送的请求连接都会注册到多路复用器上多路复用器轮询到连接有I/O请求时才启动一个线程进行处理 NIO是面向缓冲区的、非阻塞并且channel是双向的基于事件驱动模型、单线程处理多任务非阻塞I/OI/O读写不再阻塞基于块的传输比基于流的传输更高效基于零拷贝保证网络传输速度基于Reactor线程模型在Reactor模型中事件会提前注册回调函数事件分发器在等待该事件发生事件分发器就将该事件交给对应的回调函数进行处理读写操作 AIO 一个有效请求一个线程客户端的I/O请求都是由OS先完成了再通知服务端去启动线程进行处理 问题: NIO与BIO的区别 NIO是面向缓冲区的BIO是面向流的 流 从流中读一个或多个字节直到全部有序被读出不能前后移动数据 缓冲区 通过将读取的数据缓存到缓冲区可以进行适度的移动操作 NIO是非阻塞的BIO是阻塞的 阻塞 当线程需要读写时需要等待操作结束后才能继续后续的操作 非阻塞 当线程需要读写时一旦收到读写请求会将读写交给提前注册好的回调函数进行处理所以单线程能处理更多的任务
NIO的三大组件
选择器(Selector) 允许单独的一个线程来监视多个管道可以注册多个管道使用一个选择器然后使用一个单独的线程操作这个选择器 管道(Channel) 主要是负责程序与OS的读写交互 缓冲区(Buffer) 用于和管道进行交互数据通过管道读入缓冲区或从缓冲区写入管道中
直接内存
在NIO下采用直接内存(DirectByteBuffer)进行操作一般速度比堆内存(HeapByteBuffer)快很多直接内存并不是JVM的内存区域而是通过本地库获取到的堆外内存直接内存(堆外内存)与堆内存比较 直接内存申请空间耗费更高的性能当频繁申请到一定量时尤为明显直接内存 IO 读写的性能要优于普通的堆内存在多次读写操作的情况下差异明显
传统数据传送机制 从磁盘读取内核态缓冲区从内核态缓冲区拷贝到用户态缓冲用户态再读取缓冲数据拷贝到socketsocket将数据拷贝到网卡进行网络传输
零拷贝
执行读写操作时CPU不需要先将数据从某处内存复制到另一个特定区域通过减少中间复制操作来提升网络传输速度 可以通过DMA(直接内存访问)减少内核态与内核态的交互过程
mmap 通过磁盘文件位置与程序的缓冲区建立映射关系减少拷贝次数 3次拷贝(1次CPU拷贝、2次DMA拷贝)以及4次上下文切换
sendfile 通过向内核态发送sendfile指令操控它进行文件复制 3次拷贝(1次CPU拷贝2次DMA拷贝)以及2次上下文切换
splice 数据从磁盘读取到OS内核缓冲区后在内核缓冲区直接可将其转成内核空间其他数据buffer而不需要拷贝到用户空间2次拷贝(2次DMA拷贝)以及2次上下文切换
Netty的零拷贝实现
在网络通信上接收和发送数据通过直接内存进行操作在缓存操作上通过合并多个缓冲数据避免重复拷贝在文件传输上直接通过文件缓冲数据传输到管道避免拷贝