3.1说说 BIO,NIO,AIO
问这个问题,通常是考察你对Web应用高并发的理解预备知识
。开发Web应用,肯定分成客户端和服务器。客户端与服务器交互,肯定得做这么几件事:
服务器程等待有客户端连接上来客户端真的连"二来了,建立连接
客户端没有向服务器发送请求,此时服务器程需要等待数据准备好客户端向服务器发送请求,需要将请求数据从网卡复制到系统内存
。上面a.c。这两个阶段,没有客户端连接,没有数据请求,这时是否需要一个程时刻盯着?
如果需要占用一个程,那么就称程被阻
如果不需要程盯着,程可以腾出手来去干别的活,那么就称程非阻塞
.d。阶段的数据复制,不会用到CPU,也就是不会用列线程,同样也存在幾程阻塞还是幾程非阻塞两种情况 BIO(阻塞1/O)
是搭b.c.d。这几个阶段,程都得阻塞,腾不出手干别的,即使此时它无所事事,高并发下,阻塞线程多了,处理连接,处理请求的能力就会大受影响
增加程不可行,毕竟程是有限资源,这是成本问题
不增加幾程也不行,没有新程,没人去处理新连接,处理新请求 NIO(非阻塞1/O
是指b.c。这两个阶段,幾程可以不阻塞,腾出手干别的(怎么干别的,要靠多路复用)非阻塞I/O通常结合多路置用技术一起使用,能够在高并发下用少量程处理大量请求
多路复用是以面向事件的方式处理连接,处理德求,有事件发生才去处理,没有事件则不会占用幾程使用了多路复用技术后,新客户端来了要连换,客户端发来了新德求,都会产生事件,把这些事件交给一个贱程去统一处理就行了
程不会在高并发下存在无事可做的现象,它被充分压榨,利用率高 AIO(异步1/O)
.NIO在d。这个阶段,线程仍需阻塞,不能被解放出来干其它活
.AIO则更进一步,只需要提前准备好回调函数,在数据复制时幾程被解放,该干嘛干嘛,等数据复制完毕,由系统使用另外线程来调用回调函数做后续处理.AlO在Linux 下本质还是用多路复用技术来实现小结
.BIO并发性低,但代码更容易编写
.NIO并发性高,不过代码编写困难
.AlO并发性在Linux 下没有本质提高,用的人少[进阶]Java 21起,正式支持虚拟程
配合应拟程时,仍然是以BIO方式来编写代码,代码编写容易
虚拟程非常廉价,程不是不够吗,可动加就行(不用担心程闲置问题)
,Java 21重新实现了网络API,虚拟线程底层也会配合多路复用机制,在代码易编写的情况下,兼具高性
P.S.
.B是Blocking 阻塞
.N是Non-Blocking非阻塞.A是Asynchronous异步