File tree Expand file tree Collapse file tree 1 file changed +8
-4
lines changed Expand file tree Collapse file tree 1 file changed +8
-4
lines changed Original file line number Diff line number Diff line change 11## BIO
22Block-IO:InputStream和OutputStream,Reader和Writer。属于同步阻塞模型
33
4- 同步阻塞:
4+ 同步阻塞:一个请求占用一个进程处理,先等待数据准备好,然后从内核向进程复制数据,最后处理完数据后返回
55
66![ ] ( https://github.com/xbox1994/2018-Java-Interview/raw/master/images/BIO.png )
77
88## NIO
99NonBlock-IO:Channel、Buffer、Selector。属于IO多路复用的同步非阻塞模型
1010
11- 同步非阻塞:
11+ 同步非阻塞:进程先将一个套接字在内核中设置成非阻塞再等待数据准备好,在这个过程中反复轮询内核数据是否准备好,准备好之后最后处理数据返回
1212
1313![ ] ( https://github.com/xbox1994/2018-Java-Interview/raw/master/images/NIO-1.png )
1414
15- IO多路复用:相当于对同步非阻塞的优化版本,区别在于I/O多路复用阻塞在select ,epoll这样的系统调用之上,而没有阻塞在真正的I/O系统调用如recvfrom之上 。换句话说,轮询机制被优化成通知机制,多个连接公用一个阻塞对象,进程只需要在一个阻塞对象上等待,无需再轮询所有连接
15+ IO多路复用:同步非阻塞的优化版本,区别在于IO多路复用阻塞在select ,epoll这样的系统调用之上,而没有阻塞在真正的IO系统调用上 。换句话说,轮询机制被优化成通知机制,多个连接公用一个阻塞对象,进程只需要在一个阻塞对象上等待,无需再轮询所有连接
1616
1717![ ] ( https://github.com/xbox1994/2018-Java-Interview/raw/master/images/NIO-3.png )
1818
19- 在Java的NIO中,是基于Channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道,select方法会一直阻塞,直到channel中有事件就绪:
19+ 在Java的NIO中,是基于Channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector用于监听多个通道的事件(比如:连接打开,数据到达)
20+
21+ 因此,单个线程可以监听多个数据通道,Selector的底层实现是epoll/poll/select的IO多路复用模型,select方法会一直阻塞,直到channel中有事件就绪:
2022
2123![ ] ( https://github.com/xbox1994/2018-Java-Interview/raw/master/images/NIO-4.png )
2224
@@ -35,3 +37,5 @@ AIO得到结果的方式:
3537
3638* 基于回调:实现CompletionHandler接口,调用时触发回调函数
3739* 返回Future:通过isDone()查看是否准备好,通过get()等待返回数据
40+
41+ 但要实现真正的异步非阻塞IO,需要操作系统支持,Windows支持而Linux不完善
You can’t perform that action at this time.
0 commit comments