日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阻塞IO和非阻塞IO的区别 (BIONIO)

發(fā)布時間:2024/1/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阻塞IO和非阻塞IO的区别 (BIONIO) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

釋義:

BIO:是指blocking IO
NIO:是指noblocking IO(非阻塞io),也可以理解為newio(新io)

理解新io和老io:

司機去問每一個顧客從哪下車(多次阻塞得起線程) 司機去問售票員從哪停車(還是得阻塞,但是不用額外起線程,也不一直等待,去干別的事)
BIO當(dāng)客戶端連接服務(wù)器端時起的線程太多,學(xué)了NIO以后可以用一個線程來處理多個請求

兩者的區(qū)別:

1、數(shù)據(jù)阻塞和非阻塞的區(qū)別
2、數(shù)據(jù)傳輸?shù)姆绞?#xff1a;Bio通過流的方式進行傳輸 ,NIo是通過包(數(shù)據(jù)塊)的方式進行數(shù)據(jù)傳輸
3、BIO讀寫分離 ,NIO即可讀也可以寫

在了解BIO與NIO之前我們先要了解一個概念:什么是流?

流的概念、作用:

概念:流是一組有順序的,有起點和終點的字節(jié)集合,是對數(shù)據(jù)傳輸?shù)目偡Q或抽象,即數(shù)據(jù)在兩設(shè)備間的傳輸稱為流
作用:流的本質(zhì)是數(shù)據(jù)傳輸,根據(jù)數(shù)據(jù)傳輸特性將流抽象為各種類,方便更直觀的進行數(shù)據(jù)操作。

BIO

