c++服务端程序基本结构

来源:互联网 发布:淘宝网狗窝 编辑:程序博客网 时间:2024/05/13 23:56

这里说一下,简单的说下自己几年来用c++写服务端程序的经验。。

 

 

基本架构:

 

         tcp 一个线程来管理连接,如果是阻塞式的至少还得有一个线程来接收数据,非阻塞式的一般不用另外一个线程来接收数据了(性能瓶颈不在这个地方),如果是阻塞式得还得有N个逻辑线程,接收来的数据放入到队列由逻辑线程去操作。。

     udp和上所说相同,不过有一点要说的是,可能有些人倾向于,创建一个邦定端口的udp socket,创建N个逻辑线程来用这一个socket边接收处理,理由是这样可以避免接收队列同步,优化性能。可我要说,这里的优化性能是相对的。比如,程序启动时这N个逻辑线程几乎同时(这个时间相对应用处理时间可以忽略不计)接收了N个包,你能保证这个N个线程中的一个在下个包到来时能够已经在recv上等待着吗,如果不是,那么这个时间UDP包超出网卡缓冲区时,呵呵,就被无情的丢弃了。缓冲队列延伸或者说扩充了网卡的缓冲区,省了那点同步队列的性能,冒着丢包的危险得不尝失吧。。

 

 

   还有一个对内存分配上,能用缓冲尽量用缓冲(如内存池),频繁的new delete ,window下会有内存碎片的问题,linux下高手告诉我不会有这个问题,但是new的代价是高昂的,你可以VC下看看new做了什么,不仅有同步,还有其它一堆代码,这比你在内存池中获得到一个锁,然后从队列里取出一个指针,我估计要慢上不至一个数量级。

 

 

    在服务端程序的时候会用到stl,比如 string vector等。。在用的时候预先分配下内存比自动分配性能要好些,reserve函数就是这个作用,因为底层用new来分配,一次new总比多次new要快些吧

   只是些个人拙见,有什么高见可以一起探讨下。来邮件也可 gaoxiaotiger@sina.com

当然了,大家贴些代码也可一起研究下。。。