互聯(lián)網(wǎng)中I/O流當(dāng)中你所不知的概念,看完這篇將不再模糊

兩組概念

I/O模型

理解NIO

兩組概念
一、阻塞與非阻塞
阻塞與非阻塞是描述進(jìn)程在訪問某個資源時,數(shù)據(jù)是否準(zhǔn)備就緒的的一種處理方式。當(dāng)數(shù)據(jù)沒有準(zhǔn)備就緒時:
阻塞:線程持續(xù)等待資源中數(shù)據(jù)準(zhǔn)備完成,直到返回響應(yīng)結(jié)果。
非阻塞:線程直接返回結(jié)果,不會持續(xù)等待資源準(zhǔn)備數(shù)據(jù)結(jié)束后才響應(yīng)結(jié)果。
二、同步與異步
同步與異步是指訪問數(shù)據(jù)的機(jī)制,同步-般指主動請求并等待IO操作完成的方式。異步則指主動請求數(shù)據(jù)后便可以繼續(xù)處理其它任務(wù),隨后等待IO操作完畢的通知。
同步與異步針對的是應(yīng)用程序,關(guān)注程序之間的協(xié)作狀態(tài);

  • 同步請求一定有一個結(jié)果;
  • 異步是不需要等待你的結(jié)果。
    阻塞與非阻塞關(guān)注的是單個進(jìn)程執(zhí)行狀態(tài);
  • 不管你這個結(jié)果是否準(zhǔn)備好,如果準(zhǔn)備好這個結(jié)果才返回阻塞
  • 不管你這個結(jié)果是否準(zhǔn)備好,先給我一個結(jié)果非阻塞
  • 理解用戶空間(用戶態(tài))與內(nèi)核空間(內(nèi)核態(tài))之間的數(shù)據(jù)傳遞過程。



    異步IO模型

I/O模型

◆傳統(tǒng)BIO模型
◆偽異步IO模型
◆NIO模型
傳統(tǒng)BIO模型

  • 傳統(tǒng)BI0是一種同步的阻塞IO, IO在進(jìn)行讀寫時,該線程將被阻塞,線程無法進(jìn)行其它操作。
  • 服務(wù)端接收到客戶端的請求后,為每個客戶端新創(chuàng)建一個線程。
  • 在高性能服務(wù)器應(yīng)用領(lǐng)域,往往需要面對成干上萬個客戶端的并發(fā)鏈接,這種模型顯然無法滿足高性能、高并發(fā)的場景。

    BIO服務(wù)端通信模型,由一個獨(dú)立的Acceptor線程負(fù)責(zé)監(jiān)聽客戶端的連接,
    Acceptor接收到客戶端連接請求之后,為每個客戶端建立一個新的線程進(jìn)行鏈路處理。
    處理完成之后,通過輸出流返回應(yīng)答給客戶端,線程銷毀。
    阻塞IO模型

    BIO模型存在的問題:
    √ 性能問題:一連接一線程模型導(dǎo)致服務(wù)端的并發(fā)接入數(shù)和系統(tǒng)吞吐受到極大限制;
    √ 可靠性問題:由于IO操作采用同步阻塞模式,當(dāng)網(wǎng)絡(luò)擁堵或者通信對端處理緩慢會導(dǎo)致IO線程被阻塞,且阻塞時間無法預(yù)測;
    √ 可維護(hù)性問題: 10線程數(shù)無法有效控制、資源無法有效共享(多線程并發(fā)問題),系統(tǒng)可維護(hù)性差。
    偽異步IO模型
    以傳統(tǒng)BIO模型為基礎(chǔ),通過線程池的方式維護(hù)所有的I0線程管理。
    當(dāng)有新的客戶端連接時,將客戶端的Socket封裝為一個Task, 投遞到一個線程池中進(jìn)行處理。

    但是底層實(shí)際還是采用同步阻塞IO模型,因此無法從根本上解決問題。
    偽異步IO于某些客戶端應(yīng)答時間過長引起一些事故:
    1、服務(wù)端處理緩慢,返回應(yīng)答消息耗費(fèi)60s,平常只需要10ms;
    2、采用偽異步IO的線程正在讀取故障服務(wù)節(jié)點(diǎn)的響應(yīng),由于讀取輸入流是阻塞的,它將會被同步阻塞60s;
    3、如果所有的可用線程都被服務(wù)器阻塞,后續(xù)所有的IO消息都將在隊(duì)列中排隊(duì);
    4、由于線程池采用阻塞隊(duì)列實(shí)現(xiàn),當(dāng)隊(duì)列積滿之后,后續(xù)入隊(duì)列的操作將被阻塞;
    5、由于前端只有一個Accptor線程接收客戶端接入,它被阻塞在線程池的同步阻塞隊(duì)列之后,新的客戶端請求消息將被拒絕,客戶端會發(fā)生大量的鏈接超時。
    6、由于幾乎所有的連接都超時,調(diào)用者會認(rèn)為系統(tǒng)已經(jīng)奔潰,無法接收新的請求消息。
    NIO模型
    NIO (JDK1.4) 模型是一種同步非阻塞I0,主要有三大核心部分: Channel(通道),Buffer(緩沖區(qū)),Selector (多路復(fù)用器)。傳統(tǒng)IO基于字節(jié)流和字符流進(jìn)行操作,而NIO基 于Channel和Buffer(緩沖區(qū))進(jìn)行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中。Selector(多路 復(fù)用器)用于監(jiān)聽多個通道的事件(比如:連接打開,數(shù)據(jù)到達(dá))。因此,單個線程可以監(jiān)聽多個數(shù)據(jù)通道。

    NIO的優(yōu)點(diǎn):
  • 客戶端發(fā)起的連接操作是 異步的;
  • SocketChannel的讀寫操作也是異步的;
  • 線程模型的優(yōu)化。


    NIO流程圖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容