C HTTP服务器-多线程模型?

| 我目前正在用C编写HTTP服务器,以便我将学习C,网络编程和HTTP。我已经实现了大多数简单的内容,但是一次只能处理一个连接。目前,我正在考虑如何有效地将多任务处理添加到我的项目中。这是我考虑过的一些选项: 每个连接使用一个线程。简单但不能处理许多连接。 仅使用非阻塞API调用,并在一个线程中处理所有内容。听起来很有趣,但是使用ѭ0时,这样的速度过慢,据说非常慢。 其他一些多线程模型,例如像lighttpd这样复杂的用法。 (可能)是最佳解决方案,但(可能)实施起来太困难。 有什么想法吗?     
已邀请:
没有编写多任务网络服务器的最佳模型。不同的平台具有不同的高性能解决方案(I / O完成端口,epoll,kqueue)。要保持最大的可移植性,请谨慎行事:某些功能在其他平台上被模仿(即Windows上提供了“ 0”),并且由于它们仅映射到某些其他本机模型而导致的性能非常差。 此外,还有其他型号未包括在列表中。特别是经典的UNIX“前叉”模型。 在所有情况下,请尽可能使用任何形式的异步I / O。如果不是,请查看非阻塞同步I / O。围绕异步数据流设计HTTP库,但不要使用I / O位。这比听起来要难得多。通常,这意味着为协议解释器编写状态机。 最后一点是最重要的,因为它将允许您尝试不同的表示形式。它甚至可以让您为每个平台本地的高性能工具编写一个紧凑的核心,并将该核心从一个平台交换到另一个平台。     
是的,做一个对您来说有趣的事情。完成后,如果您完全不厌倦该项目,请对该项目进行基准测试,对其进行概要分析,然后尝试其他技术之一。或者,甚至更有趣的是,放弃工作,学习并转移到完全不同的事物上。     
您可以像在node.js中那样使用事件循环: 节点的源代码(C,C ++,JavaScript)   https://github.com/joyent/node Ryan Dahl(node的创建者)概述了node.js,无阻塞io和事件循环的设计背后的原因,这些原因可以替代web服务器中的多线程。   http://www.yuiblog.com/blog/2010/05/20/video-dahl/ 道格拉斯·克罗克福德(Douglas Crockford)在场景6:循环中讨论了事件循环(2010年8月27日,星期五)   http://www.yuiblog.com/blog/2010/08/30/yui-theater-douglas-crockford-crockford-on-javascript-scene-6-loopage-52-min/ 道格拉斯·克罗克福德(Douglas Crockford)的上述讲话的索引(如果需要更多背景信息)。并不是真的适用于您的问题。   http://yuiblog.com/crockford/     
查看您的平台上最有效的套接字轮询模型-
epoll
(linux),
kqueue
(freebsd),
WSAEventSelect
(Windows)。也许与线程池结合,每个线程处理N个连接。您总是可以从
select
开始,然后在工作时替换为更高效的模型。     
一个简单的解决方案可能是具有多个进程:让一个进程接受连接,并在连接建立后立即创建“ 6”并在该子进程中处理该连接。 SER / OpenSER / Kamailio SIP代理使用此技术的一个有趣变体:有一个主进程接受连接,并通过管道连接多个子工作进程。父级通过套接字发送新的文件描述符。请参阅本书的摘录在17.4.2。通过UNIX域套接字传递文件描述符。 OpenSER / Kamailio SIP代理用于处理性能非常重要的重型SIP处理,并且使用此技术非常出色(加上用于信息共享的共享内存)。不过,多线程可能更容易实现。     

要回复问题请先登录注册