国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

阻塞非阻塞IO(BIO和NIO),IO多路復(fù)用

這篇具有很好參考價(jià)值的文章主要介紹了阻塞非阻塞IO(BIO和NIO),IO多路復(fù)用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.概念

NIO(New Input/Output)和BIO(Blocking Input/Output)是Java中用于處理輸入輸出的兩種不同的模型。

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-698757.html

阻塞非阻塞IO(BIO和NIO),IO多路復(fù)用,原理,IO,面試,八股文,Java

BIO 會(huì)阻塞,等有了消息,立刻返回,一個(gè)線程處理一個(gè)recv(需要很多線程)。

NIO 有沒(méi)有消息,都返回(但程序要自己判斷,返回空就循環(huán)重復(fù));一個(gè)線程可以處理多個(gè)recv(好處:不用很多線程;壞處:線程空轉(zhuǎn),cpu浪費(fèi)嚴(yán)重)。

?

阻塞非阻塞IO(BIO和NIO),IO多路復(fù)用,原理,IO,面試,八股文,Java

Java中新的NIO包可以通過(guò)上述形式設(shè)置是否開啟阻塞,從而設(shè)置NIO或BIO,兩者都支持;

?

IO多路復(fù)用

IO多路復(fù)用(IO Multiplexing)是一種通過(guò)單線程處理多個(gè)I/O操作的機(jī)制。它允許一個(gè)進(jìn)程同時(shí)監(jiān)聽多個(gè)文件描述符(如Socket),并在有數(shù)據(jù)可讀或可寫時(shí)進(jìn)行相應(yīng)的處理,從而提高系統(tǒng)的并發(fā)性能。

在傳統(tǒng)的阻塞I/O模型中,每個(gè)I/O操作都需要一個(gè)獨(dú)立的線程來(lái)處理,當(dāng)并發(fā)量增加時(shí),線程數(shù)量會(huì)急劇增加,導(dǎo)致系統(tǒng)資源消耗過(guò)大。而使用IO多路復(fù)用,只需要一個(gè)線程就可以同時(shí)處理多個(gè)I/O操作,大大減少了線程的數(shù)量和系統(tǒng)開銷。

常見的IO多路復(fù)用機(jī)制包括:

  1. select:select是Unix系統(tǒng)最早引入的IO多路復(fù)用機(jī)制。它通過(guò)select函數(shù)來(lái)監(jiān)聽多個(gè)文件描述符,當(dāng)其中任意一個(gè)文件描述符準(zhǔn)備就緒時(shí),select函數(shù)會(huì)返回,然后可以通過(guò)遍歷文件描述符集合來(lái)確定哪些文件描述符可讀或可寫。

  2. poll:poll是select的一種改進(jìn)版本。它使用一個(gè)pollfd結(jié)構(gòu)體數(shù)組來(lái)管理文件描述符,并通過(guò)poll函數(shù)來(lái)監(jiān)聽多個(gè)文件描述符的狀態(tài)。與select相比,poll沒(méi)有最大文件描述符數(shù)量的限制。

  3. epoll:epoll是Linux系統(tǒng)引入的一種高效的IO多路復(fù)用機(jī)制。它使用一個(gè)事件表來(lái)管理文件描述符,并通過(guò)epoll_ctl函數(shù)來(lái)注冊(cè)和刪除事件,通過(guò)epoll_wait函數(shù)來(lái)等待事件的發(fā)生。epoll提供了三種工作模式:邊沿觸發(fā)(EPOLLET)、水平觸發(fā)(EPOLLIN、EPOLLOUT)和一次性觸發(fā)(EPOLLONESHOT),可以根據(jù)具體需求選擇適合的模式。(epoll可以理解為多了個(gè)記事本,)

IO多路復(fù)用適用于處理大量的并發(fā)連接,如服務(wù)器端的網(wǎng)絡(luò)編程。它可以有效地減少線程的數(shù)量,提高系統(tǒng)的并發(fā)性能和資源利用率。

