• 同步與非同步
    • 同步和非同步關注的是訊息通訊機制 (synchronous communication/ asynchronous communication)
    • 所謂同步,就是在發出一個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由呼叫者主動等待這個呼叫的結果。
    • 而非同步則是相反,呼叫在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在呼叫發出後,被呼叫者通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。
    • 阻塞與非阻塞
    • 阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.
    • 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
    • 非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。
  • 一般來說I/O模型可以分為:同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞IO
    •  同步阻塞IO: 
      • 在此種方式下,使用者程序在發起一個IO操作以後,必須等待IO操作的完成,只有當真正完成了IO操作以後,使用者程序才能執行。JAVA傳統的IO模型屬於此種方式!
    • 同步非阻塞IO: 
      • 在此種方式下,使用者程序發起一個IO操作以後邊可返回做其它事情,但是使用者程序需要時不時的詢問IO操作是否就緒,這就要求使用者程序不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬於同步非阻塞IO。
    • 非同步阻塞IO:
      • 此種方式下是指應用發起一個IO操作以後,不等待核心IO操作的完成,等核心完成IO操作以後會通知應用程式,這其實就是同步和非同步最關鍵的區別,同步必須等待或者主動的去詢問IO是否完成,那麼為什麼說是阻塞的呢?因為此時(通知)是通過select系統呼叫來完成的,而select函式本身的實現方式是阻塞的,而採用select函式有個好處就是它可以同時監聽多個檔案控制代碼(就緒的沒有就緒的都有監聽,epoll是select的替代方式,只監聽就緒的檔案控制代碼),從而提高系統的併發性!
    • 非同步非阻塞IO:
      • 在此種模式下,使用者程序只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程式會得到IO操作完成的通知,此時使用者程序只需要對資料進行處理就好了,不需要進行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經由核心完成了。目前Java中還沒有支援此種IO模型。
  • 非同步事件驅動
    • 如果我們的業務邏輯處理使用非同步事件驅動(Reactor)的方式,而又需要在本次請求中需要返回請求結果,此時屬於同步獲取返回值,因此此時我們只能使用阻塞非同步或者“併發”“同步”的方式。
    • 如果該次請求不需要同步獲取返回值,此時我們即可使用阻塞非同步(Reactor)方式,也可以結合使用DeferredResult非同步結果返回。

image.png

.