朝花夕拾

A Development Engineer, a Life Liver, a Hope Holder

什么时IO,IO都有哪几种类型

IO:IO(input and output).其实就是一次数据访问交互过程,客户端请求读取/写入数据的完整过程。
一次IO一般要经历几个状态。1. 检查数据是否ready。2. 将已经ready的数据copy到用户空间。
我们经常接触到几个IO概念,BIO, NIO, AIO。他们到底是什么?他们的使用场景是什么?
IO的分类大体上可以从两大方面看 1. 是不是同步IO 2. 是不是阻塞IO
同步阻塞IO 就是我们常说的BIO;同步非阻塞IO,就是我们说的NIO;多路复用IO其实也是一种阻塞IO;异步非阻塞IO。

BIO

阻塞IO,就是当客户端发起一次IO请求后,客户进程/线程阻塞在IO操作,知道IO操作完全结束之前,客户线程不能做其他任何事情。

NIO

非阻塞IO,客户端发起一次IO请求之后,系统内核不会block用户线程,如果内核数据没有ready,内核会直接return Err.用户线程如果发现返回结果是Err,那么就再次轮询查询,直到内核数据ready,用户线程等待内核将数据拷贝到用户空间。

多路复用IO

用户发起IO请求,在调用select()方法之后就被Block住。多个请求过来都会被阻塞到Select方法上面。Select不停地轮询注册到Select上面的内核数据是否ready。如果某个注册的IO事件OK了,select方法立刻返回,用户线程调用read方法将内核数据拷贝到用户空间。多路复用的一大好处是可以通过单一内核的select线程处理大量的请求操作。多个IO请求可以在一个用户线程里面被注册监听。这样可以达到使用少量用户线程处理大量IO请求的效果。

for(Socket sk : sockets) {
sk.select();
}
sockets = select();
while(sockets is not finish){
if(sk.canRead()) {
sk.read()
}
}
异步IO

上面的IO操作其实都可以归为同步IO,因为大家都要等待。异步IO是完全不需要等待的IO。当用户请求过来之后,内核不会产生任何Block。当内核接收到请求之后会立刻返回,当内核数据Ready时,内核会将数据拷贝到用户空间。当这些工作全部OK时,内核通过信号告诉用户进程IO操作已经完成。

参考文章

http://www.cnblogs.com/findumars/p/6361627.html
https://www.cnblogs.com/welen/articles/5385837.html
https://www.cnblogs.com/Anker/p/3269106.html