可以說(shuō):

select內(nèi)核無(wú)狀態(tài),每次從零開始

eqoll內(nèi)核維護(hù)一個(gè)狀態(tài),可以異步做很多事情,調(diào)用的時(shí)候能夠立刻給出結(jié)果集

額外拓展

1.epoll機(jī)制詳解

epoll是Linux系統(tǒng)引入的一種高效的IO多路復(fù)用機(jī)制,它提供了一種事件驅(qū)動(dòng)的方式來(lái)處理多個(gè)文件描述符的I/O操作。相比于傳統(tǒng)的select和poll機(jī)制,epoll在處理大量并發(fā)連接時(shí)具有更高的性能。

epoll的核心概念包括以下幾個(gè)部分:

  1. epoll實(shí)例(epoll instance):epoll實(shí)例是一個(gè)內(nèi)核數(shù)據(jù)結(jié)構(gòu),用于管理文件描述符和事件。通過(guò)epoll_create函數(shù)來(lái)創(chuàng)建一個(gè)epoll實(shí)例。

  2. 文件描述符(file descriptor):文件描述符是操作系統(tǒng)對(duì)文件或I/O設(shè)備的引用。在epoll中,需要將需要監(jiān)聽的文件描述符添加到epoll實(shí)例中。

  3. 事件(event):事件是對(duì)文件描述符的一種狀態(tài)變化的表示,如可讀、可寫等。在epoll中,通過(guò)epoll_event結(jié)構(gòu)體來(lái)表示事件。

  4. 事件表(event table):事件表是epoll實(shí)例中用來(lái)存儲(chǔ)事件的數(shù)據(jù)結(jié)構(gòu),可以通過(guò)epoll_ctl函數(shù)來(lái)注冊(cè)和刪除事件。

epoll的工作流程如下:

  1. 創(chuàng)建epoll實(shí)例:通過(guò)epoll_create函數(shù)創(chuàng)建一個(gè)epoll實(shí)例,并返回一個(gè)文件描述符,用于后續(xù)的操作。

  2. 添加文件描述符:通過(guò)epoll_ctl函數(shù)將需要監(jiān)聽的文件描述符添加到epoll實(shí)例中,并指定需要監(jiān)聽的事件類型。

  3. 等待事件:通過(guò)epoll_wait函數(shù)等待事件的發(fā)生。當(dāng)有文件描述符的事件發(fā)生時(shí),epoll_wait函數(shù)會(huì)返回,并將事件信息填充到一個(gè)epoll_event數(shù)組中。

  4. 處理事件:遍歷epoll_event數(shù)組,根據(jù)事件類型進(jìn)行相應(yīng)的處理。

  5. 循環(huán)操作:重復(fù)執(zhí)行等待事件和處理事件的過(guò)程,實(shí)現(xiàn)持續(xù)的事件驅(qū)動(dòng)。

epoll提供了三種工作模式:

  1. 邊沿觸發(fā)(EPOLLET):只有在文件描述符狀態(tài)發(fā)生變化時(shí)才觸發(fā)事件,適用于高效處理大量的并發(fā)連接。

  2. 水平觸發(fā)(EPOLLIN、EPOLLOUT):只要文件描述符處于可讀或可寫狀態(tài),就會(huì)觸發(fā)事件,適用于普通的網(wǎng)絡(luò)編程。

  3. 一次性觸發(fā)(EPOLLONESHOT):只觸發(fā)一次事件,需要在處理完事件后重新注冊(cè)。

epoll的優(yōu)勢(shì)在于可以處理大量的并發(fā)連接,具有更高的性能和資源利用率。它避免了傳統(tǒng)select和poll機(jī)制中遍歷文件描述符集合的開銷,同時(shí)提供了更靈活的事件觸發(fā)方式。因此,epoll被廣泛應(yīng)用于高性能的網(wǎng)絡(luò)服務(wù)器編程。

