epoll的理論與IO阻塞機制

2022-02-23 23:13:09 字數 1496 閱讀 8600

(1)流

▪ 可以進⾏i/o操作的核心物件

▪ ⽂件、管道、套接字……

▪ 流的⼊⼝:⽂件描述符(fd)

(2)i/o操作

所有對流的讀寫操作,我們都可 以稱之為io操作。

(3)阻塞

阻塞等待 不佔⽤cpu寶貴的時間⽚

⾮阻塞忙輪詢 佔⽤cpu,系統資源

在處理意⻅資料的接收場景時, 我們建議優先選擇阻塞等待的⽅ 式, 不浪費效能資源

(4)阻塞等待缺點:

不能夠很好的處理 多個(i/o)請求的問題

同⼀個阻塞,同⼀時刻只能處理⼀個流的阻塞監聽

(5)多路io復⽤

既能夠阻塞等待,不浪費資源

也能夠同⼀時刻監聽多個io請求的狀態

⽅法⼀ : 阻塞等待+多程序/多執行緒

需要開闢執行緒浪費資源

⽅法⼆:⾮阻塞+忙輪詢

while

true

}}

cpu在⼤量的做判斷,while和for

cpu的利⽤率不⾼

方法三:多路io復⽤機制   select(與平台⽆關)

監聽的io數量有限,預設是1024個

不會精準的告訴開發者,哪些io是可讀可寫的,需要遍歷

while

true

}}

方法四:多路io復⽤機制  epoll(linux)

通過 /proc/sys/fd/file-max檢視)

while

true

}

(1) 建立epoll

int epoll_create(int size);

(2) 控制epoll

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

(3) 等待epoll

int epoll_wait(int epfd, struct epoll_event *event, int maxevents, int timeout);

(4) 使⽤epoll程式設計主流程⻣架

⽔平觸發:

⽔平觸發的主要特點是,如果⽤戶在監聽epoll事件,當核心有事件的時候,會拷⻉給⽤戶態事 件,但是如果⽤戶只處理了⼀次,那麼剩下沒有處理的會在下⼀次epoll_wait再次返回該事 件。

預設就是⽔平觸發模式

邊緣觸發:

邊緣觸發,相對跟⽔平觸發相反,當核心有事件到達, 只會通知⽤戶⼀次,⾄於⽤戶處理還是不處理, 以後將不會再通知。這樣減少了拷⻉過程,增加了效能,但是相對來說,如果⽤戶⻢⻁忘記處理,將會產 ⽣事件丟的情況。

在給事件進⾏繫結的時候,通過epollet來設定

阻塞IO與非阻塞IO

阻塞io,當前程序因不滿足一些條件,而被掛起,即阻塞,cpu改去服務其它程序,read乙個普通檔案,就馬上執行,read乙個滑鼠,可是滑鼠沒有動,於是就阻塞了,阻塞的好處,利於os效能的發揮,cpu發揮高,雖然個體的費了點時間,但是總的效率得到了提高,阻塞在多路io的時候,缺陷就出來了,比如2路io...

非阻塞IO與阻塞IO

非阻塞式呼叫的問題 kibuv提供了乙個執行緒池 阻塞於非阻塞對於被呼叫者,即系統層面,系統為程式提供了阻塞呼叫和非阻塞呼叫,同步和非同步是對於呼叫者,就是自己的程式,發七呼叫,沒有其他操作,只是等待結果這個過程就是同步,發起呼叫後會等待結果,繼續完成其他的工作,等有回掉再執行,這個過程就是非同步的...

epoll水平觸發 邊沿觸發與非阻塞I O模型

epoll作為多路i o復用在linux的實現,無論是在模型方面,還是執行效率方面,相較於select和poll都有了較大改進。水平觸發 凡是epoll負責的輸入輸出源緩衝區有資料可讀或者可寫,epoll wait 就不會阻塞,或者說會通知。邊沿觸發 凡是epoll負責的輸入輸出源的緩衝區有新的資料...