转载自http://stevex.blog.51cto.com/4300375/1284437
一、同步与异步
同步和异步是针对应用程序和内核的交互而言的。
同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪;
而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。
二、阻塞和非阻塞
阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式。
阻塞方式下读取或者写入函数将一直等待;
而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
所以,IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、异步(AIO)。
三、同步阻塞(BIO)、同步非阻塞(NIO)、异步非阻塞(AIO)
1.同步阻塞BIO
在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。
JAVA传统的IO模型属于此种方式。 适用于并发量要求不高的场景。
2.同步非阻塞NIO
在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。
其中目前JAVA的NIO就属于同步非阻塞IO。 适用于并发量要求比较高的场景。
3.异步非阻塞AIO
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。
发展还不是很成熟。