中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
线程和进程的性能比较
作者:未知 时间:2005-09-13 19:17 出处:ChinaUnix.net 责编:chinaitpower
              摘要:线程和进程的性能比较

对于C/S结构的服务器,要支持N个客户连接,对于每个客户的连接,是使用线程还是进程好呢?使用线程的话,速度会比较快,也节约资源,但是实现会比较难,而且线程之间通信和互斥也是个大问题;使用进程的话,与之相反。大家在具体的开发过程中,有没有遇到类似的问题呢?如果要你选择你会使用什么呢?

对于web,ftp服务器的话,一般客户之间不需要通信,所以使用进程的为多,那么大家能找到一些使用多线程开发的服务器例子么?我想参考一下,谢谢:)



 Apache 回复于:2002-08-24 16:03:14
首先,看看平台支不支持;
其次,对于超级服务器,用进程较多,对于并发(重复)服务器,用线程较好。

这两类都用过,就像你说的,各有优缺点,对于并发(重复)服务器,要求较高,即使是进程方式的,对于大的应用要详细检查,避免累计错误。

 问号 回复于:2002-08-24 17:41:52
在服务器端使用的是Linux,支持线程,但是好像有限制,即一个进程只能创建最多256个线程?我的预计目标是一台服务器承载1500个客户端的接入。不管使用线程还是进程都是比较大的开销,使用进程池或者线程池会提高很多效率。

不过我想问一下,线程之间的通信和优先级的区分可以实现么?还有超级服务器一般是怎么样的配置?:)有没有什么特殊的地方?谢谢!

 Apache 回复于:2002-08-24 18:09:34
1500个客户端长连接接入吗?这可需要浩大的服务器啊!(我知道的一些中间件都很少这么做)
我没有用过linux,但好像我听说他不支持核心的线程,这就有很多限制的,具体的我不是很清楚。
你可以采用进程组同线程组来完成你的需求,我以前是采用select的办法处理几千个client的,不过这些client任务不重,就是用进程组和文件描述字池的办法,也可以很好的运行。
超级服务器只支持短连接,就是上来一个请求fork一个进程处理,结束后退出。

 问号 回复于:2002-08-24 18:31:50
连接接入的时间不确定,不过最短也要1-2个小时吧。我的预计,客户端和服务器端之间的信息传输量不会很大,但是会很频繁。

[我以前是采用select的办法处理几千个client的]你有没有对你这个服务器端的程序的性能进行过具体的评估,比如消耗的CPU时间、内存资源?如果有的话,请问你是怎么做的呢?使用第三方的性能检测工具?还有就是所谓的短连接,就是指连接的时间很短是么?

还有一个问题,不太懂,请教一下:)这个link是关于线程的文章,有一句话我不太明白:同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。不知道你有什么见解?谢谢:)
http://www-900.ibm.com/developerWorks/cn/linux/thread/posix_threadapi/part1/index.shtml

 Apache 回复于:2002-08-24 18:45:49
1:关于select,这是一个监控程序,client定时和server通信交换信息,量很小,所以对系统根本不构成什么压力,主要用系统本身的工具检查,如vmstat等。
2:短连接,是指一笔交易、一个通讯过程做一个连接,完成后双方关闭连接。
3:文章我没有看,它的意思是指:对于线程编程的程序,最好在多CPU的机器上运行,这样,我多个线程可以分散在不同的CPU上一起并发运行,对于进程的跨机迁移,我想他的原意是指这样的程序跨平台好移植吧,因为线程在各个系统上的实现有些差异,如有POSIX的,还有solaris自己的。

 问号 回复于:2002-08-25 15:10:40
谢谢:)

 badeager 回复于:2002-08-28 15:29:55
我想,要是想构一个超级服务器,我想还是用线程可能会比较现实,一般一个用户最多可创建108个进程(包括自带SHELL),而线程要比它多得多! 而且线程也可用传递1个变量的指针,要是想传多点可用结构。依次我觉的创建多个子进程作为服务项目去创建线程为客户服务(不管连接时间长短)会比较合理!

 hell 回复于:2002-08-30 11:10:33
用线程实现比较好一点吧,不过你要是有1500个用户长连接的话,首先有一个问题:你的机器支持最多在一个进程中打开多少个文件描述符?如果不支持1500个以上的话,就不用考虑用线程实现了。最保险的方法是些个程序测试一下最多能打开多少个文件。
如果用线程的话,我想不用给每个用户创建一个线程,可以考虑用一个数组保存用户的连接信息,创建一批线程去扫描这个数组。

 问号 回复于:2002-08-30 18:03:34
我现在使用线程池来实现,目前使用red hat 7.3,以下信息是ulimit -a得到的:
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) unlimited
cpu time             (seconds, -t) unlimited
max user processes            (-u) 2047
virtual memory        (kbytes, -v) unlimited

这是从/usr/include/bits/local_lim.h中节选的:
/* The number of threads per process.  */
#define _POSIX_THREAD_THREADS_MAX       64
/* This is the value this implementation supports.  */
#define PTHREAD_THREADS_MAX     1024
很明显,fd的限制是1024,线程的限制也是1024,经过我试验证明。我的问题是如果我修改local_lim.h中的内容,是不是要重新编译内核来实现?


 hell 回复于:2002-08-31 06:02:04
