java中的nio(面试用)
目录
- java中的nio(面试用)
- IO模型
java中的nio(面试用)
IO模型
IO操作往往在两个场景下会用到:文件IO,网络IO,本文主要谈网络IO,因为通常使用NIO是在网络中使用的,网上大部分讨论NIO都是在网络通信的基础之上的!说NIO是非阻塞的NIO也是网络中体现的!
-
阻塞I/O
-
非阻塞I/O
-
I/O多路复用
-
信号驱动I/O
-
异步I/O
本文只谈前三种模型,因为这仨个用得最多(虽然知不知道都没关系,但是面试的喜欢问)
阻塞IO,也叫BIO(java的传统IO)
当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了,所以问题就是效率上不去。
非阻塞IO,也叫NIO
NIO并不是Java独有的概念,由os提供调用(select,epoll等)。
此处说os层级的吧,因为java的NIO是多路复用的:
在进程进行系统调用的时候,如果没有数据就直接返回一个错误,然后一直反复调用,看是不是有数据到来。
IO多路复用
线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程可以管理多个输入和输出通道(Channel)。
核心组件:
Channel、buffer、selector
Channel负责运输数据,buffer负责处理数据
一个请求一个Channel,而Channel会注册到多路复用器Selector上,Selector会监听多个通道(轮询),轮询到有I/O请求就进行处理,而Selector对应一个或多个线程,因此就起到了少量线程处理大量请求的效果。