我目前正在用C编写HTTP服务器,以便了解C、网络编程和HTTP。我已经实现了大多数简单的东西,但我一次只处理一个连接。目前,我正在考虑如何有效地将多任务添加到我的项目中。以下是我考虑过的一些选择:
select()和这样的过度被认为是相当慢的。对此有什么想法吗?
发布于 2011-04-15 21:05:30
对于编写多任务的网络服务器,没有单一的最佳模型。不同的平台有不同的高性能解决方案(I/O完成端口、epoll、kqueues)。在获得最大可移植性时要小心:一些特性在其他平台上被模仿(即select()在Windows上可用),并且性能非常差,因为它们只是映射到其他一些本地模型上。
此外,您的列表中还没有包括其他型号。特别是经典的UNIX“预叉”模型。
在所有情况下,在可用时使用任何形式的异步I/O。如果不是,请查看非阻塞同步I/O。设计围绕异步数据流的HTTP库,但不要使用I/O。这比听起来难得多。它通常意味着为协议解释器编写状态机。
最后一点是最重要的,因为它将允许您尝试不同的表示形式。它甚至允许您为每个平台编写一个紧凑的内核--本地的、高性能的工具,并将这个核心从一个平台切换到另一个平台。
发布于 2011-04-15 20:13:46
是的,做一个你感兴趣的事。当您完成它时,如果您还没有完全厌倦这个项目,那么对其进行基准测试,分析它,并尝试其他技术之一。或者,更有趣的是,放弃工作,学习知识,继续做完全不同的事情。
发布于 2011-04-15 21:27:13
您可以使用一个事件循环,如node.js:中的
节点源代码(c,c++,javascript)
Ryan (节点的创建者)概述了node.js、非阻塞io和事件循环作为non服务器中多线程的替代设计的理由。
http://www.yuiblog.com/blog/2010/05/20/video-dahl/
道格拉斯·克罗克福德在第6场讨论了事件循环: Loopage (2010年8月27日,星期五)
http://www.yuiblog.com/blog/2010/08/30/yui-theater-douglas-crockford-crockford-on-javascript-scene-6-loopage-52-min/
道格拉斯·克罗克福德上述谈话的索引(如果需要更多的背景信息)。但并不适用于你的问题。
http://yuiblog.com/crockford/
https://stackoverflow.com/questions/5681853
复制相似问题