java經常使用的IO模型

IO模型網絡

區分
一個輸入操做一般包括兩個階段:
等待數據準備好
從內核向進程複製數據
對於一個套接字上的輸入操做,第一步一般涉及等待網絡數據從網絡到達。當所等待數據到達後,它被複制到內核中的某個緩衝區。第二部就是把數據從內核緩衝區複製到應用進程緩衝區。
同步IO和異步IO的區別就在於第二個步驟是否阻塞,若是實際的IO讀寫阻塞請求過程,那麼就是同步IO,所以阻塞IO、非阻塞IO、IO複用、信號驅動IO都是同步IO,若是不阻塞,而是操做系統幫你作完IO操做再將結果返回給你,那麼就是異步IO。
阻塞IO和非阻塞IO的區別在第一步,發起IO請求是否會被阻塞,若是阻塞直到完成那麼就是傳統的阻塞IO,若是不阻塞,那麼就是非阻塞IO。異步

阻塞式IO
應用進程被阻塞,知道數據複製到應用進程緩衝區才返回。在阻塞過程當中,其餘程序還能夠執行,所以阻塞並不意味着整個操做系統被阻塞。由於其餘程序還能夠運行,所以不消耗CPU時間,這種模型的CPU利用率會比較高。ide

非阻塞IO
應用程序執行系統調用以後,內核返回一個錯誤碼。應用程序還能夠繼續運行,可是須要不斷的執行系統調用來獲知IO是否完成,這種方式成爲輪詢。
因爲CPU要處理更多的系統調用,所以這種模型的CPU利用率比較低。操作系統

IO複用
使用select或者poll等待數據,而且能夠等待多個套接字中的任何一個變爲可讀。這一過程會被阻塞,當某一個套接字可讀時返回,以後使用recvfrom把數據從內核複製到進程中。進程

它可讓但個進程具備處理多個I/O事件的能力,又被稱爲Event Driven IO,即事件驅動IO。事件

信號驅動IO
應用進程使用sigaction系統調用,內核當即被返回,應用進程能夠繼續執行,也就是說等待數據階段應用程序時非阻塞的。內核在數據到達時嚮應用進程發送SIGIO信號,應用進程收到以後在信號處理程序中調用recvfrom將數據從內核中複製到應用進程。
相比於非阻塞IO的輪詢方式,信號驅動I/O的CPU利用率更高。同步

異步IO
應用進程執行aio_read系統調用會當即返回,應用進程能夠繼續執行,不會被阻塞,內核會在全部操做完成以後嚮應用進程發送信號。
異步IO與信號驅動IO的區別在於,異步IO的信號是通知應用進程IO完成,而驅動IO的信號是通知應用程序能夠開始IO。
以上就是常見的五種IO模型介紹,須要圖解或詳細教學的能夠私信或評論聯繫我。it

相關文章
相關標籤/搜索