为何Boost的asio要使用proactor模式实现?

网站建设知识 phpacg 2年前 (2018-04-24) 102次浏览 0个评论

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 上损失一点儿效率。

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址