站在巨人的肩膀是骗人的
2013年(28)
分类: 架构设计与优化
2013-01-18 10:58:41
email:tinysrc@163.com
qq:744271556
什么是asio?
asio旨在提供一个平台独立、高吞吐量、低延迟、易扩展的io服务。
asio是如何实现平台独立?
这个平台独立,是操作系统平台的独立,而不是硬件平台。对于io服务,只需要关注、依赖于完备成熟的操作系统,比如windows、linux、solaris等。
因为我们需要考虑某个平台的tcp/ip stack、thread、atomic operation、io model(select?iocp?epoll?kqueue?)等,而对于成熟平台来说,它的特征多,就容易达成高吞吐量、低延迟的目标。
说到平台独立,大家最先想到用c来实现?可以依赖于apache的apr啊?asio为了高效以及代码的优雅,选择了使用了c++模板。有人说服务端只在linux/bsd上,就只写这个平台的实现,不是更高效?
说的没错,但是任何优雅的东西,都是效率与设计的权衡,如果纯粹为了效率,为何要去做操作系统,直接写机器码是了。再说,从宏观的角度,不是任何东西都值得去优化。如果你真的读懂了
asio,你就会懂asio的KISS原则。
asio是如何抽象的?
asio的文件层次结构就是它抽象最好的表述。
io_service作为asio的第一层的核心抽象,它的实现是放在了当前目录下面的impl目录里,而针对io_service的具体细节实现都放在当前目录下面的detail目录里(参阅上图)。
针对posix操作系统的一些特征都放在asio目录下面的posix目录里,针对windows操作的一些特征都放在asio目录下的windows目录里。
asio是提供对file_descriptor的io服务而不局限在网络socket,所以ip的一些特征都放在ip目录里,因为ssl作为一个安全套接字层(介于传输层和应用层间),也特意放到ssl目录里。
asio如何实现高吞吐量、低延迟?
这个内容比较多,asio是如何权衡高效与优雅两面而实现高吞吐量和低延迟的,将在后续分析博文中分享。
asio如何实现易扩展性?
一个应用程序的线程模型是由具体业务决定,所以asio不会强制使用者必须遵循于某一种线程模型,所以你可以fork若干根线程作为io_service的工作线程,当然你也可以让主程序作为io_service的工作线程。
而且你一个进程里可以有多个io_service,io_service也可以被层次地使用。这大大地给库使用者提供了很大的便利。