關(guān)于epoll與java NIO中select的思考

關(guān)于NIO編程與epoll、IOCP大家應(yīng)該耳熟能詳了磷醋,先簡單回顧一下常見的結(jié)論:

  • NIO是非阻塞IO
  • epoll和IOCP分別是linux上和windows上對NIO操作系統(tǒng)級別的實現(xiàn)聊闯。
  • NIO單機支持的連接數(shù)比BIO要高很多史简,解決了C10K問題居暖。

在獲取通信數(shù)據(jù)時,NIO使用輪詢的方式代替了阻塞的方式藤肢。但這樣做是否效率更高呢太闺?如果提高了,那原因是什么呢嘁圈?在看了很多的資料后我對以上問題依然不是特別清晰省骂。不過最近通過研究epoll與java selector的實現(xiàn),有了一些新的理解最住。

java中selector的select方法依然是阻塞的钞澳,其內(nèi)部調(diào)用的是不同操作系統(tǒng)中的實現(xiàn),windows下是IOCP的poll0(...)方法涨缚,這是一個native方法轧粟,如下。

private native int poll0(long pollAddress, int numfds,
             int[] readFds, int[] writeFds, int[] exceptFds, long timeout);
// These arrays will hold result of native select().
            // The first element of each array is the number of selected sockets.
        // Other elements are file descriptors of selected sockets.
        private final int[] readFds = new int [MAX_SELECTABLE_FDS + 1];//保存發(fā)生read的FD
        private final int[] writeFds = new int [MAX_SELECTABLE_FDS + 1]; //保存發(fā)生write的FD
        private final int[] exceptFds = new int [MAX_SELECTABLE_FDS + 1]; //保存發(fā)生except的FD

這個poll0()會監(jiān)聽pollWrapper中的FD有沒有數(shù)據(jù)進出脓魏,這會造成IO阻塞兰吟,直到有數(shù)據(jù)讀寫事件發(fā)生。比如茂翔,由于pollWrapper中保存的也有ServerSocketChannel的FD混蔼,所以只要ClientSocket發(fā)一份數(shù)據(jù)到ServerSocket,那么poll0()就會返回;又由于pollWrapper中保存的也有pipe的write端的FD珊燎,所以只要pipe的write端向FD發(fā)一份數(shù)據(jù)惭嚣,也會造成poll0()返回;如果這兩種情況都沒有發(fā)生悔政,那么poll0()就一直阻塞晚吞,也就是selector.select()會一直阻塞;如果有任何一種情況發(fā)生卓箫,那么selector.select()就會返回载矿,所有在OperationServer的run()里要用while (true) {},這樣就可以保證在selector接收到數(shù)據(jù)并處理完后繼續(xù)監(jiān)聽poll();

所以可以看出烹卒,NIO依然是阻塞式的IO闷盔,那么它和BIO的區(qū)別究竟在哪呢。
其實它的區(qū)別在于阻塞的位置不同旅急,BIO是阻塞在read方法(recvfrom)逢勾,而NIO阻塞在select方法。那么這樣做有什么好處呢藐吮。如果單純的改變阻塞的位置溺拱,自然是沒有什么變化的逃贝,但epoll等的實現(xiàn)的巧妙之處就在于,它利用回調(diào)機制迫摔,讓監(jiān)聽能夠只需要知曉哪些socket上的數(shù)據(jù)已經(jīng)準備好了沐扳,只需要處理這些線程上面的數(shù)據(jù)就行了。采用BIO句占,假設(shè)有1000個連接沪摄,需要開1000個線程,然后有1000個read的位置在阻塞纱烘,采用NIO編程杨拐,只需要1個線程,它利用select的輪詢方法配合epoll的事件機制及紅黑樹數(shù)據(jù)結(jié)構(gòu)擂啥,降低了其內(nèi)部輪詢的開銷哄陶,同時極大的減小了線程上下文切換的開銷。

那么在一秒鐘內(nèi)哺壶,epoll的epoll.wait方法究竟會輪詢多少次呢屋吨。這個問題我目前沒有得到直接的答案。我調(diào)用java的NIO庫的selector的selectNow()方法变骡,然后不做任何業(yè)務(wù)處理离赫,只增加了一個index++的操作,計算得到的結(jié)果大致是1秒鐘index增加40w塌碌,這說明了epoll.wait是一個很快的的操作(有資料也表明了O(1)時間復(fù)雜度)渊胸,看來NIO確實很適合處理大量并發(fā)連接的情況。

參考文章

  1. 了解Unix網(wǎng)絡(luò)編程5種I/O模型
  2. tomcat 線程池介紹 BIO/NIO有何不同
  3. 為什么NIO比BIO效率高
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末台妆,一起剝皮案震驚了整個濱河市翎猛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌接剩,老刑警劉巖切厘,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懊缺,居然都是意外死亡疫稿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門鹃两,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遗座,“玉大人,你說我怎么就攤上這事俊扳⊥窘” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵馋记,是天一觀的道長号坡。 經(jīng)常有香客問我懊烤,道長,這世上最難降的妖魔是什么宽堆? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任腌紧,我火速辦了婚禮,結(jié)果婚禮上畜隶,老公的妹妹穿的比我還像新娘寄啼。我一直安慰自己,他們只是感情好代箭,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涕刚,像睡著了一般嗡综。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杜漠,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天极景,我揣著相機與錄音,去河邊找鬼驾茴。 笑死盼樟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的锈至。 我是一名探鬼主播晨缴,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峡捡!你這毒婦竟也來了击碗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤们拙,失蹤者是張志新(化名)和其女友劉穎稍途,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砚婆,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡械拍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了装盯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坷虑。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖验夯,靈堂內(nèi)的尸體忽然破棺而出猖吴,到底是詐尸還是另有隱情,我是刑警寧澤挥转,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布海蔽,位于F島的核電站共屈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏党窜。R本人自食惡果不足惜拗引,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幌衣。 院中可真熱鬧矾削,春花似錦、人聲如沸豁护。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楚里。三九已至断部,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間班缎,已是汗流浹背蝴光。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留达址,地道東北人蔑祟。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像沉唠,于是被迫代替她去往敵國和親疆虚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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