AIO,BIO,NIO的區別
看到知乎上一篇回答,解決了疑惑:https://www.zhihu.com/question/56673416 第三位作者的回答...原諒我沒有登錄知乎,不然一定給他留贊.
很多人的解釋都是扯在一起的,反而讓人覺得暈乎乎的,或者他們自己也沒真正的搞懂....
這個模型的前提是 clint端發請求,,然後分析時就沒clint啥事了,有些人說客戶端阻塞...所有模型中Clint不都是阻塞的麽,這是http協議呀,必須有返回!!主要是針對server進行模型分析.
阻塞和非阻塞區分:請求id的線程是否是阻塞的狀態
同步異步的區分:數據是去內核buffer還是進程buffer去取以及知否通知進程還是進程自己去查詢.(這裏涉及到用戶線程和內核線程的知識.)
結合java
bio 同步阻塞:
ServerSocket serverSocket = new ServerSocket(10101); while (true){ //獲取一個套接字(阻塞) final Socket socket = serverSocket.accept(); //開個線程,處理連接的clint socket...
new }
套用上面的區別,,此時接受客戶端連接的線程(請求線程),一直處於阻塞狀態,等待客戶端連接(阻塞),每個clint 連接後分配一個線程(用戶線程(進程線程))(同步)------>同步阻塞
nio同步非阻塞:
SocketChannel serverChannel = SocketChannel.open(); selector = Selector.open(); serverChannel.socket().bind(new InetSocketAddress(8080)); serverChannel.configureBlocking(false); serverChannel.register(selector, SelectionKey.OP_ACCEPT); Set<SelectionKey> sleSet = selector.selectedKeys(); while (true) { int count = selector.select(); Iterator<SelectionKey> iterator = sleSet.iterator(); while (iterator.hasNext()) { SelectionKey selectionKey= iterator.next(); Buffer buffer=ByteBuffer.allocate(1024); if(selectionKey.isAcceptable()){ ServerSocketChannel socketChannel=(ServerSocketChannel) selectionKey.channel(); //處理邏輯,開線程 }else if(selectionKey.isReadable()){ }else if (selectionKey.isWritable()){ } iterator.remove(); } }
分析; selector.selectedKeys() 一直輪詢著,,如果事件處理很費時間,依舊是阻塞的,,,也需要要開線程去異步處理,保證請求的主線程不被阻塞,達到非阻塞目的,所以它可以被設計成阻塞的,也可以被設計成非阻塞的,,他也是基於進程線程的讀寫,所以屬於同步---->綜上可得到他是同步非阻塞
aio異步非阻塞:
封裝的比較狠,,展示不出效果..基於事件的回調,,future/callback,,,大概的過程是操作系統內核線程處理完,通知進程線程拿到結果,期間進程線程可以做其他的事情,這樣做的好處是充分利用操作系統的並發能力.
///以上內容只為加深下理解...感覺解釋得通
AIO,BIO,NIO的區別