一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

BIO、NIO和AIO的區(qū)別(簡明版)

 liang1234_ 2019-02-21

轉(zhuǎn)載請注明原文地址:http://www.cnblogs.com/ygj0930/p/6543960.html

      一:事件分離器

        在IO讀寫時(shí),把 IO請求 與 讀寫操作 分離調(diào)配進(jìn)行,需要用到事件分離器。根據(jù)處理機(jī)制的不同,事件分離器又分為:同步的Reactor和異步的Proactor。

        Reactor模型:

    - 應(yīng)用程序在事件分離器注冊 讀就緒事件 和 讀就緒事件處理器
    - 事件分離器等待讀就緒事件發(fā)生
    - 讀就緒事件發(fā)生,激活事件分離器,分離器調(diào)用 讀就緒事件處理器(即:可以進(jìn)行讀操作了,開始讀)
    - 讀事件處理器開始進(jìn)行讀操作,把讀到的數(shù)據(jù)提供給程序使用

        Proactor模型:

       - 應(yīng)用程序在事件分離器注冊 讀完成事件 和 讀完成事件處理器,并向操作系統(tǒng)發(fā)出異步讀請求

   - 事件分離器等待操作系統(tǒng)完成讀取

   - 在分離器等待過程中,操作系統(tǒng)利用并行的內(nèi)核線程執(zhí)行實(shí)際的讀操作,并將結(jié)果數(shù)據(jù)存入用戶自定義緩沖區(qū),最后通知事件分離器讀操作完成

   - 事件分離器監(jiān)聽到 讀完成事件 后,激活 讀完成事件的處理器

   - 讀完成事件處理器 處理用戶自定義緩沖區(qū)中的數(shù)據(jù)給應(yīng)用程序使用

    

       同步和異步的區(qū)別就在于 讀 操作由誰完成:同步的Reactor是指程序發(fā)出讀請求后,由分離器監(jiān)聽到可以進(jìn)行讀操作時(shí)(需要獲得讀操作條件)通知事件處理器進(jìn)行讀操作,異步的Proactor是指程序發(fā)出讀請求后,操作系統(tǒng)立刻異步地進(jìn)行讀操作了,讀完之后在通知分離器,分離器激活處理器直接取用已讀到的數(shù)據(jù)。

      

        二:同步阻塞IO(BIO)

        我們熟知的Socket編程就是BIO,一個(gè)socket連接一個(gè)處理線程(這個(gè)線程負(fù)責(zé)這個(gè)Socket連接的一系列數(shù)據(jù)傳輸操作)。阻塞的原因在于:操作系統(tǒng)允許的線程數(shù)量是有限的,多個(gè)socket申請與服務(wù)端建立連接時(shí),服務(wù)端不能提供相應(yīng)數(shù)量的處理線程,沒有分配到處理線程的連接就會(huì)阻塞等待或被拒絕。

 

         三:同步非阻塞IO(NIO)

         New IO是對BIO的改進(jìn),基于Reactor模型。我們知道,一個(gè)socket連接只有在特點(diǎn)時(shí)候才會(huì)發(fā)生數(shù)據(jù)傳輸IO操作,大部分時(shí)間這個(gè)“數(shù)據(jù)通道”是空閑的,但還是占用著線程。NIO作出的改進(jìn)就是“一個(gè)請求一個(gè)線程”,在連接到服務(wù)端的眾多socket中,只有需要進(jìn)行IO操作的才能獲取服務(wù)端的處理線程進(jìn)行IO。這樣就不會(huì)因?yàn)榫€程不夠用而限制了socket的接入??蛻舳说膕ocket連接到服務(wù)端時(shí),就會(huì)在事件分離器注冊一個(gè) IO請求事件 和 IO 事件處理器。在該連接發(fā)生IO請求時(shí),IO事件處理器就會(huì)啟動(dòng)一個(gè)線程來處理這個(gè)IO請求,不斷嘗試獲取系統(tǒng)的IO的使用權(quán)限,一旦成功(即:可以進(jìn)行IO),則通知這個(gè)socket進(jìn)行IO數(shù)據(jù)傳輸。

         NIO還提供了兩個(gè)新概念:Buffer和Channel

Buffer:
–        是一塊連續(xù)的內(nèi)存塊。
–        是 NIO 數(shù)據(jù)讀或?qū)懙闹修D(zhuǎn)地。
Channel:
–        數(shù)據(jù)的源頭或者數(shù)據(jù)的目的地
–        用于向 buffer 提供數(shù)據(jù)或者讀取 buffer 數(shù)據(jù) ,buffer 對象的唯一接口。
–         異步 I/O 支持
Buffer作為IO流中數(shù)據(jù)的緩沖區(qū),而Channel則作為socket的IO流與Buffer的傳輸通道??蛻舳藄ocket與服務(wù)端socket之間的IO傳輸不直接把數(shù)據(jù)交給CPU使用,
而是先經(jīng)過Channel通道把數(shù)據(jù)保存到Buffer,然后CPU直接從Buffer區(qū)讀寫數(shù)據(jù),一次可以讀寫更多的內(nèi)容。
使用Buffer提高IO效率的原因(這里與IO流里面的BufferedXXStream、BufferedReader、BufferedWriter提高性能的原理一樣):IO的耗時(shí)主要花在數(shù)據(jù)傳輸?shù)穆飞希胀ǖ腎O是一個(gè)字節(jié)一個(gè)字節(jié)地傳輸,
而采用了Buffer的話,通過Buffer封裝的方法(比如一次讀一行,則以行為單位傳輸而不是一個(gè)字節(jié)一次進(jìn)行傳輸)就可以實(shí)現(xiàn)“一大塊字節(jié)”的傳輸。比如:IO就是送快遞,普通IO是一個(gè)快遞跑一趟,采用了Buffer的IO就是一車跑一趟。很明顯,buffer效率更高,花在傳輸路上
的時(shí)間大大縮短。

 

          四:異步阻塞IO(AIO)

          NIO是同步的IO,是因?yàn)槌绦蛐枰狪O操作時(shí),必須獲得了IO權(quán)限后親自進(jìn)行IO操作才能進(jìn)行下一步操作。AIO是對NIO的改進(jìn)(所以AIO又叫NIO.2),它是基于Proactor模型的。每個(gè)socket連接在事件分離器注冊 IO完成事件 和 IO完成事件處理器。程序需要進(jìn)行IO時(shí),向分離器發(fā)出IO請求并把所用的Buffer區(qū)域告知分離器,分離器通知操作系統(tǒng)進(jìn)行IO操作,操作系統(tǒng)自己不斷嘗試獲取IO權(quán)限并進(jìn)行IO操作(數(shù)據(jù)保存在Buffer區(qū)),操作完成后通知分離器;分離器檢測到 IO完成事件,則激活 IO完成事件處理器,處理器會(huì)通知程序說“IO已完成”,程序知道后就直接從Buffer區(qū)進(jìn)行數(shù)據(jù)的讀寫。

          也就是說:AIO是發(fā)出IO請求后,由操作系統(tǒng)自己去獲取IO權(quán)限并進(jìn)行IO操作;NIO則是發(fā)出IO請求后,由線程不斷嘗試獲取IO權(quán)限,獲取到后通知應(yīng)用程序自己進(jìn)行IO操作。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产免费人成视频尤物| 国产精品一区二区高潮| 日韩女优精品一区二区三区| 亚洲一区二区精品免费视频| 欧美欧美日韩综合一区| 日韩中文字幕欧美亚洲| 免费精品一区二区三区| 欧美一区二区三区十区| 亚洲欧美日本视频一区二区| 国产精品一区二区视频成人| 精品一区二区三区不卡少妇av| 久久99青青精品免费| 国产欧美日韩精品自拍| 久久偷拍视频免费观看| 黑丝国产精品一区二区| 99热九九热这里只有精品| 国产又大又硬又粗又湿| 欧美人与动牲交a精品| 欧美激情一区=区三区| 国产成人精品国内自产拍| 国产亚洲二区精品美女久久| 国产不卡视频一区在线| 久久福利视频视频一区二区| 日本女优一区二区三区免费| 午夜精品成年人免费视频| 激情中文字幕在线观看| 国产精品一区日韩欧美| 国产一区二区三区成人精品| 成人精品国产亚洲av久久| 国产欧美一区二区三区精品视| 国产一级内射麻豆91| 香蕉久久夜色精品国产尤物 | 亚洲欧美日韩网友自拍| 亚洲精品深夜福利视频| 亚洲精品一二三区不卡| 亚洲欧美国产中文色妇| 91日韩在线观看你懂的| 色婷婷久久五月中文字幕| 久久精品少妇内射毛片| 老熟妇2久久国内精品| 日韩精品你懂的在线观看|