曾幾何時,我碰到Introduction to Indy文章,並不能停止從那時起封鎖vs非封鎖IO的想法。阻止IO與非阻塞IO;尋找好的文章
尋找一些好文章描述什麼是阻塞IO和非阻塞IO和如何設計在每種情況下您的應用程序來獲得自然,易於理解,易於維護的代碼的利弊。
想了解大局......
曾幾何時,我碰到Introduction to Indy文章,並不能停止從那時起封鎖vs非封鎖IO的想法。阻止IO與非阻塞IO;尋找好的文章
尋找一些好文章描述什麼是阻塞IO和非阻塞IO和如何設計在每種情況下您的應用程序來獲得自然,易於理解,易於維護的代碼的利弊。
想了解大局......
肯定和否定是相當明確的:
攔截 - 線性規劃,更易於編碼,較少的控制。
非阻塞 - 並行編程,更難編碼,更多控制。
阻塞IO意味着一個給定的線程不能做任何事情,直到IO被完全接收(在套接字的情況下,這個等待可能很長時間)。
非阻塞IO表示IO請求立即排隊等待函數返回。實際的IO然後由內核稍後的指針處理。
對於阻塞IO,您需要接受您要等待每個IO請求,或者您將需要爲每個請求啓動一個線程(這會非常快速地變得非常複雜)。
對於非阻塞IO,您可以發送多個請求,但需要注意的是,只有某些「稍後」的點才能使用數據。檢查數據實際到達可能是最複雜的部分。
在99%的應用程序中,您不需要關心IO塊。然而,有時您需要額外的性能來允許自己發起IO請求,然後在返回之前執行其他操作,並希望找到IO請求已完成。
無論如何,只是我的調皮。
我還沒有找到好的文章。
我在這裏問如何異步IO代碼奠定了建議:tidy code for asynchronous IO
的答案其實並不十分溫暖。
異步IO是一個讓你頭腦發熱和調試的野獸,尤其是當你使用邊緣觸發器(例如Linux的EPOLLET標誌)。但是,您在代碼複雜性方面付出的代價就是性能和可伸縮性。
如果IO塊阻塞,表單應用程序幾乎100%的時間關心。用戶不喜歡掛起的GUI。 – 2009-08-06 21:15:36
沒有什麼能阻止你運行一個獨立的線程來連續執行所有的IO並阻塞... – Goz 2009-08-06 21:17:04