java NIO
文章平均质量分 88
红尘之一骑
红尘之一骑
展开
-
netty4源码阅读与分析----服务端启动过程
首先我们编写个测试例子,然后根据例子一步步debug过程中阅读源码。EventLoopGroup bossGroup=new NioEventLoopGroup(1); EventLoopGroup workerGroup=new NioEventLoopGroup(); try { ServerBootstrap b=new ServerB...原创 2018-06-27 22:09:56 · 523 阅读 · 0 评论 -
设计一个简易的NIO框架
NIO框架的目的在于屏蔽了底层的NIO操作,使得程序员只需要关注本身的业务逻辑即可,这样可以大大的提高开发效率,所有框架推出的目的不外乎都是这个目的。下面我们来看下如何去做一个NIO框架,一个典型的网络通信过程如下:这里我们主要看下服务端的流程该如何处理:1,线程模型传统的方式为针对每一个新来的连接建立一个线程去处理,这样的方式太低效了,这里我们仿照netty的方式,采用reactor线程模型:a...原创 2018-07-02 22:55:48 · 3430 阅读 · 0 评论 -
netty源码阅读与分析----HashedWheelTimer
netty是一个基础通信框架,管理的连接数较多,可能多至百万级,每一个连接都有或多或少有超时任务,比如发送数据超时,心跳检测等。如果为每一个连接都启动一个Timer,不仅效率低下,而且占用资源。基于论文Hashed and hierarchical timing wheels: data structures for the efficient implementation of a timer ...原创 2018-07-03 17:49:45 · 1185 阅读 · 0 评论 -
netty4源码阅读与分析---零拷贝
在说零拷贝之前,我们先来看下传统的读写方式是怎样的,如下图:读取数据时,请求会把读操作委托给内核,由内核与磁盘进行交互。数据会从磁盘拷贝到内核的缓存区中,这个copy动作由DMA完成,整个过程中基本上不消耗CPU,但是应用程序想拿到信息得从内核缓冲区获取,经过cpu copy的动作,将数据从内核缓冲区中拷贝到应用缓冲区中,这个copy动作是需要消耗CPU的。写数据时,应用想将数据经过内核,将数据先...原创 2018-07-02 22:47:13 · 604 阅读 · 0 评论 -
netty4源码阅读与分析---netty的内存管理
我们首先来看下UnpooledHeapByteBuf,它是基于堆内存的字节缓冲区,没有基于对象池实现,每次读写时都会创建一个UnpooledHeapByteBuf对象,可能会有一定的性能影响,但是内存管理上却相对容易得多。它的类关系图如下:...原创 2018-06-27 22:14:02 · 3628 阅读 · 0 评论 -
netty4源码阅读与分析---netty4如何处理tcp的粘包,拆包
粘包,拆包原创 2018-06-27 22:12:53 · 501 阅读 · 0 评论 -
netty4源码阅读与分析---ByteBuf
在worker线程处理read事件时,会将读取到的内容写入到ByteBuf中,供后续的操作,这里我们来研究下其内部结构,原创 2018-06-27 22:12:06 · 542 阅读 · 0 评论 -
netty4源码阅读与分析---netty线程模型
本文主要说下我自己对netty线程模型的理解,以及这样的线程模型的好处。通俗的来讲,netty的线程模型描述的就是老板和员工的故事。老板(通常情况下是一个老板)负责接活,与客户沟通,协调(netty的accept),谈成后(通道建立),他需要从员工中选出一位员工来负责处理后续具体的事宜(worker线程,这里我们有16位员工,编号1-16),员工做事时按照任务的先后顺序进行处理,这样可以避免错乱,...原创 2018-06-27 22:11:01 · 514 阅读 · 0 评论 -
netty4源码阅读与分析----服务端如何处理请求
接上一篇,当服务端接收到客户端的连接请求后(accept事件),服务端发现我们感兴趣的accept事件到了(这个过程就是NioEventLoop的run方法在不断的轮寻),交由processSelectedKeys方法处理,它会调用到这里:if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || rea...原创 2018-06-27 22:10:30 · 391 阅读 · 0 评论