2009-08-06 160 views

回答

15

肯定和否定是相當明確的:

攔截 - 線性規劃,更易於編碼,較少的控制。
非阻塞 - 並行編程,更難編碼,更多控制。

44

阻塞IO意味着一個給定的線程不能做任何事情,直到IO被完全接收(在套接字的情況下,這個等待可能很長時間)。

非阻塞IO表示IO請求立即排隊等待函數返回。實際的IO然後由內核稍後的指針處理。

對於阻塞IO,您需要接受您要等待每個IO請求,或者您將需要爲每個請求啓動一個線程(這會非常快速地變得非常複雜)。

對於非阻塞IO,您可以發送多個請求,但需要注意的是,只有某些「稍後」的點才能使用數據。檢查數據實際到達可能是最複雜的部分。

在99%的應用程序中,您不需要關心IO塊。然而,有時您需要額外的性能來允許自己發起IO請求,然後在返回之前執行其他操作,並希望找到IO請求已完成。

無論如何,只是我的調皮。

+1

如果IO塊阻塞,表單應用程序幾乎100%的時間關心。用戶不喜歡掛起的GUI。 – 2009-08-06 21:15:36

+7

沒有什麼能阻止你運行一個獨立的線程來連續執行所有的IO並阻塞... – Goz 2009-08-06 21:17:04

0

我還沒有找到好的文章。

我在這裏問如何異步IO代碼奠定了建議:tidy code for asynchronous IO

的答案其實並不十分溫暖。

異步IO是一個讓你頭腦發熱和調試的野獸,尤其是當你使用邊緣觸發器(例如Linux的EPOLLET標誌)。但是,您在代碼複雜性方面付出的代價就是性能和可伸縮性。