在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調用阻塞。
好了,上圖已經解釋的很清楚了,再來一張書中的綜合圖解:
以上這些應該解釋的足夠清楚了吧 ~~~