java網絡編程BIO,AIO,NIO

先看看圖,自己畫的:

名詞解釋:

  • 同步

如果事件A需要等待事件B的完成才能完成,這種串行執行機制可以說是同步的,這是一種可靠的任務序列,要麼都成功,要麼都失敗。

  • 異步

如果事件A的執行不需要依賴事件B的完成結果,這種並行的執行機制可以說是異步的。事件A不確定事件B是否真正完成,所以是不可靠的任務序列。

同步異步可以理解爲多個事件的執行方式和執行時機如何,是串行等待還是並行執行。同步中依賴事件等待被依賴事件的完成,然後觸發自身開始執行,異步中依賴事件不需要等待被依賴事件,可以和被依賴事件並行執行,被依賴事件執行完成後,可以通過回調、通知等方式告知依賴事件。

  • 阻塞

對於阻塞,如果一個事件在發起一個調用之後,在調用結果返回之前,該事件會被一直掛起,處於等待狀態。

  • 非阻塞

對於非阻塞,如果一個事件在發起調用以後,無論該調用當前是否得到結果,都會立刻返回,不會阻塞當前事件。

阻塞與非阻塞可以理解爲單個事件在發起其他調用以後,自身的狀態如何,是苦苦等待還是繼續幹自己的事情。非阻塞雖然能提高CPU利用率,但是也帶來了系統線程切換的成本,需要在CPU執行時間和系統切換成本之間好好估量一下。

IO模型

IO模型分爲五種,阻塞IO模型非阻塞IO模型IO複用模型信號驅動IO模型異步IO模型、前4種爲同步IO操作、只有異步IO模型是異步IO操作、請仔細閱讀IO交互便於理解IO模型。

阻塞IO模型

網絡編程中,讀取客戶端的數據需要調用recvfrom。在默認情況下,這個調用會一直阻塞直到數據接收完畢,就是一個同步阻塞的IO方式。

  • 模擬舉例:
老李去火車站買票,排隊三天買到一張退票。 耗費:在車站吃喝拉撒睡 3天,其他事一件沒幹。

非阻塞IO模型

當用戶進程發出read操作時、如果內核中的數據還沒有準備好、那麼它並不會阻塞用戶進程、而是立刻返回一個error、從用戶進程角度講、它發起一個read操作後、並不需要等待、而是馬上就得到了一個結果、用戶進程判斷結果是一個error時、它就知道數據還沒有準備好、於是它可以再次發送read操作、一旦內核中的數據準備好了、並且又再次收到了用戶進程的系統調用、那麼它馬上就將數據拷貝到了用戶內存、然後返回。

非阻塞的接口相比於阻塞型接口的顯著差異在於在被調用之後立即返回,在非阻塞式IO中,用戶進程其實是需要不斷的主動詢問kernel數據準備好了沒有。

模擬舉例:

老李去火車站買票,隔12小時去火車站問有沒有退票,三天後買到一張票。 耗費:往返車站6次,路上6小時,其他時間做了好多事。

IO複用模型

如果一個I/O流進來,我們就開啓一個進程處理這個I/O流。那麼假設現在有一百萬個I/O流進來,那我們就需要開啓一百萬個進程一一對應處理這些I/O流(——這就是傳統意義下的多進程併發處理)。思考一下,一百萬個進程,你的CPU佔有率會多高,這個實現方式及其的不合理。所以人們提出了I/O多路複用這個模型,一個線程,通過記錄I/O流的狀態來同時管理多個I/O,可以提高服務器的吞吐能力

IO複用模型的本質是同步非阻塞I/O,多路複用的優勢並不是單個連接處理的更快,而是在於能處理更多的連接

IO複用是多了一個select函數,select函數有一個參數是文件描述符集合,對這些文件描述符進行循環監聽,當某個文件描述符就緒時,就對這個文件描述符進行處理。

目前支持多路複用的系統調用有selectpollepoll

模擬舉例:

  • select/poll
老李去火車站買票,委託黃牛,然後每隔6小時電話黃牛詢問,黃牛三天內買到票,然後老李去火車站交錢領票。 耗費:打電話
  • epoll
老李去火車站買票,委託黃牛,黃牛買到後即通知老李去領,然後老李去火車站交錢領票。 耗費:無需打電話

信號驅動IO模型

 

信號驅動式IO就是指進程預先告知內核、向內核註冊一個信號處理函數、然後用戶進程返回不阻塞、當內核數據就緒時會發送一個信號給進程、用戶進程便在信號處理函數中調用IO讀取數據、從圖中明白實際IO內核拷貝到用戶進程的過程還是阻塞的、信號驅動式IO並沒有實現真正的異步、因爲通知到進程之後、依然是由進程來完成IO操作。

模擬舉例:

老李去火車站買票,給售票員留下電話,有票後,售票員電話通知老李,然後老李去火車站交錢領票。 耗費:無需打電話

 

異步IO模型

 

當應用程序調用aio_read時,內核一方面去取數據報內容返回,另一方面將程序控制權還給應用進程,應用進程繼續處理其他事情,是一種非阻塞的狀態。

當內核中有數據報就緒時,由內核將數據報拷貝到應用程序中,返回aio_read中定義好的函數處理程序。

模擬舉例

老李去火車站買票,給售票員留下電話,有票後,售票員電話通知老李並快遞送票上門。 耗費:無需打電話

參考資料:https://www.toutiao.com/i6745619105283310094/

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