分類:

  • 根據(jù)處理數(shù)據(jù)類型的不同分為:字符流和字節(jié)流
  • 根據(jù)數(shù)據(jù)流向不同分為:輸入流和輸出流
  • 按照流是否直接與特定的地方(如磁盤、內(nèi)存、設(shè)備等)相連(是否可以直接作用于文件),分為節(jié)點流和處理流兩類。
  • 字符流和字節(jié)流:
    字符流的由來: 因為數(shù)據(jù)編碼的不同,而有了對字符進行高效操作的流對象。本質(zhì)其實就是基于字節(jié)流讀取時,去查了指定的碼表。 字節(jié)流和字符流的區(qū)別:
    1.讀寫單位不同:字節(jié)流以字節(jié)(8bit)為單位,字符流以字符為單位,根據(jù)碼表映射字符,一次可能讀多個字節(jié)。
    2. 處理對象不同:字節(jié)流能處理所有類型的數(shù)據(jù)(如圖片、avi等),而字符流只能處理字符類型的數(shù)據(jù)。
    字節(jié)流:一次讀入或讀出是8位二進制。
    字符流:一次讀入或讀出是一個或者多個字節(jié)。
    設(shè)備上的數(shù)據(jù)無論是圖片或者視頻,文字,它們都以二進制存儲的。二進制的最終都是以一個8位為數(shù)據(jù)單元進行體現(xiàn),所以計算機中的最小數(shù)據(jù)單元就是字節(jié)。意味著,字節(jié)流可以處理設(shè)備上的所有數(shù)據(jù),所以字節(jié)流一樣可以處理字符數(shù)據(jù)。
    結(jié)論:只要是處理純文本數(shù)據(jù),就優(yōu)先考慮使用字符流。 除此之外都使用字節(jié)流。

    輸入流和輸出流:
    輸入流只能進行讀操作,輸出流只能進行寫操作,程序中需要根據(jù)待傳輸數(shù)據(jù)的不同特性而使用不同的流。
    結(jié)論:輸入流:InputStream或者Reader:從文件中讀到程序中;
    輸出流:OutputStream或者Writer:從程序中輸出到文件中;

    節(jié)點流和處理流
    節(jié)點流:直接與數(shù)據(jù)源相連,讀入或讀出。直接使用節(jié)點流,讀寫不方便,為了更快的讀寫文件,才有了處理流。如FileInputStream(“D:/abc.txt”)在讀取文件內(nèi)容的時候,我們直接傳入文件的路徑。
    處理流:在節(jié)點流的基礎(chǔ)上,再套接一層,套接在節(jié)點流上的就是處理流。如new BufferedInputStream(new FileInputStream(file))處理流的構(gòu)造方法總是要帶一個其他的流對象做參數(shù)。
    結(jié)論:直接作用于數(shù)據(jù)源(文件名)的流是節(jié)點流,不直接作用于數(shù)據(jù)源(文件名)的流是處理流

    NIO

    Java NIO 由以下幾個核心部分組成:

    • Channels
    • Buffers
    • Selectors

    Channel :通道,有點像流。但又有些不同:
    既可以從通道中讀取數(shù)據(jù),又可以寫數(shù)據(jù)到通道。但流的讀寫通常是單向的。
    通道可以異步地讀寫。
    通道中的數(shù)據(jù)總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。(buffer.flip():反轉(zhuǎn)Buffer,既可以用來讀也可以用來寫)

    Buffer:緩沖區(qū),數(shù)據(jù)是從通道讀入緩沖區(qū),從緩沖區(qū)寫入到通道中的。
    緩沖區(qū)本質(zhì)上是一塊可以寫入數(shù)據(jù),然后可以從中讀取數(shù)據(jù)的內(nèi)存。這塊內(nèi)存被包裝成NIO Buffer對象,并提供了一組方法,用來方便的訪問該塊內(nèi)存。
    通過flip()方法將Buffer從寫模式切換到讀模式。在讀模式下,可以讀取之前寫入到buffer的所有數(shù)據(jù)。一旦讀完了所有的數(shù)據(jù),就需要清空緩沖區(qū),讓它可以再次被寫入

    Selector:允許單線程處理多個 Channel。
    事實上,可以只用一個線程處理所有的通道。對于操作系統(tǒng)來說,線程之間上下文切換的開銷很大,而且每個線程都要占用系統(tǒng)的一些資源(如內(nèi)存)。因此,使用的線程越少越好。但是,需要記住,現(xiàn)代的操作系統(tǒng)和CPU在多任務(wù)方面表現(xiàn)的越來越好,所以多線程的開銷隨著時間的推移,變得越來越小了。實際上,如果一個CPU有多個內(nèi)核,不使用多任務(wù)可能是在浪費CPU能力。
    為了將Channel和Selector配合使用,必須將channel注冊到selector上。通過SelectableChannel.register()方法來實現(xiàn).
    與Selector一起使用時,Channel必須處于非阻塞模式下。這意味著不能將FileChannel與Selector一起使用,因為FileChannel不能切換到非阻塞模式。而套接字通道都可以。

    注意register()方法的第二個參數(shù)。這是一個“interest集合”,意思是在通過Selector監(jiān)聽Channel時對什么事件感興趣。可以監(jiān)聽四種不同類型的事件:
    Connect
    Accept
    Read
    Write
    通道觸發(fā)了一個事件意思是該事件已經(jīng)就緒。所以,某個channel成功連接到另一個服務(wù)器稱為“連接就緒”。一個server socket channel準備好接收新進入的連接稱為“接收就緒”。一個有數(shù)據(jù)可讀的通道可以說是“讀就緒”。等待寫數(shù)據(jù)的通道可以說是“寫就緒”。
    這四種事件用SelectionKey的四個常量來表示:
    SelectionKey.OP_CONNECT
    SelectionKey.OP_ACCEPT
    SelectionKey.OP_READ
    SelectionKey.OP_WRITE

    如果你對不止一種事件感興趣,那么可以用“位或”操作符將常量連接起來,如下:
    int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

    總結(jié)

    以上是生活随笔為你收集整理的阻塞IO和非阻塞IO的区别 (BIONIO)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。