IO多路復(fù)用是指內(nèi)核一旦發(fā)現(xiàn)進(jìn)程指定的一個(gè)或者多個(gè)IO條件準(zhǔn)備讀取,它就通知該進(jìn)程

通俗理解(摘自網(wǎng)上一大神)

這些名詞比較繞口,理解涵義就好。一個(gè)epoll場(chǎng)景:一個(gè)酒吧服務(wù)員(一個(gè)線程),前面趴了一群醉漢,突然一個(gè)吼一聲“倒酒”(事件),你小跑過去給他倒一杯,然后隨他去吧,突然又一個(gè)要倒酒,你又過去倒上,就這樣一個(gè)服務(wù)員服務(wù)好多人,有時(shí)沒人喝酒,服務(wù)員處于空閑狀態(tài),可以干點(diǎn)別的玩玩手機(jī)。至于epoll與select,poll的區(qū)別在于后兩者的場(chǎng)景中醉漢不說話,你要挨個(gè)問要不要酒,沒時(shí)間玩手機(jī)了。io多路復(fù)用大概就是指這幾個(gè)醉漢共用一個(gè)服務(wù)員。

三個(gè)函數(shù)

1、select

進(jìn)程指定內(nèi)核監(jiān)聽哪些文件描述符(最多監(jiān)聽1024個(gè)fd)的哪些事件,當(dāng)沒有文件描述符事件發(fā)生時(shí),進(jìn)程被阻塞;當(dāng)一個(gè)或者多個(gè)文件描述符事件發(fā)生時(shí),進(jìn)程被喚醒。

當(dāng)我們調(diào)用select()時(shí):

  1 上下文切換轉(zhuǎn)換為內(nèi)核態(tài)

  2 將fd從用戶空間復(fù)制到內(nèi)核空間

  3  內(nèi)核遍歷所有fd,查看其對(duì)應(yīng)事件是否發(fā)生

  4  如果沒發(fā)生,將進(jìn)程阻塞,當(dāng)設(shè)備驅(qū)動(dòng)產(chǎn)生中斷或者timeout時(shí)間后,將進(jìn)程喚醒,再次進(jìn)行遍歷

  5 返回遍歷后的fd

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式