[Netty源码系列]-Nio入门
Netty Journey
一、基础概念
首先在介绍IO模型之前先介绍一下这里涉及到的几个关键概念:
1、同步与异步
这是一种通讯方式上的理解,指的是调用方对结果的获取是自己等着得到呢,还是说被调用方在结果处理好之后主动告知调用方(回调等方式)。
2、阻塞与非阻塞
这是对等待结果过程中调用方的状态的理解,阻塞就是阻塞调用方当前的线程,非阻塞就是不阻塞调用方当前的线程。
一个简单的例子:我在等水开的过程中是一直在等着呢,还是先去玩着,然后时不时的去看下水是否开了。
二、BIO、NIO、AIO
1、BIO
同步阻塞IO,比如传统的socket通信就是同步阻塞IO,对应的场景就说一个客户端一个链接一个请求就会阻塞当前应用间的通信流程。其实BIO也有一个比较完整的进化历史的,起初就是一个服务器的线程来维护整个系统的运转;然后进化了一定的优化,服务器专门开了一根线程来接收客户端的连接,针对每个连接都开了一根线程进行处理,那么导致的问题就是客户端的连接数越多,服务端的线程数就越多,最坏的情况就说服务器被打爆了;然后又进行了进一步的优化,采用线程池的方案控制服务端线程的数量,线程数是得到了控制,但是终究没有解决服务端线程池中线程同步阻塞的本质问题,服务依然不能处理高并发的场景。
2、NIO
同步非阻塞IO,jdk1.4引入的NIO框架。简单的理解就是NIO是基于事件驱动的通信方式,BIO是调用方阻塞等待获取数据,而NIO则是内核通过事件的方式告知用户态的线程去获取数据(后面的文章会深入的进行讲解的)。
3、AIO
异步非阻塞IO,jdk1.7引入的改进版的NIO框架,它是通过在事件的基础上增加了回调的方式实现了异步化,但是AIO本身的实现还不够成熟,比如回调的速度比较慢,满足不了高性能的需求,所以现在大多数应用其实还是用的NIO,比如Netty的底层实现就是NIO。
jdk对这三种IO对应的底层操作系统函数都进行了封装,开发者只需要调用相关的API开发即可,不得不说java真香。
■■■
三、结语
这是写的第一篇比较正式的推文,有很多的不足并且内容也是比较简单,还请多多指教和理解,在以后的写作过程中会不断的琢磨和提高,并且不断深入的。
PS:以后的推文会涉及到架构、源码、存储、面试以及开发中遇到的各种难题等各方面的内容,请多多关注和交流~
■■■
■ 请您关注,干货多多