<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 110, comments - 101, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    java NIO的多路復用及reactor模式

    Posted on 2012-10-17 14:27 云云 閱讀(5690) 評論(0)  編輯  收藏

    java nio從1.4版本就出現了,而且依它優異的性能贏得了廣大java開發愛好者的信賴。我很納悶,為啥我到現在才接觸,難道我不是愛好者,難道nio不優秀。經過長達半分鐘的思考,我意識到:時候未到。以前總是寫那些老掉牙的web程序,唉,好不容易翻身啦,現在心里好受多了。因為真不想自己到了30歲,還在說,我會ssh,會ssi,精通javascript,精通數據庫,精通。。。人生苦短,要開拓點不是嗎?列為兄弟姐妹,沒看到外國的和尚已經開始鼓吹“云里霧里”的?沒看到百度進入“框”啦,沒看到oracle的“格”啦。人家的經,隨他念,但是我們的確有好多路要走哦(牢騷怎么這么多呀)。

    現在終于到了我了解nio的時候了,突然發現有很多美妙程序的源碼,不得不爽一把(有邪念者,該打住啦,像我這樣)。

    以下描述,為了說明問題,就提提歷史(類似的東西,網上一搜一大把,但是希望你能在這里止步,知道到底是怎么回事。如果還是不清楚,咱就站內溝通!)。

    在我(剛)看nio的這段時間里,主要接觸了幾個東西,就是關于server和client。java之前的io完全可以勝任,但是效率不高,為何效率不高呢?

    ===============history==start===============

    //TODO:finish the old style of server and socket data transion.

    ServerSocket socket = new ServerSocket(80); 
            while (true) { 
                final Socket connection = socket.accept(); 
                handleRequest(connection); 
            }

    ===============history==end in the future================

    在上面的代碼片段中,我們只能是一個request一個的進行處理。這使得所有的請求都阻塞了。如果我們再改變一下,將handleRequest方法封裝到線程中處理:

    if(connection = null){

    new Thread(new Runnable(){

      public void run(){

          handleRequest(connection);

      }

      public void handleRequest(Socket conn){

       //do actions

      }

    }).start();

    }

    服務器端的資源是有限的,我們這里僅僅是從線程角度來擴展,但是這種處理依然是阻塞的處理方式。首先,僅僅是建立連接(socket),就占用了服務器的線程資源。如果客戶端還沒有發出相應的數據請求,那么服務器就要一直等待他們的數據流過來,然后再進行讀取,如此往復。。。一直都blocking。服務器處在一個高負荷狀態中。

    NIO出來之后,進入改革開放時期,有了這么幾個角色,ServerSocketChannel,SelectionKey,Selector.

    這幾個角色都是做什么用的呢?需要了解一下reactor模式(反應堆模式)。

    作為服務端,如果什么操作都要依賴于客戶端,很多操作都阻塞,如上面的代碼片段所示。reactor模式提供了一種很好的事件處理機制,以分離事件處理對象與事件之間的耦合。如下圖示(詳細請看參考資料(1)):

    說明:

    Acceptor就是我們Server端的主要任務消化者;

    Initiation Dispatcher是事件(Event)的分發者;

    HTTP Handler是具體操作人。

    首先,在Initiation Dispatcher中注冊一個acceptor(1:register Acceptor),這個Acceptor是跟事件綁定的,它僅僅關心某種事件(event)。

    Initiation Dispatcher不斷地循環獲取請求過來的事件(2:handle events),如果發現有對應Acceptor關心的事件(3:connect),通知Acceptor有事件發生(4:new connection)。

    Acceptor針對此事件進行處理,創建了新的HTTP Handler((5:create handler))

    一輪事件獲取和分發完成。

    那么handler是不是就抓住這個connection不放,然后一直苦苦等待數據流的到來呢?

    不是的,它也是將自己和自己關心的事件注冊到Initiation Dispatcher。如果Initiation Dispatcher在handle Events時發現了它關心的事件,那么就會交由它去進行相應處理。如下圖示,在連接完成后,browser提交的get請求,handler的處理過程:

    這里面尤其要注意到,2:read ready,之后才read request,也就是說,handler在dispatcher中注冊了自己關心的事件(READ),然后在寫的時候,也是類似情況。

    以上的過程就實現了非阻塞的處理方式,客戶端的連接可以非阻塞(這是意思是,acceptor不必一直苦苦等候),然后對客戶端過來的request內容,也是非阻塞(這里是不必苦苦等待其數據的到來),都是不必一直眼巴巴的看著那個連接,那些數據,而是如果有我關心的事件了,我再進行處理,期間完全相信Initiation Dispatcher就行了。

    這里有一點要注意,就是現在的reactor模式都是建立在操作系統的基礎上實現的,不同的操作系統有不同的實現方式。而且都不支持多線程(針對Initiation Dispatcher而言)。

    有了上面的理解之后,來給NIO中的對象跟reactor的對象對個象。

    Acceptor:ServerSocketChannel;

    Initiation Dispatcher:Selector;

    HTTP Handler:針對SocketChannel進行實際處理的個性化對象;

    Events:在SelectionKey中:

    static int OP_ACCEPT 
              Operation-set bit for socket-accept operations.
    static int OP_CONNECT 
              Operation-set bit for socket-connect operations.
    static int OP_READ 
              Operation-set bit for read operations.
    static int OP_WRITE 
              Operation-set bit for write operations.
    經過上面的描述,我們就可以寫出基于NIO的非阻塞Server啦。具體的代碼示例大家可以看參考資料(2)。

    下一篇,NIO包中對象的介紹。有些本末倒置哦,但是,這篇里面沒有用到很多api,主要是reactor明白了,非阻塞明白了,目的就達到了。

    參考資料:

    (1)華盛頓大學計算機科學的一篇關于proactor的論文,非常詳細。同時這篇文章中還有 reactor的改進版proactor,各位可以一飽眼福。

    (2)簡單的NIO server實現代碼,但是這個代碼中在寫的部分有些瑕疵,各位根據上面的描述,可以考慮一下有何問題。

           在這個代碼中,還有一個要注意的地方,就it.remove(),因為某個key在處理過后要刪除,否則,這個key將一直處于active狀態。


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 成在线人永久免费视频播放| 亚洲熟妇无码AV在线播放| 一二三四在线观看免费中文在线观看| 亚洲精品WWW久久久久久| 一级毛片在线观看免费| 亚洲国产精品无码第一区二区三区| 亚洲一区二区三区在线播放| 59pao成国产成视频永久免费 | 亚洲午夜精品一区二区| 毛片免费全部免费观看| 香蕉免费一级视频在线观看| 456亚洲人成在线播放网站| 亚洲一区二区三区AV无码| 人妻视频一区二区三区免费| a级午夜毛片免费一区二区| 亚洲夂夂婷婷色拍WW47| 亚洲精品~无码抽插| 国产男女猛烈无遮挡免费视频网站| 久久国产精品免费看| 老司机午夜在线视频免费| 亚洲性无码av在线| 亚洲精品无码av人在线观看| 免费毛片网站在线观看| 热re99久久6国产精品免费| 日本激情猛烈在线看免费观看| 亚洲一级视频在线观看| 亚洲成AV人片在线观看| 亚洲伦乱亚洲h视频| 成人免费视频试看120秒| 中文字幕免费视频一| 精品国产免费一区二区三区| 亚洲av成人一区二区三区在线播放| 亚洲黄色中文字幕| 亚洲国产精品SSS在线观看AV| 四虎永久精品免费观看| 四虎www免费人成| 久草在视频免费福利| 91大神在线免费观看| 十八禁在线观看视频播放免费| 综合一区自拍亚洲综合图区| 亚洲综合色区中文字幕|