![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Netty
文章平均质量分 84
会编程的老六
这个作者很懒,什么都没留下…
展开
-
Netty源码分析-EventLoop(下)
Nio空轮询bug在哪里体现,并如何解决? 在NioEventLoop中,run方法中是一个死循环,所以需要通过调用selector来进行阻塞。如果这个bug发生了,即使没有超时,也会不断进行循环,导致cpu占用率会到达100%。 @Override protected void run() { int selectCnt = 0; ... for(;;){ ... // 可能发生空轮询,无法阻塞NIO线程 strategy = selec原创 2022-02-28 17:46:13 · 443 阅读 · 1 评论 -
Netty源码分析-EventLoop(上)
前言 由于整个NioEventLoop类过大,其中还有很多从父类继承的方法。所以在这里通过以问题驱动的方式,对重要部分进行逐步分析。 组成部分 Selector private Selector selector; private Selector unwrappedSelector; 线程 在父类SingleThreadEventLoop的父类SingleThreadEventExecutor中: private volatile Thread thread; // EventLoop用来执行原创 2022-02-16 13:29:01 · 447 阅读 · 0 评论 -
Netty源码分析-启动流程
原生NIO启动流程 // netty 中使用 NioEventLoopGroup (简称 nio boss 线程)来封装线程和 selector Selector selector = Selector.open(); // 创建 NioServerSocketChannel,同时会初始化它关联的 handler,以及为原生 ssc 存储 config NioServerSocketChannel attachment = new NioServerSocketChannel(); // 创建 Nio原创 2022-02-11 14:41:29 · 351 阅读 · 1 评论 -
BIO NIO AIO
BIO NIO AIO BIO 传统的同步阻塞式I/O模型。通常由一个Acceptor线程负责监听客户端的连接,接受到客户端的连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回给客户端。线程销毁,也就是典型的一请求一应答通信模型。BIO读写是面向流操作的。BIO流是单向的,一个流必须是InputStream或OutputString的子类。 最大的问题就在于缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问量呈1:1的正比关系,由于线程是java虚拟原创 2022-01-13 00:41:32 · 174 阅读 · 0 评论 -
Linux 网络I/O模型
Linux 网络I/O模型 1. 阻塞IO模型 最常用的I/O模型,缺省情形下,所有文件操作都是阻塞的。进程空间调用recvfrom函数,直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间,进程会被阻塞一直等待。 2. 非阻塞IO模型 recvfrom函数当发现内核缓冲区没有数据时,直接返回一个EWOULDBLOCK错误,一般通过轮询检查这个状态,看内核是否有数据到来。 3. IO复用模型 fd:文件描述符。一个文件的读写操作会调用内核提供的系统命令,返回一个fd socketf原创 2022-01-11 23:16:35 · 1107 阅读 · 0 评论