百科问答小站 logo
百科问答小站 font logo



为何 Boost 的 Asio 要使用 Proactor 模式实现? 第1页

  

user avatar   liu-zhi-cong-80 网友的相关建议: 
      

Proactor的编程模型相比Reactor要更自然一些,而且在操作系统有支持的情况下,能获得更好的性能.所以一个通用网络库,选择Proactor作为接口语义并不奇怪.只是他们没想到,Linux社区对于填上aio的坑并没太大的动力(或则足够的实力?),这基于epoll的模拟Proactor实现一用就是数十年~


user avatar   giantchen 网友的相关建议: 
      

Windows 下很难实现高效可伸缩的 Reactor。首先,Win32 API 里 WaitForMultipleObjects 只能同时等待 64 个 handle (MAXIMUM_WAIT_OBJECTS);其次 WinSock 的 select() 实现又很 buggy,特别是在错误处理方面有很多奇葩行为(具体见各种跨平台网络库代码中对此的注释);最后,Windows Vista 新增的 WSAPoll() 函数与 POSIX 的 poll() 又不尽兼容( daniel.haxx.se/blog/201 )。

Windows 有自己的一套高效异步IO模型(几乎等同于Proactor),同时支持文件IO和网络IO;但 Linux 只有高效的网络同步IO(epoll 之类的 io multiplexing 是同步的Reactor,且不支持磁盘文件),二者的高效IO编程模型从根本上不兼容(Windows 可以把网络事件发到 GUI 线程的事件队列中,有点类似 Reactor,但是似乎一个进程只能有一个 GUI 线程,因此在多核系统上其伸缩性受限)。

因此,ASIO 要想高效且跨平台,只能用 Proactor 模型了。不可避免地会在 Linux 上损失一点儿效率。




  

相关话题

  为什么有很多人执着于中文编程? 
  C++ 运动完上一个函数到下一个函数时,上一个函数里的变量值(结构体变量)为什么没保留住,变成零了? 
  编程中,有哪些好的习惯从一开始就值得坚持? 
  随着互联网的崛起,还有必要学习 C++ 吗?貌似 C++ 越来越难找工作了... 
  为什么说C++的main函数最后不写 return 0; 是不好的习惯? 
  计算机语言是如何做到靠0和1就表达出这么多东西的? 
  Linus Torvalds 的 C++ 水平如何,为什么他敢炮轰此编程语言? 
  C++ STL中的map用红黑树实现,搜索效率是O(lgN),为什么不像python一样用散列表从而获得常数级搜索效率呢? 
  运行时异常处理程序是如何实现的? 
  关于Qt性能的损失,有没有一个可以量化的概念? 

前一个讨论
iPhone 6s Plus 夜拍噪点已经夸张到不能使用了?
下一个讨论
如何看待新闻“四川海关截获400只活体蚂蚁入境”?





© 2025-05-28 - tinynew.org. All Rights Reserved.
© 2025-05-28 - tinynew.org. 保留所有权利