2.BIO什么時(shí)候會(huì)阻塞?

BIO(Blocking I/O,阻塞I/O)是一種同步的I/O模型,在進(jìn)行I/O操作時(shí)會(huì)阻塞當(dāng)前線程,直到操作完成或出現(xiàn)錯(cuò)誤。以下情況下,BIO會(huì)發(fā)生阻塞:

  1. 讀取阻塞:當(dāng)從輸入流(如Socket的InputStream)讀取數(shù)據(jù)時(shí),如果沒(méi)有可讀取的數(shù)據(jù),讀取操作將會(huì)阻塞,直到有數(shù)據(jù)可讀或者發(fā)生超時(shí)或錯(cuò)誤。

  2. 寫入阻塞:當(dāng)向輸出流(如Socket的OutputStream)寫入數(shù)據(jù)時(shí),如果輸出緩沖區(qū)已滿,寫入操作將會(huì)阻塞,直到有空間可寫或者發(fā)生超時(shí)或錯(cuò)誤。

  3. 連接阻塞:在使用ServerSocket等待客戶端連接時(shí),accept()方法會(huì)阻塞當(dāng)前線程,直到有客戶端連接成功或發(fā)生超時(shí)或錯(cuò)誤。

BIO的阻塞特性意味著在進(jìn)行I/O操作時(shí),線程會(huì)一直等待,不能處理其他任務(wù)。這可能導(dǎo)致資源浪費(fèi)和性能下降。因此,對(duì)于高并發(fā)的網(wǎng)絡(luò)應(yīng)用,通常使用NIO(Non-blocking I/O,非阻塞I/O)或AIO(Asynchronous I/O,異步I/O)模型來(lái)避免阻塞。

3.上文提到的緩沖區(qū)(詳解)

概念和作用:緩沖區(qū)(Buffer)是在進(jìn)行I/O操作時(shí)用于臨時(shí)存儲(chǔ)數(shù)據(jù)的一塊內(nèi)存區(qū)域。它提供了一種緩沖數(shù)據(jù)的機(jī)制,可以減少實(shí)際的I/O操作次數(shù),提高數(shù)據(jù)讀寫的效率。

在Java中,緩沖區(qū)是通過(guò)Buffer類的實(shí)例來(lái)表示的。Java NIO(New I/O)庫(kù)提供了一組緩沖區(qū)類,如ByteBuffer、CharBuffer、ShortBuffer等,用于處理不同類型的數(shù)據(jù)。

緩沖區(qū)有以下幾個(gè)重要的屬性

  1. 容量(Capacity):緩沖區(qū)的容量表示它可以存儲(chǔ)的最大數(shù)據(jù)量。一旦創(chuàng)建,緩沖區(qū)的容量就是固定的,不能改變。

  2. 位置(Position):緩沖區(qū)的位置表示當(dāng)前讀寫操作的位置。初始時(shí),位置為0,隨著讀寫操作進(jìn)行,位置會(huì)自動(dòng)更新。

  3. 上界(Limit):緩沖區(qū)的上界表示有效數(shù)據(jù)的末尾位置。讀寫操作不能超過(guò)上界。

  4. 標(biāo)記(Mark):緩沖區(qū)的標(biāo)記是一個(gè)備忘位置,可以通過(guò)mark()方法設(shè)置,并通過(guò)reset()方法恢復(fù)到標(biāo)記位置。

緩沖區(qū)的基本操作包括:

  1. 寫入數(shù)據(jù):通過(guò)put()方法將數(shù)據(jù)寫入緩沖區(qū),同時(shí)位置會(huì)自動(dòng)向后移動(dòng)。

  2. 讀取數(shù)據(jù):通過(guò)get()方法從緩沖區(qū)讀取數(shù)據(jù),同時(shí)位置會(huì)自動(dòng)向后移動(dòng)。

  3. 翻轉(zhuǎn)緩沖區(qū):通過(guò)flip()方法將上界設(shè)置為當(dāng)前位置,位置重置為0,用于將緩沖區(qū)從寫模式切換到讀模式。

  4. 清空緩沖區(qū):通過(guò)clear()方法將位置設(shè)置為0,上界設(shè)置為容量,用于將緩沖區(qū)從讀模式切換到寫模式。

