libuv和libev 非同步I O庫的比較

2022-04-08 01:37:57 字數 2397 閱讀 9944

libuvlibev,兩個名字相當相近的 i/o library,最近有幸用兩個 library 都寫了一些東西,下面就來說一說我本人對兩者共同與不同點的主觀表述。

高效能網路程式設計這個話題已經被討論爛了。非同步,非同步,還是非同步。不管是epoll也好,kqueue也罷,總是免不了非同步這個話題。

libev是系統非同步模型的簡單封裝,基本上來說,它解決了epollkqueuqselect之間 api 不同的問題。保證使用livev的 api 編寫出的程式可以在大多數 *nix 平台上執行。但是libev的缺點也是顯而易見,由於基本只是封裝了 event library,用起來有諸多不便。比如accept(3)連線以後需要手動setnonblocking。從 socket 讀寫時需要檢測eagainewouldblockeinter。這也是大多數人認為非同步程式難寫的根本原因。

libuv則顯得更為高層。libuv是 joyent 給 node 做的一套 i/o library 。而這也導致了libuv最大的特點就是處處**。基本上只要有可能阻塞的地方,libuv都使用**處理。這樣做實際上大大減輕了程式設計師的工作量。因為當**被 call 的時候,libuv保證你有事可做,這樣eagainewouldblock之類的 handle 就不是程式設計師的工作了,libuv會默默的幫你搞定。

libev在 socket 發生讀寫事件時,只告訴你,「xx socket 可以讀/寫了,自己看著辦吧」。往往我們需要自己申請記憶體並呼叫read(3)或者write(3)來響應 i/o 事件。

libuv則稍微複雜一些,我們分讀/寫兩個部分來描述。

當介面可讀時,libuv會呼叫你的 allocate callback 來申請記憶體並將讀到的內容寫入。當讀取完畢後,libuv會 call 你為這個 socket 設定的**函式,在引數中帶著這個 buffer 的資訊。你只需要負責處理這個 buffer 並且free掉就ok了。因為是從 buffer 中讀取資料,在你的 callback 被呼叫時資料已經 ready 了,所以程式設計師也就不用考慮阻塞的問題了。

而對寫的處理則更顯巧妙。libuv沒有 write callback ,如果你想寫東西,直接 generate 乙個 write request 連著要寫的 buffer 一起丟給libuvlibuv會把你的 write request 加進相應 socket 的 write queue ,在 i/o 可寫時按順序寫入。

c 沒有閉包,所以確定讀寫上下文是libuv的使用者需要面對的問題。否則程式面對洶湧而來的 buffer 也不能分得清哪個是哪個的資料。在這一點的處理上,libuvlibev一樣,都是使用了乙個void *data來解決問題。你可以用 data 這個 member 儲存任何東西,這樣當 buffer 來的時候,只需要簡單的把 data cast 到你需要的型別就 ok 了。

libev沒有非同步 dns 解析,這一點一直廣為垢病。

libuv有非同步的 dns 解析,解析結果也是通過**的方式通知程式。

libev完全是單執行緒的。

libuv需要多執行緒庫支援,因為其在內部維護了乙個執行緒池來 handle 諸如getaddrinfo(3)這樣的無法非同步的呼叫。

libev不支援iocp,如果需要在 win 下執行的程式會很麻煩。

libuv支援iocp,有相應指令碼編譯 win 下的庫。

libev貌似是作者乙個人在開發,版本管理使用的還是 cvs ,社群參與度明顯不高。

libuv社群十分活躍,幾乎每天都有人提出 issue 並貢獻**。

原文:

同步IO和非同步IO

同步io和非同步io 簡單的說 同步在程式設計裡,一般是指某個io操作執行完後,才可以執行後面的操作。非同步則是,將某個操作給系統,主線程去忙別的事情,等核心完成操作後通知主線程非同步操作已經完成。i windows同步i o與非同步i o 執行後的效果如下 winxp sp2 vc6.0 4 心得...

同步IO和非同步IO

同步io和非同步io 有兩種型別的檔案io同步 同步檔案io和非同步檔案io。非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而 非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請...

同步IO和非同步IO

同步io和非同步io 有兩種型別的檔案io 同步 同步檔案io 和非同步檔案io 非同步檔案io 也就是重疊io 在同步檔案io 中,執行緒啟動乙個io 操作然後就立即進入等待狀態,直到io 操作完成後才醒來繼續執行。而非同步檔案io 方式中,執行緒傳送乙個io 請求到核心,然後繼續處理其他的事情,...