爲什麼Boost的asio要使用proactor模式實現?

Linux下高性能的網絡庫中大多使用的Reactor 模式去實現,Boost Asio在Linux下用epoll和select去模擬proactor模式,影響了它的效率和實現複雜度,
看陳碩的本身的Linux下Reactor網絡庫和ASIO的性能對比,大概比asio性能(吞吐量)高1/5.既然Linux下網絡庫用Reactor性能才高,爲何Boost ASIO Linux下要用模擬的Proactor模式?
或者說爲何ASIO不在win和linux都用Reactor模式?這樣的選擇是否是能夠性能更好?和更加適應市場?服務器端畢竟大量都是Linux. linux

 

Windows 下很難實現高效可伸縮的 Reactor。首先,Win32 API 裏 WaitForMultipleObjects 只能同時等待 64 個 handle (MAXIMUM_WAIT_OBJECTS);其次 WinSock 的 select() 實現又很 buggy,特別是在錯誤處理方面有不少奇葩行爲(具體見各類跨平臺網絡庫代碼中對此的註釋);最後,Windows Vista 新增的 WSAPoll() 函數與 POSIX 的 poll() 又不盡兼容。

Windows 有本身的一套高效異步IO模型(幾乎等同於Proactor),同時支持文件IO和網絡IO;但 Linux 只有高效的網絡同步IO(epoll 之類的 io multiplexing 是同步的Reactor,且不支持磁盤文件),兩者的高效IO編程模型從根本上不兼容(Windows 能夠把網絡事件發到 GUI 線程的事件隊列中,有點相似 Reactor,可是彷佛一個進程只能有一個 GUI 線程,所以在多核系統上其伸縮性受限)。

所以,ASIO 要想高效且跨平臺,只能用 Proactor 模型了。不可避免地會在 Linux 上損失一點兒效率。
相關文章
相關標籤/搜索