liumilan2009 发表于 2013-06-27 00:09

多线程疑问

面试被问到了一个题目,服务器接受客户端请求时候,一个连接就会创建一个线程。然后如何保证这服务器的连接数控制在每秒200个连接。当时回答是关于线程同步的原理,但是由于只是看过环境高级编程的书,回答得很浅显。不知道这种情况一般怎么解决?怎么保证服务器控制在每秒200个连接?

timespace 发表于 2013-06-27 07:52

什么叫“每秒200连接”?不懂你意思。BTW, 看明白APUE,回答不会浅显的。

流氓无产者 发表于 2013-06-27 09:30

我也不懂,大概就是每秒统计一次,放到一个全局中吧
来个connection,+1比较是否大于200
估计,面试官是这么实现的,还挺得意:outu:

liumilan2009 发表于 2013-06-27 10:10

有多个线程,每个线程要处理多少个连接啊?而且怎么保证线程同步啊?还有更好的答案吗

linux_c_py_php 发表于 2013-06-27 10:33

控制监听线程的accept频率啊, 做一个rate结构,每次accpet+1,判断是否在1秒内200次了,是就accept了立马close。

liumilan2009 发表于 2013-06-27 17:43

还是不太清楚,是否有开源的项目学习多线程的?

libevent如何?nginx之类的代码似乎多了点

卖萌犯法 发表于 2013-06-27 21:12

你这跟线程同步也没啥关系啊,控制连接数应该在 listen 的线程里做,其他线程都是相互独立运行,互相之间不会同步

卖萌犯法 发表于 2013-06-27 21:15

另,这种限制一般不会编程实现,都是用 iptables 或 tc 这类的命令实现

liumilan2009 发表于 2013-06-28 00:16

是不是就是socket里面的listen()函数,里面的参数值就是要入队的连接请求数量

卖萌犯法 发表于 2013-06-28 11:00

是不是就是socket里面的listen()函数,里面的参数值就是要入队的连接请求数量
不是的,listen 的参数是允许对请求排队的数量。
也就是说,如果listen不能立即响应,则系统会把连接请求缓存到队列,来等待下一次的listen。
listen的参数就是这个队列的长度。

每秒200个连接
这种限定是没什么道理的,因为每个连接的处理时间不一样,如果处理时间很短,则造成系统资源浪费(系统空闲,却丢弃大量请求),如果处理时间很长,则会创建大量线程,将系统资源耗尽,甚至导致异常(单进程内线程总数超过系统限定值)。

我觉得提出这种问题的人,水平不会很高。

合理的限定应当是控制在线连接总数,也就是创建线程的总数(不过这也已经是很老的处理方式了,目前的web服务器或ftp服务器都不会这样做,而是采用其他的内部负载均衡算法,比如LRU)。
页: [1]
查看完整版本: 多线程疑问