ZZIO模型– 同步和阻塞,異步和非阻塞的區別

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調用阻塞。

好了,上圖已經解釋的很清楚了,再來一張書中的綜合圖解:

以上這些應該解釋的足夠清楚了吧 ~~~

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章