????? 在網上看到一篇對這四個概念比較清晰的分析的文章:http://blog.csdn.net/historyasamirror/article/details/5778378。結合自己一直在學習Java NIO方面的知識,對著四個概念做一些總結。
?
java異步結果不阻塞,????? 數據在操作系統中的簡單流動過程:
????? 首先進程地址空間分為用戶空間和內核空間。用戶空間調用IO方法,如read(),它會陷入內核空間,有內核負責將數據從磁盤或者其它IO設備上讀入內核,再由內核將數據拷貝到用戶空間。
?
同步和異步的針對什么來說的。????? 應用程序所在的用戶進程(或線程)是否被阻塞,這是區分同步和異步的關鍵。所以,阻塞IO、非阻塞IO和多路復用IO都屬于同步IO。
????? 下面一一進行說明:
????? 阻塞IO:應用程序在用戶空間調用read(),一直等到內核準備好數據(此過程有內核線程完成,所以經過了上下文切換),將數據拷貝到用戶空間的緩沖區中。這個時候用戶線程是阻塞掛起的,它不會消耗CUP,但是它阻塞了改用戶線程改read()操作之后的所有動作。
同步與阻塞。????? 非阻塞IO:應用程序調用read(),read通過系統調用后直接返回,根據返回結果判斷是否需要繼續調用read(),這其實就是一個不斷輪詢(輪詢內核數據是否已經準備好)的過程。直到read()返回一個滿意的結果。在這個返回滿意結果的這一次調用過程中,數據從內核空間拷貝到用戶空間的緩沖區,這個過程是阻塞的。
????? 多路復用IO:通常使用selector監視多個網絡端口,本身select是阻塞的,阻塞用戶進行直到內核檢查到有網絡端口已經準備好,然后對每一個準備好的端口進行IO操作,這個IO操作過程也是阻塞的。
?
同步和異步的理解。????? 異步IO:應用程序IO操作直接返回,內核獲取數據后,將數據從內核空間拷貝到用戶空間,然后通知應用程序。應用程序收到信號后處理相關數據,處理方式可以采用回調方法的辦法。