[转载]多线程还是多进程??

转载自:http://hi.baidu.com/yancncen/blog/item/b43bf4fee7c7c4385d6008de.html

最近,看了几个开源代码的server框架,有了一些自己的想法,把它记下来。

针对server要求高性能的同时还需要稳定性的特点,有了这样一个构思,建立一个EPOLL+多进程+线程池的server框架,暂且叫它emptyServer(e:epoll,m:muti,p:process,t:thread,y:ycc.哈哈)。

考虑的出发点如下:

(1) 为什么用epoll?

众所周知的原因,这里就不多说了。

(2) 为什么使用多进程模型?

在emptyServer框架中,多进程的想法来源于apache和lighttpd。它的作用是多个进程共享监听socket,当有连接过来时,唤醒其中一个进程处理,这样可以保证了emptyServer的稳定性,又可以提高emptyServer的处理能力。

也许,大家会想,这不就会引起“惊群”问题了吗?linux2.4以后的内核版本,已经解决了“惊群”问题,所以不需要担心“惊群”影响性能。

注:“惊群”问题,多进程共享监听socket,当有请求过来时,系统会唤醒所有的进程,从而造成系统颠簸使性能严重下降。

(3) 为什么要使用线程池?

线程池的作用:线程处理具体的逻辑,不参与主线程的网络IO,通过socketpair与主线程交互。

使用线程是基于以下的考虑:

1) 对于耗时比较长的逻辑,如数据库访问、复杂数值计算等,如果不启用另外的线程处理,主线程就会把时间都花在处理逻辑上,就会影响网络IO的处理和其它请求的逻辑处理,从而影响整体性能。

2) 现在的服务器基本上都是多核多cpu的,通过多线程,可以把线程映射到不同的cpu去执行,充分利用多核多cpu的处理能力。

下面,给出一个粗略的流程图,打算8月初开始实现emptyServer。
 

One thought on “[转载]多线程还是多进程??

Leave a Reply

Your email address will not be published.