Java IO模型總結

BIO、AIO、NIO的區別:

  1. 什麼是同步?
    指的是用戶進程觸發IO操作等待並輪詢的去查看IO操作是否就緒。
  2. 什麼是異步?
    異步指的是用戶進程觸發IO操作後便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知(異步的特點就是通知)。
  3. 什麼是阻塞?
    所謂阻塞方式的意思是指, 當試圖對該文件描述符進行讀寫時, 如果當時沒有東西可讀,或者暫時不可寫, 程序就進入等待 狀態, 直到有東西可讀或者可寫爲止。
  4. 什麼是非阻塞?
    非阻塞狀態下, 如果沒有東西可讀, 或者不可寫, 讀寫函數馬上返回, 而不會等待。
  5. 同步阻塞IO(BIO)
    同步並阻塞,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
  6. 同步非阻塞IO(NIO)
    同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啓動一個線程進行處理。用戶進程也需要時不時的詢問IO操作是否就緒,這就要求用戶進程不停的去詢問。
  7. 異步阻塞IO(NIO)
    此種方式下是指應用發起一個IO操作以後,不等待內核IO操作的完成,等內核完成IO操作以後會通知應用程序,這其實就是同步和異步最關鍵的區別,同步必須等待或者主動的去詢問IO是否完成,那麼爲什麼說是阻塞的呢?因爲此時是通過select系統調用來完成的,而select函數本身的實現方式是阻塞的,而採用select函數有個好處就是它可以同時監聽多個文件句柄(如果從UNP的角度看,select屬於同步操作。因爲select之後,進程還需要讀寫數據),從而提高系統的併發性!
  8. 異步非阻塞IO(AIO)
    在此種模式下,用戶進程只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程序會得到IO操作完成的通知,此時用戶進程只需要對數據進行處理就好了,不需要進行實際的IO讀寫操作,因爲真正的IO讀取或者寫入操作已經由內核完成了。
BIO、NIO、AIO適用場景分析
  1. BIO方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。
  2. NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。
  3. AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,JDK7開始支持。

上面概念是從網上找來的,下面進行一些總結,部分總結是複製過來的,因爲寫的實在太好了,

IO操作可以拆分爲兩個步驟:IO讀寫請求,IO讀寫操作。

阻塞和非阻塞的區別在於第一步IO讀寫請求,發起IO讀寫請求是否會被阻塞,如果阻塞直到完成那麼就是傳統的阻塞IO,如果不阻塞,那麼就是非阻塞IO。

同步和異步是針對應用程序和內核的交互而言的,同步指的是用戶進程觸發IO操作並等待或者輪詢的去查看IO操作是否就緒,而異步是指用戶進程觸發IO操作以後便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知。而阻塞和非阻塞是針對於進程在訪問數據的時候,根據IO操作的就緒狀態來採取的不同方式,說白了是一種讀取或者寫入操作函數的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章