NIO & Netty
文章平均质量分 86
zhifeng687
这个作者很懒,什么都没留下…
展开
-
BIO和NIO的区别
概述BIO NIO 阻塞等待IO: 连接建立后,如果当前线程暂时没有数据可读,则当前线程会一直阻塞在 Read 操作上,造成线程资源浪费。 非阻塞IO: 当线程从某通道进行读写数据时,若没有数据可用时,该线程会去执行其他任务。线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作,所以单独的线程可以管理多个输入和输出通道 BIO 基于字节流和字符流进行操作 NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作原创 2018-05-09 16:55:38 · 336 阅读 · 0 评论 -
Netty模型架构和思维导图
Reactor多线程模型--连接与I/O操作分离若请求连接的并发量是数以百万计的,且 IO 操作还比较耗时,此时的 Server 即使采用的是 Reactor 线程池模型,系统性能也会急剧下降。此时,可以将连接操作与 IO 操作分开处理,形成 Reactor 的多线程模型。当客户端通过处理连接请求的 Channel 连接上 Server 后,系统会为该客户端再生成一个子 Channel 专门用于处理该客户端的 IO 请求。这两类不同的 Channel 连接着两类不同的线程池。而线程池中的线程..原创 2022-04-01 19:26:36 · 904 阅读 · 0 评论 -
Linux epoll实现io多路复用原理
开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽,确实快,那么,它到底为什么可以高速处理这么多并发连接呢?先简单回顾下如何使用C库封装的3个epoll系统调用吧。int epoll_...转载 2018-07-02 23:34:53 · 710 阅读 · 0 评论 -
Netty中的水平触发和边缘触发
在Netty中,NioChannel体系是水平触发,EpollChannel体系是边缘触发。转载 2018-07-08 23:29:57 · 3902 阅读 · 2 评论 -
netty对http模型的实现
为了表示HTTP中各种消息体,netty设计了一套完整的类型定义,包括接口和实现类。由于类型比较多,部分实现类继承多个类和接口,关系有些复杂。我们按照接口先梳理一遍各个消息的基本情况,再看具体的类实现方式。HTTP接口定义基础接口我们先来看看HTTP的基本的接口定义。下图是netty中HTTP相关的6个接口的继承结构,还有他们继承的接口:先简单过一下各个接口的情况:...转载 2018-05-11 17:58:03 · 574 阅读 · 0 评论 -
java NIO实现(一) ——ServerSocketChannel和Selector源码分析
概述java NIO属于epoll水平触发Selector.open()在linux内核调用epoll_create;ServerSocketChannel#register()在linux内核调用epoll_ctl ,并设置为水平触发;Selector#select()在linux内核调用epoll_wait原创 2019-01-01 19:28:49 · 1189 阅读 · 1 评论 -
java NIO之MappedByteBuffer
简书 占小狼前言java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于MappedByteBuffer操作大文件的方式,其读写性能极高,本文会介绍其性能如此高的内部实现原理。内存管理在深入MappedByteBuffer之前,先看看计算机内存管理的几个术语:MMC:CPU的内存管理单元。物理内...转载 2018-07-15 21:07:56 · 1130 阅读 · 0 评论 -
Java NIO之DirectByteBuffer
DirectByteBuffer是Java用于实现堆外内存的一个重要类,我们可以通过该类实现堆外内存的创建、使用和销毁。转载 2018-07-10 18:04:47 · 2034 阅读 · 1 评论 -
Netty搭建http server
概述HttpRequestDecoder即把 ByteBuf 解码到 HttpRequest 和 HttpContent。 HttpResponseEncoder即把 HttpResponse 或 HttpContent 编码到 ByteBuf。 HttpServerCodec即 HttpRequestDecoder 和 HttpResponseEncoder 的结合。例子...原创 2018-07-03 16:11:34 · 2592 阅读 · 0 评论 -
NIO中存在的bug—epoll空轮询
IO&NIO介绍IO读取NIO读取NIO中epoll空轮询表现public static void main(String[] args) { Selector selector = Selector.open(); System.out.println(selector.isOpen()); Server...转载 2015-12-20 10:44:30 · 1109 阅读 · 0 评论 -
Netty4.0源码分析之PoolThreadCache
在JEMalloc分配算法文中,将PoolThreadCache类比为同城仓库,可以就近提取中小型货物。本文将详细介绍PoolThreadCache的细节和实现,在Netty中,其内部结构可见下图:PoolThreadCache这里,新引入一个数据类型MemoryRegionCache,其内部是一个ByteBuf队列。每个节点是一个ByteBuf的说法并不准确,切确的说,是不再使...转载 2015-06-04 20:26:11 · 556 阅读 · 0 评论 -
Netty4.0源码分析之PoolSubpage
在PoolArena中由PoolSubpage双向链表分配内存小于PageSize(Netty默认8KB)的请求。在JEMalloc分配算法一文中介绍过,其中的结构如下图:Subpage双向链表而Subpage又是由PoolChunk中的一个Page依照第一次分配请求的大小均等切分而成。可推知,小于PageSize的分配请求执行过程如下:首次请求Arena分配,Arena中...转载 2015-06-04 16:24:37 · 647 阅读 · 0 评论 -
Netty4.0源码分析之PoolChunk
1. 伙伴分配算法JEMalloc分配算法使用伙伴分配算法分配Chunk中的Page节点。Netty实现的伙伴分配算法中,构造了两棵满二叉树,满二叉树非常适合使用数组存储,Netty使用两个字节数组memoryMap和depthMap来表示两棵二叉树,其中MemoryMap存放分配信息,depthMap存放节点的高度信息。为了更好的理解这两棵二叉树,参考下图:伙伴分配算法二叉树左...转载 2015-06-06 00:18:15 · 402 阅读 · 0 评论 -
Netty4.0源码分析之poolArena
首先看类签名: abstract class PoolArena<T> implements PoolArenaMetric该类是一个抽象类,这是因为ByteBuf分为Heap和Direct,所以PoolArena同样分为两类:Heap和Direct。该类实现的接口PoolArenaMetric是一些信息的测度统计,忽略这些信息不再分析。其中的关键成员变量如下:...转载 2015-06-02 09:37:53 · 602 阅读 · 0 评论 -
netty4.0源码分析之PooledByteBufAllocator
概述netty 内存管理的高性能主要依赖于两个关键点:内存的池化管理 使用堆外直接内存(Direct Memory)从netty 4开始,netty加入了内存池管理,采用内存池管理比普通的new ByteBuf性能提高了数十倍。 首先介绍PoolChunk, 该类主要负责内存块的分配与回收,首先来看看两个重要的术语: page: 可以分配的最小的...转载 2015-06-02 09:22:42 · 725 阅读 · 0 评论 -
Netty编解码框架分析
转载自:李林锋 Netty系列之Netty编解码框架分析1. 背景1.1. 编解码技术通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。进行远...转载 2018-05-30 15:14:47 · 1506 阅读 · 1 评论 -
Netty Codec框架
什么是 Codec编写一个网络应用程序需要实现某种 codec (编解码器),codec的作用就是将原始字节数据与目标程序数据格式进行互转。网络中都是以字节码的数据形式来传输数据的,codec 由两部分组成:decoder(解码器)和encoder(编码器)编码器和解码器一个字节序列转换为另一个业务对象。我们如何区分?想到一个“消息”是一个结构化的字节序列,语义为一个特定的应用程序——它的“数据”...转载 2018-05-30 14:55:16 · 3648 阅读 · 0 评论 -
Java NIO分析之Selector详解
1. Selector设计笔者下载得是openjdk8的源码, 画出类图比较清晰得看到,openjdk中Selector的实现是SelectorImpl,然后SelectorImpl又将职责委托给了具体的平台,比如图中框出的linux2.6以后才有的EpollSelectorImpl, Windows平台则是WindowsSelectorImpl,MacOSX平台是KQueueSelectorImpl.从名字也可以猜到,openjdk肯定在底层还是用epoll,kqueue,iocp这些.转载 2018-05-25 09:46:36 · 276 阅读 · 0 评论 -
Netty in Action -ByteBuf
Buffer(缓冲)正如我们先前所指出的,网络数据的基本单位永远是 byte(字节)。Java NIO 提供 ByteBuffer 作为字节的容器,但这个类是过于复杂,有点难以使用。Netty 中 ByteBuffer 替代是 ByteBuf,一个强大的实现,解决JDK 的 API 的限制,以及为网络应用程序开发者一个更好的工具。但 ByteBuf 并不仅仅暴露操作一个字节序列的方法;这也是专门的...转载 2018-05-27 15:56:06 · 555 阅读 · 0 评论 -
Netty in Action -ChannelHandler和ChannelPipeline
本章主要内容ChannelChannelHandlerChannePipelineChannelHandlerContext我们在上一章研究的 bytebuf 是一个容器用来“包装”数据。在本章我们将探讨这些容器如何通过应用程序来移动,传入和传出,以及他们的内容是如何处理的。Netty 提供了应用开发的数据处理方面的强大支持。我们已经看到了channelhandler 如何链接在一起 Channe...转载 2018-05-27 16:17:22 · 371 阅读 · 0 评论 -
Netty in Action - Bootstrap
Bootstrap类型Bootstrap(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrap。如前面所述,Bootstrap 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。面向连接 vs. 无连接请记住,这个讨论适...转载 2018-05-27 16:33:12 · 373 阅读 · 0 评论 -
Netty百万级推送服务设计要点
1. 背景1.1. 话题来源最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题。问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类:Netty是否可以做推送服务器?如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端?使用Netty开发推送服务遇到的各种技术问题。由于咨询者众多,关注点也比较集中,我希望通过本文...转载 2018-05-27 18:05:46 · 352 阅读 · 0 评论 -
Netty线程模型
转载自:李林锋 Netty系列之Netty线程模型1. 背景1.1. Java线程模型的演进1.1.1. 单线程时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一。在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能。1.1.2. 多线程随着硬件性能的提升,CPU的核数...转载 2018-05-27 23:34:14 · 221 阅读 · 0 评论 -
Netty轻量级内存池技术实现原理与应用
转载自:Netty轻量级内存池技术实现原理与应用在Netty中,通常会有多个IO线程独立工作,基于NioEventLoop的实现,每个IO线程负责轮询单独的Selector实例来检索IO事件,当IO事件来临的时候,IO线程开始处理IO事件。最常见的IO事件即读写事件,那么这个时候就会涉及到IO线程对数据的读写问题,具体到NIO方面即从内核缓冲区读取数据到用户缓冲区或者从用户缓冲区将数据写到内核缓冲...转载 2018-05-28 08:21:28 · 301 阅读 · 0 评论 -
java NIO实现(二) —— EPollArrayWrapper源码分析
EPollArrayWrapper有几个native方法1、poll方法:调用了epollWait()方法,返回ready desccriptor的数量。将c++层的struct epoll_event events数组的指针地址,转为私有成员变量pollArrayAddress。2、updateRegistrations方法:调用epollCtl方法,3、remove(int fd)方法:调用epollCtl方法,从epfd指向的epoll实例删除注册其中的fd。4、EpollA原创 2018-03-30 14:51:01 · 1958 阅读 · 0 评论 -
java NIO之EPollSelectorProvider源码分析
概述根据NIO源码阅读(1)-SelectorProvider一文的分析,Linux下SelectorProvider的实现类为EpollSelectorProvider,下面具体看看它的实现;EPollSelectorProviderpublic abstract class SelectorProviderImpl extends SelectorProvider{ pub...转载 2018-03-30 15:18:11 · 1969 阅读 · 1 评论 -
Netty零拷贝原理实现
转载自:李林锋 Netty系列之Netty高性能之道很多用户都听说过Netty具有“零拷贝”功能,但是具体体现在哪里又说不清楚,本小节就详细对Netty的“零拷贝”功能进行讲解。Netty的“零拷贝”主要体现在如下三个方面:1) Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(H...转载 2018-05-29 23:57:15 · 8232 阅读 · 2 评论 -
java NIO Channel and buffer
Java NIO Channels are similar to streams with a few differences:You can both read and write to a Channels. Streams are typically one-way (read or write).Channels can be read and written asynchronously.Channels always read to, or write from, a Buffer.转载 2018-05-25 09:42:41 · 206 阅读 · 0 评论