<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          BIO、NIO、AIO 區(qū)別和應用場景

          共 2797字,需瀏覽 6分鐘

           ·

          2020-08-10 21:24

          點擊上方“ java1234?”,選擇“標星公眾號

          優(yōu)質文章,第一時間送達


          66套java從入門到精通實戰(zhàn)課程分享

          簡單回顧

          對于IO我們應該非常熟悉了,IO不僅僅針對文件的操作,網(wǎng)絡編程socket的通信,就是IO操作。

          輸入、輸出流(InputStream、OutputStream)用于讀取或寫入字節(jié),如操作圖片、視頻等。

          Reader和Writer 則用于操作字符,增加了字符編碼功能。本質上計算機操作都是字節(jié),不管是網(wǎng)絡或者文件,Reader和Writer等于構建了應用邏輯和原始數(shù)據(jù)的另一層通道。

          BufferedOutputStream、BufferedInputStream等帶有緩沖區(qū)的實現(xiàn),可以避免頻繁的磁盤操作,通過設計緩沖區(qū)將批量數(shù)據(jù)進行一次操作。

          NIO

          ?能解決什么問題?

          ? ? ? 為什么要有NIO,NIO是什么?

          首先看一下BIO,如果有一臺服務器,能承受簡單的客戶端請求,那么使用io和net中的同步、阻塞式API應該是可以實現(xiàn)了。但是為了一個用戶的請求而單獨啟動一個線程,開銷應該不小吧。java語言對線程的實現(xiàn)是比較重量的,啟動或銷毀線程,都會有明顯開銷,每個線程都有單獨的線程棧占用明顯的內存。引入線程池,就能很大程度的避免不必要的開銷。

          這種情況適合連接數(shù)并不多,只有最多幾百個連接的普通應用,能比較好的進行工作,但如果連接數(shù)量劇增,這種實現(xiàn)方式就無法很好的工作了,對于并發(fā)量要求較高的企業(yè),這種方案,肯定是不可取的。

          NIO采用的是一種多路復用的機制,利用單線程輪詢事件,高效定位就緒的Channel來決定做什么,只是Select階段是阻塞式的,能有效避免大量連接數(shù)時,頻繁線程的切換帶來的性能或各種問題。

          ?

          上圖隨便畫的,只是方便理解,并不能作為實現(xiàn)的具體的參考。

          首先,Requester方通過Selector.open()創(chuàng)建了一個Selector準備好了調度角色。

          創(chuàng)建了SocketChannel(ServerSocketChannel) 并注冊到Selector中,通過設置key(SelectionKey)告訴調度者所應該關注的連接請求。

          阻塞,Selector阻塞在select操作中,如果發(fā)現(xiàn)有Channel發(fā)生連接請求,就會喚醒處理請求。

          NIO同步非阻塞式IO

          ? ? ? 對比BIO的同步阻塞IO操作,實際上NIO是同步非阻塞IO,一個線程在同步的進行輪詢檢查,Selector不斷輪詢注冊在其上的Channel,某個Channel上面發(fā)生讀寫連接請求,這個Channel就處于就緒狀態(tài),被Selector輪詢出來,然后通過SelectionKey可以獲取就緒Channel的集合,進行后續(xù)的I/O操作。

          ? ? ? ?同步和異步說的是消息的通知機制,這個線程仍然要定時的讀取stream,判斷數(shù)據(jù)有沒有準備好,client采用循環(huán)的方式去讀?。ň€程自己去抓去信息),CPU被浪費。

          ? ? ?非阻塞:體現(xiàn)在,這個線程可以去干別的,不需要一直在這等著。Selector可以同時輪詢多個Channel,因為JDK使用了epoll()代替?zhèn)鹘y(tǒng)的select實現(xiàn),沒有最大連接句柄限制。所以只需要一個線程負責Selector的輪詢,就可以接入成千上萬的客戶端。

          AIO

          是在NIO的基礎上引入異步通道的概念,實現(xiàn)異步非阻塞式的IO處理。如下圖(網(wǎng)絡截圖):

          ? ? ? ? AIO不需要通過多路復用器對注冊的通道進行輪詢操作即可實現(xiàn)異步讀寫。什么意思呢?NIO采用輪詢的方式,一直在輪詢的詢問stream中數(shù)據(jù)是否準備就緒,如果準備就緒發(fā)起處理。但是AIO就不需要了,AIO框架在windows下使用windows IOCP技術,在Linux下使用epoll多路復用IO技術模擬異步IO, 即:應用程序向操作系統(tǒng)注冊IO監(jiān)聽,然后繼續(xù)做自己的事情。操作系統(tǒng)發(fā)生IO事件,并且準備好數(shù)據(jù)后,在主動通知應用程序,觸發(fā)相應的函數(shù)(這就是一種以訂閱者模式進行的改造)。由于應用程序不是“輪詢”方式而是訂閱-通知方式,所以不再需要selector輪詢,由channel通道直接到操作系統(tǒng)注冊監(jiān)聽。

          NIO(AIO)中幾個概念

          緩沖區(qū) Buffer

          ?

          NIO基于塊進行數(shù)據(jù)處理,在NIO中所有數(shù)據(jù)的讀取都是通過緩沖Buffer進行處理。

          ? ? ?具體的緩存區(qū)有這些:ByteBuffe、CharBuffer、 ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。他們實現(xiàn)了相同的接口:Buffer。

          通道 Channel

          ? ? ?對數(shù)據(jù)的讀取和寫入要通過Channel通道。通道不同于流的地方就是通道是雙向的,用于讀、寫和同時讀寫操作。底層的操作系統(tǒng)的通道一般都是全雙工的,全雙工的Channel比流能更好的映射底層操作系統(tǒng)的API。

          多路復用器 Selector

          Selector提供選擇已經(jīng)就緒的任務的能力:

          ? ? ? Selector輪詢注冊在其上的Channel,如果某個Channel發(fā)生讀寫請求并且Channel就處于就緒狀態(tài),會被Selector輪詢出來,然后通過SelectionKey可以獲取就緒Channel的集合,進行后續(xù)的I/O操作。(同步)

          ? ? ? 一個Selector可以同時輪詢多個Channel,因為JDK使用了epoll()代替?zhèn)鹘y(tǒng)的select實現(xiàn),所以沒有最大連接句柄1024/2048的限制。所以,只需要一個線程負責Selector的輪詢,就可以接入成千上萬的客戶端。(非阻塞)

          NIO和AIO

          NIO:會等數(shù)據(jù)準備好后,再交由應用進行處理,數(shù)據(jù)的讀取/寫入過程依然在應用線程中完成,只是將等待的時間剝離到單獨的線程中去,節(jié)省了數(shù)據(jù)準備時間,因為多路復用機制,Selector會得到復用,對于那些讀寫過程時間長的,NIO就不太適合。

          AIO:讀完(內核內存拷貝到用戶內存)了系統(tǒng)再通知應用,使用回調函數(shù),進行業(yè)務處理,AIO能夠勝任那些重量級,讀寫過程長的任務。


          版權聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權協(xié)議,轉載請附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/lisha006/article/details/82856906



          粉絲福利:108本java從入門到大神精選電子書領取

          ???

          ?長按上方二維碼?2 秒
          回復「1234」即可獲取資料以及
          可以進入java1234官方微信群



          感謝點贊支持下哈?

          瀏覽 102
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成人黄色网 | 欧美 日韩 中文 | 在线色导航网站 | 天天干天天想天天日天天日 天天 | 国产一区二区天堂 |