bio,nio,aio

http://www.cnblogs.com/ygj0930/p/6543960.htmlhtml

 一:事件分離器編程

        在IO讀寫時,把 IO請求 與 讀寫操做 分離調配進行,須要用到事件分離器。根據處理機制的不一樣,事件分離器又分爲:同步的Reactor和異步的Proactor。ruby

        Reactor模型:併發

- 應用程序在事件分離器註冊 讀就緒事件 和 讀就緒事件處理器 - 事件分離器等待讀就緒事件發生 - 讀就緒事件發生,激活事件分離器,分離器調用 讀就緒事件處理器(即:能夠進行讀操做了,開始讀) - 讀事件處理器開始進行讀操做,把讀到的數據提供給程序使用

        Proactor模型:異步

       - 應用程序在事件分離器註冊 讀完成事件 和 讀完成事件處理器,並向操做系統發出異步讀請求socket

   - 事件分離器等待操做系統完成讀取性能

   - 在分離器等待過程當中,操做系統利用並行的內核線程執行實際的讀操做,並將結果數據存入用戶自定義緩衝區,最後通知事件分離器讀操做完成spa

   - 事件分離器監聽到 讀完成事件 後,激活 讀完成事件的處理器操作系統

   - 讀完成事件處理器 處理用戶自定義緩衝區中的數據給應用程序使用線程

    

       同步和異步的區別就在於 讀 操做由誰完成:同步的Reactor是指程序發出讀請求後,由分離器監聽到能夠進行讀操做時(須要得到讀操做條件)通知事件處理器進行讀操做,異步的Proactor是指程序發出讀請求後,操做系統馬上異步地進行讀操做了,讀完以後在通知分離器,分離器激活處理器直接取用已讀到的數據。

      

        二:同步阻塞IO(BIO)

        咱們熟知的Socket編程就是BIO,一個socket鏈接一個處理線程(這個線程負責這個Socket鏈接的一系列數據傳輸操做)。阻塞的緣由在於:操做系統容許的線程數量是有限的,多個socket申請與服務端創建鏈接時,服務端不能提供相應數量的處理線程,沒有分配處處理線程的鏈接就會阻塞等待或被拒絕。

 

         三:同步非阻塞IO(NIO)

         New IO是對BIO的改進,基於Reactor模型。咱們知道,一個socket鏈接只有在特色時候纔會發生數據傳輸IO操做,大部分時間這個「數據通道」是空閒的,但仍是佔用着線程。NIO做出的改進就是「一個請求一個線程」,在鏈接到服務端的衆多socket中,只有須要進行IO操做的才能獲取服務端的處理線程進行IO。這樣就不會由於線程不夠用而限制了socket的接入。客戶端的socket鏈接到服務端時,就會在事件分離器註冊一個 IO請求事件 和 IO 事件處理器。在該鏈接發生IO請求時,IO事件處理器就會啓動一個線程來處理這個IO請求,不斷嘗試獲取系統的IO的使用權限,一旦成功(即:能夠進行IO),則通知這個socket進行IO數據傳輸。

         NIO還提供了兩個新概念:Buffer和Channel

Buffer: – 是一塊連續的內存塊。 – 是 NIO 數據讀或寫的中轉地。 Channel: – 數據的源頭或者數據的目的地 – 用於向 buffer 提供數據或者讀取 buffer 數據 ,buffer 對象的惟一接口。 – 異步 I/O 支持
Buffer做爲IO流中數據的緩衝區,而Channel則做爲socket的IO流與Buffer的傳輸通道。客戶端socket與服務端socket之間的IO傳輸不直接把數據交給CPU使用,
而是先通過Channel通道把數據保存到Buffer,而後CPU直接從Buffer區讀寫數據,一次能夠讀寫更多的內容。
使用Buffer提升IO效率的緣由(這裏與IO流裏面的BufferedXXStream、BufferedReader、BufferedWriter提升性能的原理同樣):IO的耗時主要花在數據傳輸的路上,普通的IO是一個字節一個字節地傳輸,
而採用了Buffer的話,經過Buffer封裝的方法(好比一次讀一行,則以行爲單位傳輸而不是一個字節一次進行傳輸)就能夠實現「一大塊字節」的傳輸。好比:IO就是送快遞,普通IO是一個快遞跑一趟,採用了Buffer的IO就是一車跑一趟。很明顯,buffer效率更高,花在傳輸路上
的時間大大縮短。

 

          四:異步阻塞IO(AIO)

          NIO是同步的IO,是由於程序須要IO操做時,必須得到了IO權限後親自進行IO操做才能進行下一步操做。AIO是對NIO的改進(因此AIO又叫NIO.2),它是基於Proactor模型的。每一個socket鏈接在事件分離器註冊 IO完成事件 和 IO完成事件處理器。程序須要進行IO時,向分離器發出IO請求並把所用的Buffer區域告知分離器,分離器通知操做系統進行IO操做,操做系統本身不斷嘗試獲取IO權限並進行IO操做(數據保存在Buffer區),操做完成後通知分離器;分離器檢測到 IO完成事件,則激活 IO完成事件處理器,處理器會通知程序說「IO已完成」,程序知道後就直接從Buffer區進行數據的讀寫。

          也就是說:AIO是發出IO請求後,由操做系統本身去獲取IO權限並進行IO操做;NIO則是發出IO請求後,由線程不斷嘗試獲取IO權限,獲取到後通知應用程序本身進行IO操做。

相關文章
相關標籤/搜索