持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
Netty前置-----IO简单介绍
1、关于Netty的基本介绍
Netty是一个基于Java NIO和异步事件驱动模型实现的客户端/服务器框架,使用它可以快速开发高性能、高可扩展的网络服务器和客户端程序;
Netty 的设计主要基于主从 Reactor 多线程模式;
2、了解一下IO事件模型
常见的IO模型有五种
- 同步阻塞IO(Blocking IO)
线程主动发起资源请求到操作系统内核区,线程请求操作到达,内核空间需要完成资源的完全IO操作,在这一过程中线程处于阻塞状态,直至从内核缓冲区复制到用户缓冲区;
阻塞IO会为每个IO请求都分配线程资源,当并发量大的时候,系统对这些线程的维护将会耗费巨大的资源;
- 同步非阻塞(Non-Blocking IO)
同步非阻塞的调用到达时,首先判断内核缓冲区是否有就绪数据,有则会阻塞线程将数据复制到用户缓冲区;没有的话,则将线程直接返回,但是这个时候就存在一个问题,线程又不知道内核缓冲区啥时候有数据,因此就需要用户线程不断的轮训,直到内核缓冲区有数据为止,因此这种轮训操作将会耗费很多cpu资源,效率很低;
- IO多路复用模型
IO多路复用模型是通过引入select/epoll系统调用的方式,把想要读写操作的文件描述符(fd)注册到epoll选择器,然后开启轮训模式;
这种方式就是用一个进程监视注册在epoll上的多个fd,一旦某些fd准备就绪,内核将这些fd加入到一个就序列表返回到用户程序发起IO调用;在IO操作内核缓冲复制到用户缓冲的过程中线程仍然是阻塞的;
一个选择器的查询线程就可以处理成百上千的连接事件,不需要单独为这些事件单独创建线程,大大降低了系统的线程开销,提升了性能;java的NIO使用的就是这种方式;
- 异步IO模型(Asynchronous IO)
- 信号驱动IO模型(SIGIO、Signal Driven I/O)
3、Java中的NIO
Netty是基于NIO(NEW IO)的,也就是基于IO多路复用模型的实现;
相比较java中的另外一个IO-----BIO而言,NIO是非阻塞 的,基于Buffer缓冲区的、可以双向操作的,BIO是基于流式操作只能单向操作;而且基于缓冲的操作效率方面也会比流操作要高;BIO有链接到达时会阻塞线程,而NIO则是通过Selector轮询线程,不会阻塞;