4 Star 14 Fork 8

java_wxid/Java知识系统归纳

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
bio-nio-aio.md 3.17 KB
一键复制 编辑 原始数据 按行查看 历史
java_wxid 提交于 2021-04-12 22:33 . netty

bio,nio ,aio

什么是BIO

BIO:同步并阻塞,服务器实现一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,没处理完之前此线程不能做其他操作(如果是单线程的情况下,我传输的文件很大呢?),当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

什么是NIO

NIO:同步非阻塞,服务器实现一个连接一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4之后开始支持。

什么是AIO

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

AIO属于NIO包中的类实现,其实IO主要分为BIO和NIO,AIO只是附加品,解决IO不能异步的实现

在以前很少有Linux系统支持AIO,Windows的IOCP就是该AIO模型。但是现在的服务器一般都是支持AIO操作

BIO和NIO、AIO的区别

BIO是阻塞的,NIO是非阻塞的.
BIO是面向流的,只能单向读写,NIO是面向缓冲的, 可以双向读写
使用BIO做Socket连接时,由于单向读写,当没有数据时,会挂起当前线程,阻塞等待,为防止影响其它连接,,需要为每个连接新建线程处理.,然而系统资源是有限的,,不能过多的新建线程,线程过多带来线程上下文的切换,从来带来更大的性能损耗,因此需要使用NIO进行BIO多路复用,使用一个线程来监听所有Socket连接,使用本线程或者其他线程处理连接
AIO是非阻塞 以异步方式发起 I/O 操作。当 I/O 操作进行时可以去做其他操作,由操作系统内核空间提醒IO操作已完成(不懂的可以往下看)

BIO的缺点:当进行服务端开发时,绑定端口号之后,我们会监听该端口,看看有没有客户端连接上这个服务端,也就是等待accept事件,这个accept会阻塞当前主线程,然后当有一个客户端连接上的话,程序就会拿到一个C/S连接的一个socket,对这个socket我们可以进行读写,但是这个读写也是会阻塞当前线程的,所以一般会使用多线程的方式来进行C/S的交互也就是一个客户端一个线程处理,但是这里又会出现一个大问题了,也就是我们常说的C10K问题,也就是说10W个客户端我难道要起10W个线程吗?还有就是不可能这10W个客户端的线程上下文切换也是吃不消的,所以这样肯定是不可以的,CPU直接炸裂,负载直接起飞

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/java_wxid/Java-knowledge-system-induction.git
git@gitee.com:java_wxid/Java-knowledge-system-induction.git
java_wxid
Java-knowledge-system-induction
Java知识系统归纳
master

搜索帮助

246c6175 1850385 950819b3 1850385