2013-07-12 33 views
9

對我來說,下面是異步非阻塞I/O最有可能的定義:java的選擇是異步或無阻塞架構

Asynchronous I/O:在異步I/O的應用程序立即返回,操作系統將讓他們知道字節何時可用於處理。

NON-blocking I/O:這裏的應用程序立即返回什麼數據可用和應用程序應該有輪詢機制找出更多的數據準備好。

知道這些定義,如果我們分析Java通道即SocketChannelServerSocketChannelDatagramSocketChannel那麼我們可以發現,這些信道可以被用作阻擋或通過該方法configureBlocking(boolean block)非阻塞模式之後。並假設我們正在使用它們作爲非阻塞模式。所以在這裏談到的問題:

如果我將使用Selector即註冊渠道的selector無論是異步I/O和非阻塞I/O

我覺得這是Java中的異步I/O當且僅當底層操作系統正在通知Java應用程序關於準備選擇通道的信息。否則它是非阻塞I/O,並且selector只是一個機制,可以幫助我們輪詢上述提及的渠道,正如我在定義中提到的那樣。哪個是對的?提前致謝。

編輯:

我已經回答了這個問題的一個部分即類型的I/O,以及如何的java有助於這些功能。

但是,是否所有這些功能都是由java提供的功能是在java層進行模擬還是使用底層OS來實現?假定下層OS具備對這些功能的所有支持。

請參考答案。

回答

12

我想通過做更多的功課來回答我的問題。這篇文章也有助於理解I/O概念w.r.t.底層OS。

  • 這是阻塞I/O:FileInputStreamFileOutputStream甚至讀取或從插槽寫入屬於這一類

  • 這是非阻塞I/O下:這是用來通過插座渠道,如ServerSocketchannelSocketChannelDatagramChannel在Java中

  • 這是多路複用的I/O:在Java中,它被Selector用來處理多個通道,這些通道本質上應該是non-blocking。所以Socket通道可以註冊到SelectorSelector可以通過下層OS的I/O多路複用設備來管理。

  • 現在到了異步I/O。在異步I/O應用程序中立即返回,操作系統會讓他們知道字節何時可用於處理。在java中,它由AsynchronousSocketChannel,AsynchronousServerSocketChannel,AsynchronousFileChannel來促進。

對於這些上述功能Java使用底層OS重。這是顯而易見的,當我正在通過book。在第4章中,作者提到

真正的準備就緒選擇必須由操作系統完成。操作系統執行的最重要功能之一是處理I/O請求,並在數據準備就緒時通知進程。所以只有將這個功能委託給操作系統纔有意義。 Selector類提供了抽象,通過該抽象,Java代碼可以以便攜的方式從底層操作系統請求準備就緒選擇服務。

因此很明顯,Java對這些功能大量使用底層操作系統。

2

如果我將使用選擇器,即註冊通道到選擇器,無論是異步I/O還是非阻塞I/O?

通道正在進行非阻塞I/O。選擇器本身正在做複用 I/O。 Java中的異步I/O通過Futures完成,其他語言通過信號量或回調完成。

但一個問題仍然是所有這些功能通過Java是是否提供模擬在java的層或它使用襯墊OS方便?假定下層OS具備對這些功能的所有支持。

操作系統做到了。應用程序不能,並且Java有資格作爲操作系統的應用程序。