標籤:
同步指的是使用者進程觸發IO操作並等待或者輪詢的去查看IO操作是否就緒
非同步是指使用者進程觸發IO操作以後便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知
阻塞和非阻塞是針對於進程在訪問資料的時候,根據IO操作的就緒狀態來採取的不同方式,說白了是一種讀取或者寫入操作函數的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。
,IO操作可以分為3類:
同步阻塞的BIO、同步非阻塞的NIO、非同步非阻塞的AIO
同步阻塞IO(JAVA BIO):
同步並阻塞,伺服器實現模式為一個串連一個線程,即用戶端有串連請求時伺服器端就需要啟動一個線程進行處理,如果這個串連不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
同步非阻塞IO(Java NIO) : 同步非阻塞,伺服器實現模式為一個請求一個線程,即用戶端發送的串連請求都會註冊到多工器上,多工器輪詢到串連有I/O請求時才啟動一個線程進行處理。使用者進程也需要時不時的詢問IO操作是否就緒,這就要求使用者進程不停的去詢問。
(Java AIO(NIO.2))非同步非阻塞IO:
在此種模式下,使用者進程只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程式會得到IO操作完成的通知,此時使用者進程只需要對資料進行處理就好了,不需要進行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經由核心完成了。
BIO是一個串連一個線程。
NIO是一個請求一個線程。
AIO是一個有效請求一個線程。
BIO、NIO、AIO適用情境分析:
BIO方式適用於串連數目比較小且固定的架構,這種方式對伺服器資源要求比較高,並發局限於應用中,JDK1.4以前的唯一選擇,但程式直觀簡單易理解。
NIO方式適用於串連數目多且串連比較短(輕操作)的架構,比如聊天伺服器,並發局限於應用中,編程比較複雜,JDK1.4開始支援。
AIO方式使用於串連數目多且串連比較長(重操作)的架構,比如相簿伺服器,充分調用OS參與並行作業,編程比較複雜,JDK7開始支援
BIO,NIO,AIO