linux下网络编程,服务端一般采用异步方式,提高响应速度。
一般的模型是:
1个Event Thread + 几个 (根据cpu核数而定)TaskThread。
Event Thread负责监听端口,接受连接,然后将连接socket分配给TaskThread处理。
我的程序中,Event Thread和TaskThread都使用select异步通信。
如上所说,这种方式可以提高响应速度,缺点是cpu在多个线程中切换,cpu占用率高。
为了在两者间做一个平衡,做了一个测试。
实验1
实验条件:
win7/rhel5.5,硬件相同。
实验过程:
A 50个连接由50个TaskThread处理,
B 50个连接由1个TaskThread处理。
实验预期:
A的cpu占用率远高于B.
实验结果:
windows(win7)上,符合预期。
linux(rhel5.5)上,完全相反。
实验结论:
猜想1.rhel5.5作为专业服务器,对线程调度几乎不花时间。
猜想2.rhel5.5上,select随着FDSET的增大,处理时间远高于线性增长。
实验2
实验条件:
同上
实验过程:(与实验1中A对照)
C 50个连接由2个TaskThread处理。
实验结果:
windows(win7)上,符合预期。
linux(rhel5.5)上,两者持平。
实验结论:
看来猜想2的可能大一些。
实验3
实验条件:
同上
实验过程:D 1个TaskThread处理1到50个连接,逐次增加。
记录10,20,30,40,50个连接时,select的处理时间,验证上面的猜想2。
土鳖