1. 程式人生 > >AIO,BIO,NIO的區別

AIO,BIO,NIO的區別

accep cte bin acc div int brush 知識 address

看到知乎上一篇回答,解決了疑惑: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的區別