最近这两天都在看IO相关的知识点.一开始太凌乱,太杂,不过终于整理清楚了.以为杂乱是由于一开始觉得异步IO等于非阻塞IO,这彻底是两个概念,算法
LINUX下的异步IO有两类,一类为glibc AIO,这类AIO是经过线程回调模拟,没细究;另外一类是native AIO,是LINUX内核支持的,但只支持直接IO技术,关于直接IO技术.这里哆嗦两句,在通常状况下LINUX进行write系统调用时,一般是采用的延迟写入机制.在内核空间,有一个IO缓冲区,主要用来存储用户的写入数据,write系统调用成功返回时,只可以肯定是将数据写入了这个页中(并将该页标记为脏页,内核会按期或不按期将脏页的数据刷新进具体的磁盘上).手动同步到具体硬件上能够用fsync或者sync系统调用,这里就很少说了.针对于写操做来讲.同步IO与异步IO的具体流程为:缓存
同步: write-->内核缓冲页-->内核定时或不按期刷新至磁盘中异步
异步 write-->提交写请求给内核-->由内核经过本身的调度算法将写操做具象出来.net
从这里能够看出来,对于写操做,不论是同步,仍是异步,write调用均可以当即返回,不存在IO等待,可是经过这篇文章http://blog.csdn.net/youbingchen/article/details/51769042中的小结线程
注意:Linux内核级别的文件异步I/O是不支持缓存操做的,也就是说,即便须要操做的文件块在Linux文件缓存存在,也不会经过读取、更改缓存中的文件块来代替实际对磁盘的操做。目前,Nginx仅支持在读取文件时使用异步I/O,由于正常写入文件时每每是写入内存中就 马上返回,而使用异步I/O写入时速度会明显降低blog
异步写反而会下降效率.缘由应该是直接IO所致使的,好比同时写入操做10万次,若是用的同步IO,写入缓存页的方式,实际的真正IO操做确定是少于10万,而异步IO就会真正执行10万.内存
异步IO应该主要是针对字符设备,如键盘等不知道何时会有数据来的状况,效果更好.不过在实际开发过程当中.用到异步IO的地方真是太少太少了.开发