在http://hi.baidu.com/deep_pro/blog/item/cf964b0ade9f4d1594ca6b1b.html
這些詞之間的差別難倒了很多人,還有什麼同步阻塞, 同步非阻塞, 異步阻塞, 異步非阻塞,亂七八糟的。
很多文章也想講明白這個問題。著名且引起熱議的有
http://www.ibm.com/developerworks/cn/linux/l-async/
http://www.cppblog.com/converse/archive/2009/05/13/82879.html
可是看了之後還是有點将信将疑,跑到圖書館翻了UNP 第一卷,不愧是聖經級别的著作,似有所悟。
UNP所述:
POSIX定義中,同步IO操作:IO操作将導緻請求程序阻塞,直到IO操作完成。
異步IO操作:IO操作不導緻請求程序阻塞
UNP中總結的IO模型有5種之多
阻塞IO,非阻塞IO,IO複用,信号驅動IO,異步IO,前四種都屬于同步IO。
阻塞IO不必說了
非阻塞IO ,IO請求時加上O_NONBLOCK一類的标志位,立刻傳回,IO沒有就緒會傳回錯誤,需要請求程序主動輪詢不斷發IO請求直到傳回正确
IO複用同非阻塞IO本質一樣,不過利用了新的select系統調用,由核心來負責本來是請求程序該做的輪詢操作。看似比非阻塞IO還多了一個系統調用開銷,不過因為可以支援多路IO,才算提高了效率
信号驅動IO,調用sigaltion系統調用,當核心中IO資料就緒時以SIGIO信号通知請求程序,請求程序再把資料從核心讀入到使用者空間,這一步是阻塞的。
異步IO,如定義所說,不會因為IO操作阻塞,IO操作全部完成才通知請求程序。
這樣以來,同步和阻塞,異步和非阻塞就不會被混淆了,它們不是同一個方面上的概念,不能比較差別
同步和異步是隻跟IO操作過程中程序的狀态變化有關
阻塞和非阻塞就是程序的兩種狀态。
Unix下的五種I/O模型是:
阻塞I/O
非阻塞I/O
I/O複用(select 和poll)
信号驅動I/O
異步I/O
阻塞I/O模型圖:
非阻塞IO模型圖解:
IO複用模型圖解:
信号驅動IO圖解:
異步IO模型圖解:
同步IO引起程序阻塞,直至IO操作完成。
異步IO不會引起程序阻塞。
IO複用是先通過select調用阻塞。
好了,上圖已經解釋的很清楚了,再來一張書中的綜合圖解:
以上這些應該解釋的足夠清楚了吧 ~~~