按照posix标准,系统io分为同步io和异步io两种,其中同步io常用的是bio nio。异步io有aio。
从程序的角度来看,bio在读和写的时候,会阻塞,只有当程序将流写入操作系统或者读到流后,阻塞才会结束,线程接着run下去。
而nio和aio属于非阻塞方式,他们都是基于事件驱动思想,但是nio采用的是reactor 模式,而aio采用的是proactor模式。
Reactor 模式使用event loop 阻塞等在io上,一但io可以读或写,通过分发器,遍历事件注册队列,将事件分发到指定注册的处理器。由应用的处理器来再将流读取到缓冲区或写入操作系统,完成io操作。
Proctor 模式下读和写的方法是异步的,只需调用读和写即可。当有流可读取的时候,操作系统会将流传入read方法缓存区,并通知应用程序。对于写,当操作系统将writer 写入完毕时,操作系统会主动通知应用程序。
proactor模式的Aio,流的读取和写入由操作系统完成,省去了遍历事件通知队列selector 的代价。
Windows上的iocp实现了aio,linux目前只有基于epoll模拟实现的aio。