总结
BIO
同步并阻塞
线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。
NIO
同步非阻塞(由于最后依然要本线程去操作,因此是“同步”;由于是立即返回,因此是“非阻塞”)
线程发起IO请求,立即返回;操作系统在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。
在Reactor模式中,事件分离者等待某个事件或者可应用或个操作的状态发生(比如文件描述符可读写,或者是socket可读写),事件分离器就把这个事件传给事先注册的处理器(事件处理函数或者回调函数),由后者来做实际的读写操作。
AIO
异步非阻塞(由于是操作系统的线程在做IO操作,完成后再通知用户线程,因此是“异步”;由于是立即返回,因此是“非阻塞”)
线程发起IO请求,立即返回;操作系统做好IO操作的准备之后,由操作系统起一个线程去做IO操作,直到操作完成或者失败;再通过调用注册的回调函数通知用户线程做IO操作完成或者失败的后续操作。
在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调。