Skip to content

Commit 47635e0

Browse files
committed
IO
1 parent 2f9617a commit 47635e0

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

MD/Java基础-IO.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
## BIO
22
Block-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
99
NonBlock-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不完善

0 commit comments

Comments
 (0)