打印

几个并发访问的讨论

[复制链接]
829|4
手机看帖
扫描二维码
随时随地手机跟帖
沙发
keer_zu|  楼主 | 2018-1-26 00:52 | 只看该作者

I/O 框架
以下所列的为几个包装好的库,它们抽象出了一些下面所表达的技术,并且可以使你的代码与具体操作系统隔离,从而具有更好的移植性。
·      ACE, 一个重量级的C++ I/O框架,用面向对象实现了一些I/O策略和其它有用的东西,特别的,它的Reactor框架是用OO方式处理非阻塞I/O,而Proactor框架是用OO方式处理异步I/O的。
·      ASIO 一个C++的I/O框架,正在成为Boost库的一部分。它像是ACE过渡到STL时代。(译注:ACE内部有自己的容器实现,它和C++ 标准库中的容器是不兼容的。)
·      libevent 由Niels Provos用C 语言编写的一个轻量级的I/O框架。它支持kqueue和select,并且很快就可以支持poll和epoll(翻译此文时已经支持)。我想它应该是只采用了水平触发机制,该机制功过参半。Niels给出了 一张图 来说明时间和连接数目在处理一个事件上的功能,从图上可以看出kqueue和sys_epoll明显胜出。
·     我本人也尝试过写一个轻量级的框架(很可惜没有维持至今):
          o      Poller 是一个轻量级的C++ I/O框架,它使用任何一种准备就绪API(poll, select, /dev/poll, kqueue, sigio)实现水平触发准备就绪API。以其它 不同的API为基准,Poller的性能好得多。该链接文档的下面一部分说明了如何使用这些准备就绪API。
          o      rn 是一个轻量级的C I/O框架,也是我继Poller后的第二个框架。该框架可以很容易的被用于商业应用中,也容易的适用于非C++应用中。它如今已经在几个商业产品中使用。
·     2000年4月,Matt Welsh就构建服务器如何平衡工作线程和事件驱动技术的使用方面写了一篇 论文,在该论文中描述了他自己的Sandstorm I/O框架。
·      Cory Nelson's Scale! library - 一个Windows下的异步套接字,文件和管道的I/O库。

使用特权

评论回复
板凳
keer_zu|  楼主 | 2018-1-26 00:56 | 只看该作者
C10K问题

为什么可以支撑这么高并发的请求呢?我们先从C10K问题说起:2001年左右的时候,有一个叫Dan Kegel的人在网上提出:现在的硬件应该能够让一台机器支持10000个并发的client。然后他讨论了用不同的方式实现大规模并发服务的技术。

http://www.kegel.com/c10k.html (英文版)

http://www.oschina.net/translate/c10k (中文翻译版)
http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html

当然, 现在C10K 已经不是问题了, 任何一个普通的程序员, 都能利用手边的语言和库, 轻松地写出 C10K 的服务器. 这既得益于软件的进步, 也得益于硬件性能的提高,现在应该扩展讨论的是应该是C10M问题了。

参考资料:

千万级并发实现的秘密:内核不是解决方案,而是问题所在!
http://www.csdn.net/article/2013 ... current-Connections

使用特权

评论回复
地板
keer_zu|  楼主 | 2018-1-26 00:56 | 只看该作者
Coroutine模型 和 非阻塞/异步IO(callback)

不论线程还是进程,都不可能一个连接创建一个,相应的成本太大,多进程和多线程都有资源耗费比较大的问题,所以在高并发量的服务器端使用并不多。解决方案是一个线程或者进程处理多个连接,更具体的现在比较主流的是:Coroutine模型 和 非阻塞/异步IO(callback),在分析这两个之前,我们先看看多进程和多线程的情况。
多进程

这种模型在linux下面的服务程序广泛采用,比如大名鼎鼎的apache。

下图说明了Apache的生命周期(prefork模式)。主进程负责监听和管理连接,而具体的业务处理都会交给子进程来处理。

使用特权

评论回复
5
keer_zu|  楼主 | 2018-1-26 00:57 | 只看该作者
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1352

主题

12436

帖子

53

粉丝