Java NIO Selector

1,SelectionKey

1)創(chuàng)建SelectionKey
每次channel向selector注冊時,會創(chuàng)建一個SelectionKey。
ssc.register(selector, SelectionKey.OP_ACCEPT);
1.放入Channel的SelectionKey[]數(shù)組keys中
2.放入Selector的Set<SelectionKey>集合keys中
2)合法的ops

image.png

3)SelectionKey包含一個selector和一個channel
selector()方法獲取Selector、channel()方法獲取Channel
image.png

2,Channel向Selector注冊過程

1)注冊步驟如下

image.png

非該channel支持的valid-operation诗祸,拋出異常媒抠。如: ServerSocketChannel只支持SelectionKey.OP_ACCEPT
2)Channel有一個SelectionKey[] keys的數(shù)組
注冊成功后瞎疼,將返回的SelectionKey放入channel的keys數(shù)組中魄鸦。
image.png

3)Selector有一個Set<SelectionKey> keys集合
注冊成功后,epoll模型將SelectionKey放入selector的keys集合中茅郎。

3蜗元,Channel有效的ops集合

1)DatagramChannel支持讀、寫事件系冗。

image.png

ServerSocketChannel只支持OP_ACCEPT監(jiān)聽事件奕扣。
image.png

SocketChannel支持讀、寫掌敬、連接事件惯豆。
image.png

3池磁,Selector結(jié)構(gòu)

1)三個SelectionKey的集合

image.png

image.png

2)基于OS的SelectorProvider
1. 在openjdk中,每個操作系統(tǒng)都有一個sun.nio.ch.DefaultSelectorProvider實(shí)現(xiàn)楷兽。
2. 在Linux上是EPollSelectorProvider 地熄,在Mac OS是KQueueSelectorProvider。
3.通過EpollSelectorProvider.openSelector()創(chuàng)建EPollSelectorImpl Selector對象芯杀。
image.png

4端考,Linux epoll模型

1)基礎(chǔ)概念
Selector:IO多路復(fù)用的一個封裝,Linux下就是對epoll系統(tǒng)調(diào)用的封裝揭厚。
epoll本質(zhì):將event loop交給了內(nèi)核却特,網(wǎng)絡(luò)數(shù)據(jù)先到內(nèi)核,內(nèi)核直接處理筛圆,避免系統(tǒng)調(diào)用和數(shù)據(jù)拷貝, 提高性能裂明。
SelectionKey本質(zhì):對IO事件(讀、寫太援、連接闽晦、監(jiān)聽)的封裝,保存Channel關(guān)心的事件粉寞。

image.png

2)epoll系統(tǒng)調(diào)用
image.png

image.png

3)selector.select方法選擇就緒的I/O事件
1. EpollSelectorImpl底層調(diào)用native方法 epollWait尼荆。
2. epollWait 底層發(fā)起epoll_wait系統(tǒng)調(diào)用。
epoll_create:創(chuàng)建一個epollfd唧垦,使用紅黑樹存儲準(zhǔn)備就緒的事件。在EpollSelectorImpl初始化時調(diào)用液样。
epoll_ctl: 對新舊事件進(jìn)行新增修改或者刪除振亮。
epoll_wait:等待內(nèi)核返回I/O事件。調(diào)用Selector.select方法時底層調(diào)用鞭莽。
4)NIO的select方法
selector.select()-->底層epoll_wait-->獲取Iterator<SelectionKey>-->遍歷處理每一個IO事件SelectionKey坊秸。
image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市澎怒,隨后出現(xiàn)的幾起案子褒搔,更是在濱河造成了極大的恐慌,老刑警劉巖喷面,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件星瘾,死亡現(xiàn)場離奇詭異,居然都是意外死亡惧辈,警方通過查閱死者的電腦和手機(jī)琳状,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盒齿,“玉大人念逞,你說我怎么就攤上這事困食。” “怎么了翎承?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵硕盹,是天一觀的道長。 經(jīng)常有香客問我叨咖,道長莱睁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任芒澜,我火速辦了婚禮仰剿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痴晦。我一直安慰自己南吮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布誊酌。 她就那樣靜靜地躺著部凑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碧浊。 梳的紋絲不亂的頭發(fā)上涂邀,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機(jī)與錄音箱锐,去河邊找鬼比勉。 笑死,一個胖子當(dāng)著我的面吹牛驹止,可吹牛的內(nèi)容都是我干的浩聋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臊恋,長吁一口氣:“原來是場噩夢啊……” “哼衣洁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抖仅,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坊夫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撤卢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體环凿,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年凸丸,在試婚紗的時候發(fā)現(xiàn)自己被綠了拷邢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡屎慢,死狀恐怖瞭稼,靈堂內(nèi)的尸體忽然破棺而出忽洛,到底是詐尸還是另有隱情,我是刑警寧澤环肘,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布欲虚,位于F島的核電站,受9級特大地震影響悔雹,放射性物質(zhì)發(fā)生泄漏复哆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一腌零、第九天 我趴在偏房一處隱蔽的房頂上張望梯找。 院中可真熱鬧,春花似錦益涧、人聲如沸锈锤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽久免。三九已至,卻和暖如春扭弧,著一層夾襖步出監(jiān)牢的瞬間阎姥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工鸽捻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呼巴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓泊愧,卻偏偏與公主長得像伊磺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子删咱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Selector是Java NIO的一個組件,可以檢查一個或者多個NIO channel豪筝,并且決定哪個channe...
    kopshome閱讀 481評論 0 0
  • Selector(選擇器)是Java NIO中能夠同時監(jiān)測多個Channel通道痰滋,并且還能知道Channel上讀寫...
    zhanglbjames閱讀 3,072評論 0 6
  • Java NIO Selector Selector(選擇器)是Java NIO中能夠檢測一到多個NIO通道,并能...
    熬夜的貓頭鷹閱讀 237評論 0 0
  • 1续崖、Selector(選擇器)是Java NIO中能夠檢測一到多個NIO渠道敲街,并能夠知曉渠道是否為諸如讀寫事件做好...
    faunjoe閱讀 2,698評論 1 1
  • 本文轉(zhuǎn)載于本人個人博客 1.概述 在本文中,我們將探討Java NIO的Selector組件的介紹部分严望。 選擇器提...
    那個驢閱讀 477評論 0 0