最近這兩天都在看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的地方真是太少太少了.開發