![](https://csdnimg.cn/release/download_crawler_static/86327690/bg1.jpg)
陈硕的 Blog
《多线程服务器的适用场合》例释与答疑
陈硕 (giantchen_AT_gmail)
Blog.csdn.net/Solstice
2010 March 3 - rev 01
《多线程服务器的适用场合》(以下简称《适用场合》)一文在博客登出之后,有热心读者提出质疑,我自己也觉得原文没
有把道理说通说透,这篇文章试图用一些实例来解答读者的疑问。我本来打算修改原文,但是考虑到已经读过的读者不一定
会注意到文章的变动,干脆另写一篇。为方便阅读,本文以问答体呈现。这篇文章可能会反复修改扩充,请注意上面的版本
号。
本文所说的“多线程服务器”的定义与前文一样,同时参见《多线程服务器的常用编程模型》(以下简称《常用模型》)一文
的详细界定,以下“连接、端口”均指 TCP 协议。
1. Linux 能同时启动多少个线程?
对于 32-bit Linux,一个进程的地址空间是 4G,其中用户态能访问 3G 左右,而一个线程的默认栈 (stack) 大小是
10M,心算可知,一个进程大约最多能同时启动 300 个线程。如果不改线程的调用栈大小的话,300 左右是上限,因为程
序的其他部分(数据段、代码段、堆、动态库、等等)同样要占用内存(地址空间)。
对于 64-bit 系统,线程数目可大大增加,具体数字我没有测试,因为我实际用不到那么多线程。
以下的关于线程数目的讨论以 32-bit Linux 为例。
2. 多线程能提高并发度吗?
如果指的是“并发连接数”,不能。
由问题 1 可知,假如单纯采用 thread per connection 的模型,那么并发连接数最多 300,这远远低于基于事件的单线程
程序所能轻松达到的并发连接数(几千上万,甚至几万)。所谓“基于事件”,指的是用 IO multiplexing event loop 的编
程模型,又称 Reactor 模式,在《常用模型》一文中已有介绍。
那么采用《常用模型》一文中推荐的 event loop per thread 呢?至少不逊于单线程程序。
小结:thread per connection 不适合高并发场合,其 scalability 不佳。event loop per thread 的并发度不比单线程程
序差。
吾尝终日而思矣,不如须臾之所学也。吾尝跂而望矣,不如登高之博见也。……君子生非异也,善假于物也。
< 2010年3月 >
日 一 二 三 四 五 六
28 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10
导航
博客园
首页
新随笔
联系
订阅
管理
统计
随笔 - 73
文章 - 0
评论 - 411
引用 - 0
公告
本人博客的文章均为原创作品,除非另
有声明。个人转载或引用时请保留本人
的署名及博客网址,商业转载请事先联
系,我的 gmail 用户名是 giantchen。
昵称:陈硕
园龄:9年
粉丝:1170
关注:0
+加关注
搜索