導航:首頁 > 編程語言 > javanio內存

javanio內存

發布時間:2024-05-08 05:47:23

java Nio讀寫為什麼是雙向

作者:美團技術團隊
鏈接:https://zhuanlan.hu.com/p/23488863
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

NIO(Non-blocking I/O,在Java領域,也稱為New I/O),是一種同步非阻塞的I/O模型,也是I/O多路復用的基礎,已經被越來越多地應用到大型應用伺服器,成為解決高並發與大量連接、I/O處理問題的有效方式。

那麼NIO的本質是什麼樣的呢?它是怎樣與事件模型結合來解放線程、提高系統吞吐的呢?

本文會從傳統的阻塞I/O和線程池模型面臨的問題講起,然後對比幾種常見I/O模型,一步步分析NIO怎麼利用事件模型處理I/O,解決線程池瓶頸處理海量連接,包括利用面向事件的方式編寫服務端/客戶端程序。最後延展到一些高級主題,如Reactor與Proactor模型的對比、Selector的喚醒、Buffer的選擇等。

註:本文的代碼都是偽代碼,主要是為了示意,不可用於生產環境。

傳統BIO模型分析

讓我們先回憶一下傳統的伺服器端同步阻塞I/O處理(也就是BIO,Blocking I/O)的經典編程模型:

{
ExecutorService executor = Excutors.newFixedThreadPollExecutor(100);//線程池

ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(8088);
while(!Thread.currentThread.isInturrupted()){//主線程死循環等待新連接到來
Socket socket = serverSocket.accept();
executor.submit(new ConnectIOnHandler(socket));//為新的連接創建新的線程
}

class ConnectIOnHandler extends Thread{
private Socket socket;
public ConnectIOnHandler(Socket socket){
this.socket = socket;
}
public void run(){
while(!Thread.currentThread.isInturrupted()&&!socket.isClosed()){死循環處理讀寫事件
String someThing = socket.read()....//讀取數據
if(someThing!=null){
......//處理數據
socket.write()....//寫數據
}

}
}
}

這是一個經典的每連接每線程的模型,之所以使用多線程,主要原因在於socket.accept()、socket.read()、socket.write()三個主要函數都是同步阻塞的,當一個連接在處理I/O的時候,系統是阻塞的,如果是單線程的話必然就掛死在那裡;但CPU是被釋放出來的,開啟多線程,就可以讓CPU去處理更多的事情。其實這也是所有使用多線程的本質:

閱讀全文

與javanio內存相關的資料

熱點內容
pdf是撒 瀏覽:485
五格數學演算法 瀏覽:166
伺服器怎麼添加連接 瀏覽:15
排列組合a演算法 瀏覽:981
伺服器迷你號是什麼 瀏覽:776
有什麼免費的雲伺服器地址 瀏覽:575
微信為什麼總是連接伺服器失敗 瀏覽:640
伯里曼手pdf 瀏覽:769
從程序員轉行做機械 瀏覽:532
加密密碼鎖多少錢 瀏覽:608
電腦主機域名和伺服器怎麼綁定 瀏覽:705
python數據單位統一減小 瀏覽:325
ftp伺服器架設linux 瀏覽:316
生成直線演算法中最快的 瀏覽:689
頭頂加密小妙招 瀏覽:60
三星qx2是什麼安卓系統 瀏覽:207
保鮮膜解壓球教學視頻 瀏覽:601
多媒體演算法工程師camera 瀏覽:989
電腦下載的歌可以拉到文件夾嗎 瀏覽:724
千鋒3g學院android 瀏覽:447