ryy*_*yst 5 c unix multithreading network-programming
我目前正在用 C 语言编写一个 HTTP 服务器,以便学习 C、网络编程和 HTTP。我已经实现了大部分简单的东西,但我一次只处理一个连接。目前,我正在考虑如何有效地将多任务添加到我的项目中。以下是我考虑过的一些选项:
select()过度使用 s 据说会很慢。对此有什么想法吗?
编写多任务网络服务器没有单一的最佳模型。不同的平台有不同的高性能解决方案(I/O完成端口、epoll、kqueues)。在追求最大可移植性时要小心:某些功能在其他平台上被模仿(即select()在 Windows 上可用),并且性能非常差,因为它们只是映射到其他一些本机模型。
此外,还有其他型号未包含在您的列表中。特别是经典的 UNIX“预分叉”模型。
在所有情况下,请使用任何形式的异步 I/O(如果可用)。如果不是,请研究非阻塞同步 I/O。围绕异步数据流设计您的 HTTP 库,但不要将 I/O 位放在其中。这比听起来要困难得多。它通常意味着为协议解释器编写状态机。
最后一点是最重要的,因为它允许您尝试不同的表示形式。它甚至可能允许您为每个平台本地高性能工具编写一个紧凑的核心,并将该核心从一个平台交换到另一个平台。