天天看點

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模型圖:

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

非阻塞IO模型圖解:

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

IO複用模型圖解:

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

信号驅動IO圖解:

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

異步IO模型圖解:

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

同步IO引起程序阻塞,直至IO操作完成。

異步IO不會引起程序阻塞。

IO複用是先通過select調用阻塞。

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

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

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