IO

2019-12-30

I/O的两个阶段

1
用户线程等待内核将数据从网卡拷贝到内核空间。
1
内核将数据从内核空间拷贝到用户空间。

阻塞IO

1
用户发起read,数据从网卡copy到内核空间,再从内核空间copy到用户空间,整个过程都阻塞.

非阻塞IO

1
用户发起read,内核空间没准备好就直接返回,不阻塞用户.当内核空间准备好数据后,用户发起read,数据从内核空间copy到用户空间,这个过程还是阻塞的.

IO多路复用

1
2
单个线程跟踪多个IO Stream状态.是对多线程非阻塞IO模型的优化.节省了资源的同时,少了线程创建销毁的开销.
数据从网卡copy到内核空间非阻塞,但是从内核空间copy到用户空间仍旧阻塞.
1
select : 上限1024;数据准备好后,仍需用户去轮询哪个IO Stream准备好.找到对应IO Stream,发起read请求,数据从内核空间copy到用户空间,该过程仍旧是阻塞的.
1
poll : 去除select的跟踪IO Stream数上限.
1
epoll : 可以告诉用户是哪个IO Stream上准备好数据,不需要用户去扫描.

异步IO

1
2
用户发起read,直接返回.内核准备好数据,主动将数据从内核Copy到用户空间并通知用户(执行事先注册好的回调函数).
因此数据从内核空间copy到用户空间这个阶段用户线程是非阻塞的.

jdk nio(IO 多路复用)

1
2
创建一个Selector,在它身上注册各种感兴趣的事件,然后调用select(poll,epoll..)方法,等待感兴趣的事情发生。
感兴趣的事情发生了,比如可以读了,这时便创建一个新的线程从 Channel 中读数据

jdk nio2(异步IO)

1
Windows的IOCP和Linux(内核2.6之后)的AIO的封装.