天天看點

話說IO模型中的同步異步和阻塞非阻塞

JAVA NIO是同步非阻塞io。同步和異步說的是消息的通知機制,阻塞非阻塞說的是線程的狀态 。

下面說說我的了解,client和伺服器建立了socket連接配接:

1、同步阻塞io:client在調用read()方法時,stream裡沒有資料可讀,線程停止向下執行,直至stream有資料。

阻塞:展現在這個線程不能幹别的了,隻能在這裡等着

同步:是展現在消息通知機制上的,即stream有沒有資料是需要我自己來判斷的。

2、同步非阻塞io:調用read方法後,如果stream沒有資料,方法就傳回,然後這個線程就就幹别的去了。

非阻塞:展現在,這個線程可以去幹别的,不需要一直在這等着

同步:展現在消息通知機制,這個線程仍然要定時的讀取stream,判斷資料有沒有準備好,client采用循環的方式去讀取,可以看出CPU大部分被浪費了

3、異步非阻塞io:服務端調用read()方法,若stream中無資料則傳回,程式繼續向下執行。當stream中有資料時,作業系統會負責把資料拷貝到使用者空間,然後通知這個線程,這裡的消息通知機制就是異步!而不是像NIO那樣,自己起一個線程去監控stream裡面有沒有資料!

這是我的了解,不确定對不對

一般來說 I/O 模型可以分為:同步阻塞,同步非阻塞,異步阻塞,異步非阻塞 四種IO模型

同步阻塞 IO :

在此種方式下,使用者程序在發起一個 IO 操作以後,必須等待 IO 操作的完成,隻有當真正完成了 IO 操作以後,使用者程序才能運作。 JAVA傳統的 IO 模型屬于此種方式!

同步非阻塞 IO:

在此種方式下,使用者程序發起一個 IO 操作以後 邊可 傳回做其它事情,但是使用者程序需要時不時的詢問 IO 操作是否就緒,這就要求使用者程序不停的去詢問,進而引入不必要的 CPU 資源浪費。其中目前 JAVA 的 NIO 就屬于同步非阻塞 IO 。

異步阻塞 IO :

此種方式下是指應用發起一個 IO 操作以後,不等待核心 IO 操作的完成,等核心完成 IO 操作以後會通知應用程式,這其實就是同步和異步最關鍵的差別,同步必須等待或者主動的去詢問 IO 是否完成,那麼為什麼說是阻塞的呢?因為此時是通過 select 系統調用來完成的,而 select 函數本身的實作方式是阻塞的,而采用 select 函數有個好處就是它可以同時監聽多個檔案句柄,進而提高系統的并發性!

異步非阻塞 IO:

在此種模式下,使用者程序隻需要發起一個 IO 操作然後立即傳回,等 IO 操作真正的完成以後,應用程式會得到 IO 操作完成的通知,此時使用者程序隻需要對資料進行處理就好了,不需要進行實際的 IO 讀寫操作,因為 真正的 IO讀取或者寫入操作已經由 核心完成了。目前 Java 中還沒有支援此種 IO 模型。

繼續閱讀