緩沖區(qū)的使用可以提高I/O操作的效率,特別是在處理大量數(shù)據(jù)時(shí)。它可以減少系統(tǒng)的調(diào)用次數(shù),提高數(shù)據(jù)讀寫的速度。

?

到了這里,關(guān)于阻塞非阻塞IO(BIO和NIO),IO多路復(fù)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • BIO到NIO、多路復(fù)用器, 從理論到實(shí)踐, 結(jié)合實(shí)際案例對(duì)比各自效率與特點(diǎn)(下)

    BIO到NIO、多路復(fù)用器, 從理論到實(shí)踐, 結(jié)合實(shí)際案例對(duì)比各自效率與特點(diǎn)(下)

    本篇文章是BIO到NIO、多路復(fù)用器, 從理論到實(shí)踐, 結(jié)合實(shí)際案例對(duì)比各自效率與特點(diǎn)(上)的下一篇, 如果沒(méi)有看的小伙伴, 可以先看下, 不然可能會(huì)不連貫. 多路復(fù)用器是對(duì)于傳統(tǒng)NIO的優(yōu)化, 解決了傳統(tǒng)NIO無(wú)法直接獲取所有所有連接的狀態(tài), 需要挨個(gè)遍歷所有連接查看是否準(zhǔn)備就緒

    2024年02月10日
    瀏覽(49)
  • 面試題:簡(jiǎn)單說(shuō)一下阻塞IO、非阻塞IO、IO復(fù)用的區(qū)別 ?

    面試題:簡(jiǎn)單說(shuō)一下阻塞IO、非阻塞IO、IO復(fù)用的區(qū)別 ?

    在《Unix網(wǎng)絡(luò)編程》一書中提到了五種IO模型,分別是:阻塞IO、非阻塞IO、IO復(fù)用、信號(hào)驅(qū)動(dòng)IO以及異步IO。本篇文章主要介紹IO的基本概念以及阻塞IO、非阻塞IO、IO復(fù)用三種模型,供大家參考學(xué)習(xí)。 計(jì)算機(jī)視角理解IO: 對(duì)于計(jì)算機(jī)而言,任何涉及到計(jì)算機(jī)核心(CPU和內(nèi)存)與其

    2024年01月22日
    瀏覽(22)
  • 高頻面試八股文原理篇(二)hashSet原理相關(guān)

    目錄 HashSet概述 實(shí)現(xiàn)原理 運(yùn)行原理 HashSet中保存的對(duì)象應(yīng)該如何實(shí)現(xiàn) add()/remove()/contains()方法 hashset和 treeset有什么區(qū)別 HashSet實(shí)現(xiàn)Set接口,由哈希表(實(shí)際上是一個(gè)HashMap實(shí)例)支持。它不保證set 的迭代順序;特別是它不保證該順序恒久不變。此類允許使用null元素 基于HashMa

    2024年02月07日
    瀏覽(16)
  • java八股文面試[多線程]——Synchronized的底層實(shí)現(xiàn)原理

    java八股文面試[多線程]——Synchronized的底層實(shí)現(xiàn)原理

    筆試:畫出Synchronized 線程狀態(tài)流轉(zhuǎn) 實(shí)現(xiàn)原理圖 synchronized解決的是多個(gè)線程之間訪問(wèn)資源的同步性,synchronized 翻譯為中文的意思是 同步 ,也稱之為”同步鎖“。 synchronized的作用是保證在 同一時(shí)刻 , 被修飾的代碼塊或方法只會(huì)有一個(gè)線程執(zhí)行,以達(dá)到保證并發(fā)安全的

    2024年02月10日
    瀏覽(25)
  • java八股文面試[多線程]——ThreadLocal底層原理和使用場(chǎng)景

    java八股文面試[多線程]——ThreadLocal底層原理和使用場(chǎng)景

    源碼分析: ThreadLocal中定義了ThreadLocalMap靜態(tài)內(nèi)部類,該內(nèi)部類中又定義了Entry內(nèi)部類。 ThreadLocalMap定了 Entry數(shù)組。 Set方法: Get方法: Thread中定義了兩個(gè)ThreaLocalMap成員變量: Spring使用ThreadLocal解決線程安全問(wèn)題? 我們知道在一般情況下,只有 無(wú)狀態(tài)的Bean 才可以在多線程環(huán)

    2024年02月10日
    瀏覽(24)
  • NIO 非阻塞式IO

    NIO 非阻塞式IO

    Java NIO 基本介紹 Java NIO 全稱 Java non-blocking IO ,是指 JDK 提供的新 API 。從 JDK1.4 開始, Java 提供了一系列改進(jìn)的輸入/輸出的新特性,被統(tǒng)稱為 NIO (即 NewIO ),是同步非阻塞的。 NIO 相關(guān)類都被放在 java.nio 包及子包下,并且對(duì)原 java.io 包中的很多類進(jìn)行改寫。 NIO 有三大核心

    2024年02月13日
    瀏覽(44)
  • IO多路復(fù)用詳解

    IO多路復(fù)用詳解

    在IO多路復(fù)用模型中,引入了一種新的系統(tǒng)調(diào)用,查詢IO的就緒狀態(tài)。在Linux系統(tǒng)中,對(duì)應(yīng)的系統(tǒng)調(diào)用為select/poll/epoll系統(tǒng)調(diào)用。通過(guò)該系統(tǒng)調(diào)用,一個(gè)進(jìn)程可以監(jiān)視多個(gè)文件描述符,一旦某個(gè)描述符就緒(一般是內(nèi)核緩沖區(qū)可讀/可寫),內(nèi)核能夠?qū)⒕途w的狀態(tài)返回給應(yīng)用程序

    2024年02月08日
    瀏覽(20)
  • 說(shuō)說(shuō)IO多路復(fù)用

    說(shuō)說(shuō)IO多路復(fù)用

    IO多路復(fù)用 I/O multiplexing 這里面的 multiplexing 指的其實(shí)是在單個(gè)線程通過(guò)記錄跟蹤每一個(gè)Sock(I/O流)的狀態(tài)(對(duì)應(yīng)空管塔里面的Fight progress strip槽)來(lái)同時(shí)管理多個(gè)I/O流。直白點(diǎn)說(shuō):多路指的是多個(gè)socket連接,復(fù)用指的是復(fù)用一個(gè)線程進(jìn)行管理。發(fā)明它的原因,是盡量多的提高服務(wù)

    2024年02月09日
    瀏覽(24)
  • IO多路復(fù)用練習(xí)

    一、通過(guò)select搭建TCP服務(wù)器 二、通過(guò)select搭建TCP客戶端 三、通過(guò)poll搭建客戶端

    2024年02月12日
    瀏覽(27)
  • 【網(wǎng)絡(luò)編程】IO多路復(fù)用

    【網(wǎng)絡(luò)編程】IO多路復(fù)用

    ????????IO多路復(fù)用是一種高效的I/O處理方式,它 允許單個(gè)進(jìn)程能夠同時(shí)監(jiān)視多個(gè)文件描述符 (sockets、文件等),并在其中任何一個(gè)文件描述符準(zhǔn)備好進(jìn)行I/O操作時(shí)進(jìn)行處理。它的核心在于 使用少量的線程或進(jìn)程來(lái)管理多個(gè)I/O操作,以提高系統(tǒng)的性能和響應(yīng)速度 。 1.

    2024年02月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包