JAVA NIO是同步非阻塞I/O的理解與NIO多路復用器Selector


本文鏈接:https://blog.csdn.net/qq_36118769/article/details/85293865

一般來說,服務器端的I/O主要有兩種情況:
一是來自網絡的I/O;
二是對文件(設備)的I/O。
首先一個IO操作其實分成了兩個步驟:發起IO請求和實際的IO操作,同步IO和異步IO的區別就在於第二個步驟是否阻塞,如果實際的IO讀寫阻塞請求進程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO復用、信號驅動IO都是同步IO,如果不阻塞,而是操作系統幫你做完IO操作再將結果返回給你,那么就是異步IO。

    阻塞IO和非阻塞IO的區別在於第一步,發起IO請求是否會被阻塞,如果阻塞直到完成那么就是傳統的阻塞IO,如果不阻塞,那么就是非阻塞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里面有沒有數據!

二、 Selector不是異步的。因為它對IO的讀寫還是同步阻塞的。

    selector簡稱多路復用器,它是JAVA
    NIO編程的基礎簡單來講,selector會不斷輪詢注冊在其上的channel,如果某個channel上面發生了讀或者寫事件,這個channel就會處於就緒狀態,會被selector輪詢出來,然后通過selectorKey可以獲取就緒channel的集合,進行后續的io操作。

三、
一般來說 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 模型。

參考:https://www.zhihu.com/question/27991975
————————————————
版權聲明:本文為CSDN博主「一念無期」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36118769/article/details/85293865


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM