成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解BIO與NIO的區(qū)別

開發(fā) 后端
IO讀寫時(shí),多路復(fù)用機(jī)制都會(huì)依賴對(duì)一個(gè)事件多路分離器,負(fù)責(zé)把源事件的IO 事件分離出來,分別到相應(yīng)的read/write事件分離器。涉及到事件分離器的兩種模式分別就是 Reactor和Proactor,Reactor是基于同步IO的,Proactor是基于異步IO的。

一、 Reactor and Proactor

IO讀寫時(shí),多路復(fù)用機(jī)制都會(huì)依賴對(duì)一個(gè)事件多路分離器,負(fù)責(zé)把源事件的IO 事件分離出來,分別到相應(yīng)的read/write事件分離器。涉及到事件分離器的兩種模式分別就是 Reactor和Proactor,Reactor是基于同步IO的,Proactor是基于異步IO的。

在Reactor模式中,事件分離者等待某個(gè)事件或者可應(yīng)用或個(gè)操作的狀態(tài)發(fā)生(比如文件描述符可讀寫,或者是socket可讀寫),事件分離者就把這個(gè)事件傳給事先注冊(cè)的事件處理函數(shù)或者回調(diào)函數(shù),由后者來做實(shí)際的讀寫操作。

在Proactor模式中,事件處理者(或者代由事件分離者發(fā)起)直接發(fā)起一個(gè)異步讀寫操作(相當(dāng)于請(qǐng)求),而實(shí)際的工作是由操作系統(tǒng)來完成的。發(fā)起時(shí),需要提供的參數(shù)包括用于存放讀到數(shù)據(jù)的緩存區(qū),讀的數(shù)據(jù)大小,或者用于存放外發(fā)數(shù)據(jù)的緩存區(qū),以及這個(gè)請(qǐng)求完后的回調(diào)函數(shù)等信息。事件分離者得知了這個(gè)請(qǐng)求,它默默等待這個(gè)請(qǐng)求的完成,然后轉(zhuǎn)發(fā)完成事件給相應(yīng)的事件處理者或者回調(diào)。舉例來說,在Windows上事件處理者投遞了一個(gè)異步IO操作(稱有 overlapped的技術(shù)),事件分離者等IOCompletion事件完成. 這種異步模式的典型實(shí)現(xiàn)是基于操作系統(tǒng)底層異步API的,所以我們可稱之為“系統(tǒng)級(jí)別”的或者“真正意義上”的異步,因?yàn)榫唧w的讀寫是由操作系統(tǒng)代勞的。

舉個(gè)例子,將有助于理解Reactor與Proactor二者的差異,以讀操作為例(類操作類似)。

在Reactor中實(shí)現(xiàn)讀:

- 注冊(cè)讀就緒事件和相應(yīng)的事件處理器

- 事件分離器等待事件

- 事件到來,激活分離器,分離器調(diào)用事件對(duì)應(yīng)的處理器。

- 事件處理器完成實(shí)際的讀操作,處理讀到的數(shù)據(jù),注冊(cè)新的事件,然后返還控制權(quán)。

與如下Proactor(真異步)中的讀過程比較:

- 處理器發(fā)起異步讀操作(注意:操作系統(tǒng)必須支持異步IO)。在這種情況下,處理器無視IO就緒事件,它關(guān)注的是完成事件。

- 事件分離器等待操作完成事件

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

- 事件分離器呼喚處理器。

- 事件處理器處理用戶自定義緩沖區(qū)中的數(shù)據(jù),然后啟動(dòng)一個(gè)新的異步操作,并將控制權(quán)返回事件分離器。

可以看出,兩個(gè)模式的相同點(diǎn),都是對(duì)某個(gè)IO事件的事件通知(即告訴某個(gè)模塊,這個(gè)IO操作可以進(jìn)行或已經(jīng)完成)。在結(jié)構(gòu)

上,兩者也有相同點(diǎn):demultiplexor負(fù)責(zé)提交IO操作(異步)、查詢?cè)O(shè)備是否可操作(同步),然后當(dāng)條件滿足時(shí),就回調(diào)handler;

不同點(diǎn)在于,異步情況下(Proactor),當(dāng)回調(diào)handler時(shí),表示IO操作已經(jīng)完成;同步情況下(Reactor),回調(diào)handler時(shí),表示

IO設(shè)備可以進(jìn)行某個(gè)操作(can read or can write),handler這個(gè)時(shí)候開始提交操作。

二、BIO、NIO、AIO

NIO通常采用Reactor模式,AIO通常采用Proactor模式。AIO簡(jiǎn)化了程序的編寫,stream的讀取和寫入都有OS來完成,不需要像NIO那樣子遍歷Selector。Windows基于IOCP實(shí)現(xiàn)AIO,Linux只有eppoll模擬實(shí)現(xiàn)了AIO。

Java7之前的JDK只支持NIO和BIO,從7開始支持AIO。

4種通信方式:TCP/IP+BIO, TCP/IP+NIO, UDP/IP+BIO, UDP/IP+NIO。

TCP/IP+BIO、

Socket和ServerSocket實(shí)現(xiàn),ServerSocket實(shí)現(xiàn)Server端端口監(jiān)聽,Socket用于建立網(wǎng)絡(luò)IO連接。

不適用于處理多個(gè)請(qǐng)求 1.生成Socket會(huì)消耗過多的本地資源。2. Socket連接的建立一般比較慢。

BIO情況下,能支持的連接數(shù)有限,一般都采取accept獲取Socket以后采用一個(gè)thread來處理,one connection one thread。無論連接是否有真正數(shù)據(jù)請(qǐng)求,都需要獨(dú)占一個(gè)thread。

可以通過設(shè)立Socket池來一定程度上解決問題,但是使用池需要注意的問題是:1. 競(jìng)爭(zhēng)等待比較多。 2. 需要控制好超時(shí)時(shí)間。

TCP/IP+NIO

使用Channel(SocketChannel和ServerSocketChannel)和Selector。

Server端通常由一個(gè)thread來監(jiān)聽connect事件,另外多個(gè)thread來監(jiān)聽讀寫事件。這樣做的好處是這些連接只有在真是請(qǐng)求的時(shí)候才會(huì)創(chuàng)建thread來處理,one request one thread。這種方式在server端需要支持大量連接但這些連接同時(shí)發(fā)送請(qǐng)求的峰值不會(huì)很多的時(shí)候十分有效。

UDP/IP+BIO

DatagramSocket和DatagramPacket。DatagramSocket負(fù)責(zé)監(jiān)聽端口以及讀寫數(shù)據(jù),DatagramPacket作為數(shù)據(jù)流對(duì)象進(jìn)行傳輸。

UDP/IP是無連接的,無法進(jìn)行雙向通信,除非雙方都成為UDP Server。

UDP/IP+NIO

通過DatagramChannel和ByteBuffer實(shí)現(xiàn)。DatagramChannel負(fù)責(zé)端口監(jiān)聽及讀寫。ByteBuffer負(fù)責(zé)數(shù)據(jù)流傳輸。

如果要將消息發(fā)送到多臺(tái)機(jī)器,如果為每個(gè)目標(biāo)機(jī)器都建立一個(gè)連接的話,會(huì)有很大的網(wǎng)絡(luò)流量壓力。這時(shí)候可以使用基于UDP/IP的Multicast協(xié)議傳輸,Java中可以通過MulticastSocket和DatagramPacket來實(shí)現(xiàn)。

Multicast一般多用于多臺(tái)機(jī)器的狀態(tài)同步,比如JGroups。SRM, URGCP都是Multicast的實(shí)現(xiàn)方式。eBay就采用SRM來實(shí)現(xiàn)將數(shù)據(jù)從主數(shù)據(jù)庫(kù)同步到各個(gè)搜索節(jié)點(diǎn)機(jī)器。

【編輯推薦】

  1. 探秘JDK 7之四:下一代I/O(NIO.2)
  2. 性能優(yōu)化總結(jié):CPU和Load、NIO以及多線程
  3. Java 7 NIO2高性能Web服務(wù)器并發(fā)連接的處理
  4. 初試Java 7 NIO2:實(shí)現(xiàn)高性能的HTTP Server
  5. Google技術(shù)演講介紹Java 7 NIO.2概覽
責(zé)任編輯:金賀 來源: JavaEye博客
相關(guān)推薦

2018-09-19 14:53:02

NIOBIO運(yùn)行

2020-04-16 15:20:43

PHP前端BIO

2023-07-11 08:40:02

IO模型后臺(tái)

2022-04-16 16:52:24

Netty網(wǎng)絡(luò)服務(wù)器客戶端程序

2023-06-26 07:39:10

2019-04-16 09:11:34

TomcatBIONIO

2023-03-07 08:00:12

netpollGo

2020-10-10 19:37:27

BIO 、NIO 、A

2024-11-06 16:38:51

IO網(wǎng)絡(luò)

2011-12-07 14:57:44

JavaNIO

2023-03-09 08:22:57

Go net庫(kù)Socket

2022-04-13 07:59:23

IOBIONIO

2021-06-11 17:26:06

代碼Java網(wǎng)絡(luò)編程

2019-10-18 08:22:43

BIONIOAIO

2023-03-31 07:49:51

syscall庫(kù)Echo Serve

2009-07-09 16:01:27

2013-03-21 15:27:09

LinuxUnix

2021-08-12 18:48:31

響應(yīng)式編程Bio

2023-03-06 08:37:58

JavaNIO

2020-09-09 09:55:36

JavaNIOBIO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一级毛片成人免费看a | 91麻豆精品国产91久久久更新资源速度超快 | 欧美在线一区二区三区 | 国产免费看| 国产精品久久久久久久久久久新郎 | 日韩在线播放中文字幕 | 免费色网址 | 日韩电影一区二区三区 | 99久久免费精品国产免费高清 | 懂色av一区二区三区在线播放 | 欧美精品一区二区三区四区 在线 | 国产日韩精品久久 | 日韩精品在线一区 | av中文字幕在线 | 91超碰在线 | 精品久久久久久久久久 | 国产成人99 | 久久亚洲精品久久国产一区二区 | 国产精品久久一区 | 91国内外精品自在线播放 | 国产精品小视频在线观看 | 精品日韩 | 欧美另类视频 | 欧美高清一区 | 久久国产美女视频 | 午夜视频在线免费观看 | 久久久新视频 | 日韩精品专区在线影院重磅 | 国产网站久久 | 欧美三区在线观看 | 欧美成年黄网站色视频 | 看羞羞视频免费 | 成人国产一区二区三区精品麻豆 | 亚洲一区在线日韩在线深爱 | 成人午夜av| 久久尤物免费一区二区三区 | 黄色片大全在线观看 | 欧洲av在线 | 久久久做 | 国产综合精品一区二区三区 | 女女百合av大片一区二区三区九县 |