您的位置:首页 > 大数据 > 人工智能

BIO,NIO,AIO的区别

2019-04-17 20:04 106 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_42290259/article/details/89363543

传统的HTTP服务器原理

1创建一个ServerSocket,监听并绑定一个端口
2一系列客户端来请求这个端口
3服务器使用Accept,获得一个来自客户端的Socket连接对象
4启动一个新线程处理连接

1读Socket,得到字节流
2解码协议,得到Http请求对象
3处理Http请求,得到一个结果,封装成一个HttpResponse对象
4编码协议,将结果序列化字节流
5写Socket,将字节流发给客户端
6继续循环3

HTTP服务器之所以称为HTTP服务器,是因为编码解码协议是HTTP协议,如果协议是Redis协议,那它就成了Redis服务器,如果协议是WebSocket,那它就成了WebSocket服务器,等等。

使用Netty你就可以定制编解码协议,实现自己的特定协议的服务器。

上面我们说的是一个传统的多线程服务器,这个也是Apache处理请求的模式。在高并发环境下,线程数量可能会创建太多,操作系统的任务调度压力大,系统负载也会比较高。那怎么办呢?

于是NIO诞生了,NIO并不是Java独有的概念,NIO代表的一个词汇叫着IO多路复用。它是由操作系统提供的系统调用,早期这个操作系统调用的名字是select,但是性能低下,后来渐渐演化成了Linux下的epoll和Mac里的kqueue。我们一般就说是epoll,因为没有人拿苹果电脑作为服务器使用对外提供服务。而Netty就是基于Java NIO技术封装的一套框架。为什么要封装,因为原生的Java NIO使用起来没那么方便,而且还有臭名昭著的bug,Netty把它封装之后,提供了一个易于操作的使用模式和接口,用户使用起来也就便捷多了。

BIO,NIO,AIO

老实说,在没看面试之前我都不知道BIO,NIO,AIO是什么东西
后来查资料才知道其中的区别于联系
BIO,NIO,AIO都是有关javaIO类库的,与阻塞和同步有关,如果有不懂阻塞和同步概念请自行复习一下.

一,同步阻塞I/O(BIO):

同步阻塞I/O,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在jdk1.4以前是唯一的io现在,但程序直观简单易理解,面向流

二,同步非阻塞NIO

同步非阻塞I/O,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上(selector),多路复用器轮询到连接有IO请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1,4开始支持.Selector 是Java 的非阻塞 I/O 实现的关键。它使用了事件通知 API
以确定在一组非阻塞套接字中有哪些已经就绪能够进行 I/O 相关的操作。因为可以在任何的时间检查任意的读操作或者写操作的完成状态。该种模型下,一个单一的线程便可以处理多个并发的连接。面向缓存,reactor模型,在java是selector,在linux是epoll

三,异步非阻塞AIO

AIO也就是NIO.2异步非阻塞I/O,服务器实现模式为一个有效请求一个线程,客户端的IO请求都是由操作系统先完成了再通知服务器用其启动线程进行处理。AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk1.7开始支持。,epoll,proactor模型

Netty

基于NIO实现的一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。

为什么netty是基于nio而不基于aio
  • Netty不看重Windows上的使用,在Linux系统上,AIO的底层实现仍使用EPOLL,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层,不容易深度优化
  • Netty整体架构是reactor模型, 而AIO是proactor模型,混合在一起会非常混乱,把AIO也改造成reactor模型看起来是把epoll绕个弯又绕回来
  • AIO还有个缺点是接收数据需要预先分配缓存, 而不是NIO那种需要接收时才需要分配缓存, 所以对连接数量非常大但流量小的情况,内存浪费很多
  • Linux上AIO不够成熟,处理回调结果速度跟不到处理需求,比如外卖员太少,顾客太多,供不应求,造成处理速度有瓶颈(待验证)
netty不是以NIO为底层吗,为什么是异步时间驱动

NIO为底层:netty使用了IO多路复用比如epoll。
事件驱动:一般有一个主循环和一个任务队列,所有事件只管往队列里塞,主循环则从队列里取出并处理。如果不依赖于多路复用处理多个任务就会需要多线程(与连接数对等),但是依赖于多路复用,这个循环就可以在单线程的情况下处理多个连接。无论是哪个连接发生了什么事件,都会被主循环从队列取出并处理(可能用回调函数处理等),也就是说程序的走向由事件驱动
至于异步,只是说对用户来说开启来是异步,但是实际nio只是同步非阻塞。

select poll epoll区别

https://www.cnblogs.com/aspirant/p/9166944.html

参考网址:https://blog.csdn.net/u013412772/article/details/80475159
https://blog.csdn.net/eric_sunah/article/details/80424344

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: