libeio原始碼分析 主流程

2021-06-06 23:16:23 字數 1860 閱讀 8969

相信上面這段話已經將libeio的feature講的足夠清楚:提供全套非同步檔案操作的介面,讓使用者能寫出完全非阻塞的程式。阻塞意味著低效,但非阻塞一定要有很好的通知機制才能做到高效。

其實linux下的aio(非同步io)並不是沒有解決方案:在使用者態,多執行緒同步來模擬的非同步io,如glibc 的aio;以及在核心態實現非同步通知,如linux核心2.6.22之後實現的kernel native aio。但兩者都存在讓使用者望而祛步的問題。

glibc的aio bug太多,而且io發起者並不是最後的io終結者(callback是在單獨的執行緒執行的);而kernel native aio只支援o_direct方式,無法利用page cache。

正是由於上述原因,marc alexander lehmann大佬決定自己開發乙個aio庫,及libeio。libeio也是在使用者態用多執行緒同步來模擬非同步io,但實現更高效,**也更可靠,目前雖然是beta版,但已經可以上生產了(node.js底層就是用libev和libeio來驅動的)。還要強調一點:libeio裡io的終結者正是當初io的發起者(這一點非常重要,因為io都是由使用者的request而發起,而io完成後返回給使用者的response也能在處理request的執行緒中完成)。

一次非同步io操作可以分為三個階段:

初始化         –>  提交io        –>  通知worker執行緒      (主線程);

取request     –>  執行io        –>  通知主線程               (worker執行緒);

取response  –>  callback        –>  結束io                      (主線程)。

下面我們通過一張流程圖來剖析一下libeio的原始碼實現。

1. 主線程呼叫eio_init函式,主要是初始化req_queue,res_queue以及對應的mutex和cond;

2-3. 所有的io操作其實都是對eio_sumbit的呼叫,而eio_sumbit的職能是將io操作封裝為request並插入到req_queue;並呼叫cond_signal向worker執行緒發出reqwait已經ok的訊號;

libeio處理流程圖

4. worker執行緒被建立後執行的函式為etp_proc,etp_proc啟動後會一直等待reqwait條件的出現;

5-6. 當reqwait條件變數滿足時,etp_proc從req_queue中取得乙個待處理的request;並呼叫eio_execute來同步執行該io操作;

7-8. eio_execute完成後,將response插入到res_queue佇列中;同時呼叫want_poll來通知主線程request已經處理完畢;

9. 這裡worker執行緒通知主線程的機制是通過向pipe[1]寫乙個byte資料;

10. 當主線程發現pipe[0]可讀時,就呼叫eio_poll;

11. eio_poll從res_queue裡取response,並呼叫該io操作在init時設定的callback函式完成後續處理;

12. 在res_queue中沒有待處理response時,呼叫done_poll;

13-14. done_poll從pipe[0]讀出乙個byte資料,該io操作完成。

libeio的實現就是這麼簡潔,這裡需要說明兩點:

1. 在worker執行緒完成io請求,通知主線程的機制是需要使用者自定義的,wait_poll和done_poll就是libeio提供給使用者的介面(pipe是一種常用的執行緒通知機制)。

2. worker執行緒並不是為每個請求都建立乙個,而是維護了乙個worker執行緒池,關於這部分將會在下面的文章中單獨講到。

《libeio介面文件》

《linux非同步io**》

《linux aio (非同步io) 那點事兒》

元件主流程

元件例項化期間 1.生成子元件 包括不變的子元件和變化的子元件。後者的例項可以在其它時機動態生成 2.設定預設屬性 3.新增系統級事件 4.新增自定義事件 5.為元件本身以及固定子元件附著渲染器 由元件外部呼叫 enterframe週期 6.渲染 由元件外部的渲染管理器呼叫 6.1.將子元件 不變的...

OpenSBI 主流程分析與總結

risc v指令集的sbi標準規定了類unix平台下,作業系統執行環境的規範。這個規範擁有多種實現,opensbi是它的一種實現.risc v架構中,存在著定義於作業系統之下的執行環境。這個執行環境不僅將引導啟動risc v下的作業系統,還將常駐後台,為作業系統提供一系列二進位制介面,以便其獲取和操...

Linux程序切換主流程

linux切換並沒有使用x86cpu的切換方法,linux切換的實質就是cr3切換 記憶體空間切換,在switch mm函式中 暫存器切換 包括eip,esp等,均在switch to函式中 這裡我們講述下switch to主流程 1.在switch mm函式中將new task pgd設定到cr3...