JAVA基礎知識之網絡編程——-網絡通信模型(IO模型)


《Unix網絡編程:卷1》中介紹了5中I/O模型,JAVA作為運行在宿主機上的程序,底層也遵循這5中I/O模型規則。這5中I/O模型分別是:

  • 阻塞式IO
  • 非阻塞式IO
  • I/O復用
  • 信號驅動式IO
  • 異步IO 

按POSIX標准來分,IO分為同步和異步,上面的前4鍾都屬於同步IO,具體后面解釋。

在介紹IO模型之前,需要先了解應用程序IO的過程,一般來說,一個IO分為兩個階段

應用程序向操作系統發出IO請求:應用程序發出IO請求給操作系統內核,操作系統內核需要等待數據就緒,這里的數據可能來自別的應用程序或者網絡

  1. 等待數據:數據可能來自其他應用程序或者網絡,如果沒有數據,操作系統就一直等待,應用程序就跟着等待。
  2. 拷貝數據:將就緒的數據拷貝到應用程序工作區。

在Unix系統中,操作系統的IO操作是一個系統調用recvfrom(),即一個系統調用recvfrom包含兩步,等待數據就緒和拷貝數據。

阻塞式IO模型

正如上面的IO操作的步驟,當應用程序發起IO請求之后,操作系統就要處理系統調用recvfrom(),在這個過程中,操作系統需要等待數據就緒(數據可能來自別的應用程序的輸入或者網絡),應用程序則不再處理別的事情,而是一直等待(即阻塞狀態)數據就緒,然后操作系統完成IO操作,然后recvfrom()才方法返回,應用程序才繼續執行,這就是阻塞式IO模型。下圖描述了阻塞式IO模型

 

 

非阻塞式IO模型

當應用程序發起了IO請求之后,系統調用recvfrom()被執行,並且立即返回,但是返回的並不是IO處理完成的結果,而是一個特定的錯誤,表示IO數據沒有准備好,因此不需要進行IO操作。應用程序會不停地(即輪詢)執行recvfrom()系統調用,直到數據已經就緒,然后操作系統完成IO操作,recvfrom()返回成功。這個過程中,沒有數據就緒時系統調用recvfrom()是立即返回的,即應用程序並沒有阻塞在底層操作系統的等待數據上面,而是輪詢結果。這個過程可以用下圖表示,

可見阻塞IO與非阻塞IO的關鍵區別在於,系統調用recvfrom是否立即返回。由於輪詢會消耗大量CPU時間,因此這種模式並不常用。

IO復用模型(多路復用)

前面的非阻塞IO將會輪詢一個IO是否可用,而IO復用則是輪詢多個IO是否至少有一個可用。

IO復用的關鍵在於select()函數。在阻塞IO中,應用程序阻塞在一個IO的內核操作上;

但在多路復用中,通過select(),可以同時監聽多個IO請求的內核操作,只要有任意一個IO的內核操作就緒,都可以通知select()返回,再進行系統調用recvfrom()完成IO操作。

這個過程應用程序就可以同時監聽多個IO請求,這比起基於多線程阻塞式IO要先進得多,因為服務器只需要一兩個線程就可以進行多客戶端通信。IO復用可用下圖表示,

信號驅動式IO模型

在unix系統中,應用程序發起IO請求時,可以給IO請求注冊一個信號函數,請求立即返回,操作系統底層則處於等待狀態(等待數據就緒),直到數據就緒,然后通過信號通知主調程序,主調程序才去調用系統函數recvfrom()完成IO操作。

信號驅動也是一種非阻塞式的IO模型,比起上面的非阻塞式IO模型,信號驅動式IO模型不需要輪詢檢查底層IO數據是否就緒,而是被動接收信號,然后再調用recvfrom執行IO操作。

比起多路復用IO模型來說,信號驅動IO模型針對的是一個IO的完成過程, 而多路復用IO模型針對的是多個IO同時進行時候的場景。 信號驅動式IO模型用下圖表示,

 

異步IO模型

異步IO模型的工作機制是,將整個IO操作(包括等待數據就緒,復制數據到應用程序工作空間)全都交給操作系統完成,操作系統完成整個過程之后,再通知應用程序。

異步IO模型跟信號驅動IO模型很相似,但是區別是信號驅動模型是在數據就緒的時候通知應用程序,應用程序再調用系統函數recvfrom進行IO操作。

而異步IO模型則是數據就緒且操作系統已經將數據拷貝進應用程序運行空間之后,操作系統再通知應用程序,這個過程中應用程序不需要阻塞。異步IO可以如下圖表示,

 

 

IO模型對比

可見前面四種IO模型中,應用程序都會在某一環節阻塞(即使是輪詢,也算是一種阻塞),POSIX將這種IO模型稱為同步IO操作,

而異步IO模型,則是全權把IO操作整個過程都交給操作系統,中途無阻塞,POSIX將這種IO模型稱為異步IO操作。  以上所有IO對比如下圖,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM