- 同步與異步
- 同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)
- 所謂同步,就是在發(fā)出一個調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回。但是一旦調(diào)用返回,就得到返回值了。換句話說,就是由調(diào)用者主動等待這個調(diào)用的結(jié)果。
- 而異步則是相反,調(diào)用在發(fā)出之后,這個調(diào)用就直接返回了,所以沒有返回結(jié)果。換句話說,當一個異步過程調(diào)用發(fā)出后,調(diào)用者不會立刻得到結(jié)果。而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個調(diào)用。
- 阻塞與非阻塞
- 阻塞和非阻塞關注的是程序在等待調(diào)用結(jié)果(消息,返回值)時的狀態(tài).
- 阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回。
- 非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會阻塞當前線程。
- 一般來說I/O模型可以分為:同步阻塞,同步非阻塞,異步阻塞,異步非阻塞IO
- 同步阻塞IO:
- 在此種方式下,用戶進程在發(fā)起一個IO操作以后,必須等待IO操作的完成,只有當真正完成了IO操作以后,用戶進程才能運行。JAVA傳統(tǒng)的IO模型屬于此種方式!
- 同步非阻塞IO:
- 在此種方式下,用戶進程發(fā)起一個IO操作以后邊可返回做其它事情,但是用戶進程需要時不時的詢問IO操作是否就緒,這就要求用戶進程不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬于同步非阻塞IO。
- 異步阻塞IO:
- 此種方式下是指應用發(fā)起一個IO操作以后,不等待內(nèi)核IO操作的完成,等內(nèi)核完成IO操作以后會通知應用程序,這其實就是同步和異步最關鍵的區(qū)別,同步必須等待或者主動的去詢問IO是否完成,那么為什么說是阻塞的呢?因為此時(通知)是通過select系統(tǒng)調(diào)用來完成的,而select函數(shù)本身的實現(xiàn)方式是阻塞的,而采用select函數(shù)有個好處就是它可以同時監(jiān)聽多個文件句柄(就緒的沒有就緒的都有監(jiān)聽,epoll是select的替代方式,只監(jiān)聽就緒的文件句柄),從而提高系統(tǒng)的并發(fā)性!
- 異步非阻塞IO:
- 在此種模式下,用戶進程只需要發(fā)起一個IO操作然后立即返回,等IO操作真正的完成以后,應用程序會得到IO操作完成的通知,此時用戶進程只需要對數(shù)據(jù)進行處理就好了,不需要進行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經(jīng)由內(nèi)核完成了。目前Java中還沒有支持此種IO模型。
- 同步阻塞IO:
- 異步事件驅(qū)動
- 如果我們的業(yè)務邏輯處理使用異步事件驅(qū)動(Reactor)的方式,而又需要在本次請求中需要返回請求結(jié)果,此時屬于同步獲取返回值,因此此時我們只能使用阻塞異步或者“并發(fā)”“同步”的方式。
- 如果該次請求不需要同步獲取返回值,此時我們即可使用阻塞異步(Reactor)方式,也可以結(jié)合使用DeferredResult異步結(jié)果返回。
個人介紹:
高廣超 :多年一線互聯(lián)網(wǎng)研發(fā)與架構(gòu)設計經(jīng)驗,擅長設計與落地高可用、高性能互聯(lián)網(wǎng)架構(gòu)。