| 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体系中,多线程的效率不高于多进程的效率.
欢迎拍砖!
|