epoll原理的一點總結

       之前只是使用epoll,也只在別人的博客上了解過大致的工作原理。這幾天刷面經,看到許多問epoll的問題,於是花了一天去看了看epoll的源碼,給自己也整理了一個原理簡述。

       epoll是linux的IO多路複用機制的接口,要講epoll的原理,得從它的三個函數逐個介紹:

       首先是epoll_create,這個函數會做兩件事,一是分配一塊連續的物理空間初始化eventpoll對象,eventpoll中包含一顆紅黑樹,一條準備就緒鏈表和一條溢出鏈表;二是獲取一個匿名文件,分配struct file對象和與之對應的fd,將eventpoll對象放在struct file中的private成員中,這樣就可以通過fd找到struct file從而找到eventpoll對象,實現unix的一切皆文件。

       其次是epoll_ctl,這個函數可以用於添加,修改和移除事件,以添加爲例,首先搜索紅黑樹判斷新添加的fd是否已經存在,若不存在則從slab層分配一個epitem對象掛在紅黑樹上,然後根據epitem創建一個epoll_entry對象掛在相應設備的等待隊列上,並設置事件發生時的回調函數。回調函數內容爲將被激活的事件掛在eventpoll的就緒隊列或溢出隊列上,然後喚醒epoll_wait。

       最後是epoll_wait,檢查就緒隊列,是否爲空,若不爲空則先處理就緒隊列,逐個拷貝到用戶空間,這個過程如果有新的事件發生了,則將epitem掛到溢出隊列上;然後將溢出隊列對象掛到就緒隊列上;若使用了LT模式,則會將拷貝到用戶空間的epitem再次掛到就緒隊列上,下次處理就緒隊列時,若發現沒有新事件則不拷貝到用戶空間。

發佈了13 篇原創文章 · 獲贊 3 · 訪問量 1987
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章