1. 程式人生 > >關於異步IO與同步IO的寫操作區別

關於異步IO與同步IO的寫操作區別

返回 但是 block 緩沖區 緩沖 方式 非阻塞io .net 有一個

最近這兩天都在看IO相關的知識點.一開始太淩亂,太雜,不過終於整理清楚了.覺得雜亂是因為一開始以為異步IO等於非阻塞IO,這完全是兩個概念,

LINUX下的異步IO有兩類,一類為glibc AIO,這類AIO是通過線程回調模擬,沒細究;另一類是native AIO,是LINUX內核支持的,但只支持直接IO技術,關於直接IO技術.這裏哆嗦兩句,在一般情況下LINUX進行write系統調用時,通常是采用的延遲寫入機制.在內核空間,有一個IO緩沖區,主要用來存儲用戶的寫入數據,write系統調用成功返回時,只能夠確定是將數據寫入了這個頁中(並將該頁標記為臟頁,內核會定期或不定期將臟頁的數據刷新進具體的磁盤上).手動同步到具體硬件上可以用fsync或者sync系統調用,這裏就不多說了.針對於寫操作來說.同步IO與異步IO的具體流程為:


同步: write-->內核緩沖頁-->內核定時或不定期刷新至磁盤中

異步 write-->提交寫請求給內核-->由內核通過自己的調度算法將寫操作具象出來


從這裏可以看出來,對於寫操作,不管是同步,還是異步,write調用都可以立即返回,不存在IO等待,但是通過這篇文章http://blog.csdn.net/youbingchen/article/details/51769042中的小結

註意:Linux內核級別的文件異步I/O是不支持緩存操作的,也就是說,即使需要操作的文件塊在Linux文件緩存存在,也不會通過讀取、更改緩存中的文件塊來代替實際對磁盤的操作。目前,Nginx僅支持在讀取文件時使用異步I/O,因為正常寫入文件時往往是寫入內存中就 立刻返回,而使用異步I/O寫入時速度會明顯下降

異步寫反而會降低效率.原因應該是直接IO所導致的,比如同時寫入操作10萬次,如果用的同步IO,寫入緩存頁的方式,實際的真正IO操作肯定是少於10萬,而異步IO就會真正執行10萬.

異步IO應該主要是針對字符設備,如鍵盤等不知道什麽時候會有數據來的情況,效果更好.不過在實際開發過程中.用到異步IO的地方真是太少太少了.

關於異步IO與同步IO的寫操作區別