web服务器并发策略无外乎从连接方式和IO策略上做文章了。
连接方式有短连接和长连接之分,并且也有单进程和多进程之分。
IO策略有阻塞和非阻塞之分,也有同步和异步之分。
以上这些概念不做过多解释,关键看看有哪些组合,其实常见的web服务器并发策略就是这些方式的组合。
- 一个进程处理一个连接,非阻塞I/O
这种策略下又分为:
1)主进程使用非阻塞啊accept()来接收连接,当建立连接后,主进程将任务分配给空闲的子进程来处理
2)所有子进程使用阻塞accept()来竞争接收连接,一旦一个子进程建立连接后,它将继续进行处理
其中,apache prefork采用方式2,这样的好处是简单和健壮,子进程间不受干扰,但缺点很明细,占用内存很高,并且进程的新建和销毁也很耗性能。 - 一个线程处理一个连接,非阻塞I/O
apache worker采取这种模式,可以减少资源的消耗,但由于线程间共享数据,因此互相之间会有影响,另外线程间的切换也很消耗资源 - 一个进程处理多个连接,非阻塞I/O
基于多路I/O就绪通知,基于epoll方式会表现良好 - 一个进程处理多个连接,异步I/O
不够成熟,应用较少