你察看到的fd的限制是1024,这个限制是硬限制和软限制,你可以用unlimit -S -a和unlimit -H -a分别得到限制和软限制,如果硬限制大于1024的话,可以用setrlimit系统调用去增大软限制,但不能大过硬限制。我说的是在AIX,不知道你用的unix版本是否相同,但应该都能实现。如果硬限制是1024,则只有root才能去增加它。

 问号 回复于:2002-09-01 11:42:02
[这个贴子最后由问号在 2002/09/01 05:38pm 编辑]

我察看了一下,软限制和硬限制一样,没戏:(

这是从/usr/include/bits/local_lim.h中节选的:
/* The number of threads per process.  */
#define _POSIX_THREAD_THREADS_MAX       64
/* This is the value this implementation supports.  */
#define PTHREAD_THREADS_MAX     1024

但是从这里可以看出,线程的数量是可以在这里修改的,我想如果修改的话,编译内核应该可以吧?

我做了一个比较,在同一台电脑,单单创建1000个进程和1000个线程,子进程和子线程都定义了相同的简单的变量,还有使用accept等待客户端连接,结果如下:

               耗用内存(MB)                  耗用CPU Time(system + user)
进程             60                              2
线程             15                              20

 lys3000cn 回复于:2002-09-02 10:53:21
不可以线程和进程结合着用吗??
线程和进程不能同时存在吗??

 问号 回复于:2002-09-03 00:25:21
在Linux下面,线程就是轻量级进程(LWP),两者还是有共同点的。线程和进程当然可以同时使用,不过我的水品还不够,能控制好线程就不错了,线程开发中的互斥,条件变量,还有如何安排好全局变量、局部变量和线程变量已经比较头疼了:)我现在在学习r.steven的unix network programming,大师的作品果然不一样,思路非常清晰。

 yuonunix 回复于:2003-07-09 11:11:54
[quote:86def9bec3="问号"]最后由问号在 2002/09/01 05:38pm 编辑]

我察看了一下,软限制和硬限制一样,没戏:(

这是从/usr/include/bits/local_lim.h中节选的:
/* The number of threads per process.  */
#define _POSIX_THREAD_THREADS..........[/quote:86def9bec3]     

你测试的结论是:创建线程比创建进程的时间要大得多。这是否不太准确呀,因为书上说:

创建一个线程的时间比创建一个进程的时间要少成千倍,因为在线程间切换不涉及地址空间的切换。

 yuxq 回复于:2003-08-30 16:54:53
通常来说多线程对于多cpu的机器是效率比较高的,对于单cpu 两者的效率基本是一样的

 yuonunix 回复于:2003-09-01 08:50:38
[quote:baa2452108="yuxq"]通常来说多线程对于多cpu的机器是效率比较高的,对于单cpu 两者的效率基本是一样的[/quote:baa2452108]    

你的意思是说: “多线程和多进程相比,通常来说多线程对于多cpu的机器是效率比较高的,对于单cpu 两者的效率基本是一样的”

还是说:

“多线程和单线程相比,通常来说多线程对于多cpu的机器是效率比较高的,对于单cpu 两者的效率基本是一样的”

你的结论是从书上找来的,还是根据经验,还是根据测试结果得出来的?

 问号 回复于:2004-10-13 10:27:09
[quote:3ce28c432b="yuonunix"]   

你的意思是说: “多线程和多进程相比,通常来说多线程对于多cpu的机器是效率比较高的,对于单cpu 两者的效率基本是一样的”

还是说:

“多线程和单线程相比,通常来说多线程对于多cpu的机器是效率比较..........[/quote:3ce28c432b]

合理的情况下,线程数量应该是CPU*2,这种情况下,能充分发挥多CPU多线程的作用,这是我从很多地方看到的,虽然没有自己亲自试验过,但是我觉得还是有相当多的理论和实践依据的。

 turring 回复于:2004-11-01 16:40:58
怎么发 :em13: 错了贴不能删啊,请版主帮忙删除我的贴了.并非有意灌水~~ :?

 THEBEST 回复于:2004-11-01 17:57:11
都是高手.写服务器,还不知道是怎么回事.:(  路漫漫哪...

 lanying_wzw 回复于:2004-12-23 19:49:41
水平高的话,可以用单进程实现,自己实现对各个客户分配时间片。好像Sybase的数据库服务器就是这么实现的,例如在SCO平台下不支持线程,无论客户有多少连接,服务器总是一个进程。

 JohnBull 回复于:2004-12-23 21:25:07
[quote:cb8ac53987="yuonunix"]   

你的意思是说: “多线程和多进程相比,通常来说多线程对于多cpu的机器是效率比较高的,对于单cpu 两者的效率基本是一样的”

还是说:

“多线程和单线程相比,通常来说多线程对于多cpu的机器是效率比较高的,对于单cpu 两者的效率基本是一样的”

你的结论是从书上找来的,还是根据经验,还是根据测试结果得出来的?
[/quote:cb8ac53987]

太敏锐了!这个问题问到点子上了!
正确的意思是后者。

事实上,线程与进程的效率在很多条件下是完全一样的。至于所谓的IPC效率问题,进程完全可以用共享内存来解决. 而且回顾线程的出现,就是为了解决IPC效率.但线程间过度的资源共享恰恰造成它在冯诺伊曼SMP体系中的IPC效率下降(对RAM子系统的访问趋于串行性),而在NUMA体系实现线程更是脱裤子放屁.多线程技术只能在单片多核心处理器的环境中得益.

所以可以得出结论:在SMP体系中,多线程的效率不高于多进程的效率.

欢迎拍砖!

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有