文中多个片段摘自陈硕老师的《Linux多线程服务端编程-使用muduo C++网络库》,特整理于此,备学习、工作使用。
12种常见的并发网络服务程序设计方案
方案 0:
这其实不是并发服务器,而是 iterative 服务器,因为它一次只能服务一个客户。代码见 UNP figure 1.9,UNP 以此为对比其他方案的基准点。
这个方案不适合长连接,到是很适合 daytime 这种 write-only 短连接服务。
方案 1:
这是传统的 Unix 并发网络编程方案,UNP 称之为 child-per-client 或 fork()-per-client,另外也俗称 process-per-connection。这种方案适合
并发连接数不大的情况。至今仍有一些网络服务程序用这种方式实现,比如 PostgreSQL 和 Perforce 的服务端。这种方案适合“计算响应的工作量
远大于 fork() 的开销”这种情况,比如数据库服务器。这种方案适合长连接,但不太适合短连接,因为 fork() 开销大于求解计算响应的用时。
方案 2 :
这是传统的 Java 网络编程方案 thread-per-connection,在 Java 1.4 引入 NIO之前,Java 网络服务程序多采用这种方案。它的初始化开销比方案 1
要小很多。这种方案的伸缩性受到线程数的限制,一两百个还行,几千个的话对操作系统的scheduler 恐怕是个不小的负担。
方案 3:
这是针对方案 1 的优化,UNP 详细分析了几种变化,包括对 accept 惊群问题(多个进程阻塞在accept)的考虑。
方案 4:
这是对方案 2 的优化,UNP 详细分析了它的几种变化。3 和 4 这两个方案都是 Apache httpd 长期使用的方案。