Netty的NioEventLoop
1. 几种网络IO介绍下(BIO、NIO、AIO)
网络中,客户端与请求的集中关系:
- 客户端阻塞,请求同步(时刻检测服务端是否给出响应), 发请求后,一直等待响应
- 客户端非阻塞,请求同步: client发送请求后。轮询服务端是否给出响应
- 客户端阻塞,请求异步(服务端完成之后,通知客户端),client发请求后,一直等待服务端返回响应
- 客户端非阻塞,请求异步: client发送请求后,去执行别的任务,服务端给出响应后,通知客户端.
NIO 是同步非阻塞IO. 使用NIO读取数据时, 线程不会阻塞,需要线程主动去查询是否有IO事件。(selector)
AIO NIO2.0,异步非阻塞IO,使用AIO读取数据时,线程不会阻塞,并当有数据可读时会通知给线程,不需要主动查询
适用于连接较多、操作时间长. 例如相册服务.
2. NIO的核心组件
- channel、buffer、selector
- 每个channel对应一个buffer缓冲区,buffer的内容通过channel进行传递
- channel注册到selector,selector根据channel上发送的读写事件,将请求交给空闲线程.
- buffer和channel都是可读可写的.
3. select、epoll、poll的区别
- select模型,维护一个通道(FD)的集合(FD_set), 扫描这些所有的fd, 将fd复制到内核空间,由内核空间激活,再通过socket连接完成io
1 | 使用 数组 来存储Socket,容量固定,通过轮询来判断是否发送IO事件, |
- poll模型,使用链表存储FD(socket),
1 | 机制和select差不多,将FD_set结构进行优化,但是也需要拷贝fd |
- epoll模型,EventPoll, 时间通知模型(事件驱动), 不再扫描所有fd, 将用户关心的事件存放再一个内核的事件表中,当socket发送IO事件后,应用程序才进行IO操作,不主动轮询
1 | epoll事件回调,红黑树,无上限,IO效率高. |
4. 零拷贝
避免让cpi执行大量数据拷贝任务,应用程序再需要把内核中的一块区域数据转移到另外一块内核区域时,不需要先复制到用户空间。
5. Netty和Tomcat
Netty,基于NIO的异步网络通信框架、性能高、封装了原生NIO.
1 | 封装的是IO模型,关注网络数据的传输,不关心具体的协议 |
Tomcat,一个web服务器,Servlet容器,内部只会运行Servlet程序,处理HTTP请求.
6.Netty高性能体现在哪些方面
- NIO模型,用最少资源做更多事情
- 内存零拷贝,减少不必要的内存拷贝
- 内存池设计,申请的内存可以复用,主要指直接内存
- 串行化处理读写,避免使用锁带来的性能开销,消息的处理尽可能再同一个线程内完成。 不做线程却换,避免多线程竞争和同步锁.
1 | 表面上看串行化设计的CPU利用率不高,并发程度不高,但是通过调整NIO线程池的线程参数,可以同时启动多个串行化的线程并行运行 |
- 高性能序列化协议,支持protobuf等高性能序列化协议
- 高效并发编程,大量使用volatile; CAS和原子类 的广泛应用;线程安全容器;通过读写锁提升并发性能.
7.Netty线程模型
- 支持Reactor单线程模型,Reactor多线程模型、主从多线程模型. 可通过参数切换
8.Tomcat为什么要使用自定义类加载器.
- 部署多个应用.
9. Tomcat优化
- 两方面:内存和线程.