服务器公共组件实现 -- 环形缓冲区

消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了。频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行。也许我们可以使用内存池,比如SGI STL中附带的小内存分配器。但是对于这种按照严格的先进先出顺序处理的,块大小并不算小的,而且块大小也并不统一的内存分配情况来说,更多使用的是一种叫做环形缓冲区的方案,mangos的网络代码中也有这么一个东西,其原理也是比较简单的。

  就好比两个人围着一张圆形的桌子在追逐,跑的人被网络IO线程所控制,当写入数据时,这个人就往前跑;追的人就是逻辑线程,会一直往前追直到追上跑的人。如果追上了怎么办?那就是没有数据可读了,先等会儿呗,等跑的人向前跑几步了再追,总不能让游戏没得玩了吧。那要是追的人跑的太慢,跑的人转了一圈过来反追上追的人了呢?那您也先歇会儿吧。要是一直这么反着追,估计您就只能换一个跑的更快的追逐者了,要不这游戏还真没法玩下去。

  前面我们特别强调了,按照严格的先进先出顺序进行处理,这是环形缓冲区的使用必须遵守的一项要求。也就是,大家都得遵守规定,追的人不能从桌子上跨过去,跑的人当然也不允许反过来跑。至于为什么,不需要多做解释了吧。

  环形缓冲区是一项很好的技术,不用频繁的分配内存,而且在大多数情况下,内存的反复使用也使得我们能用更少的内存块做更多的事。

  在网络IO线程中,我们会为每一个连接都准备一个环形缓冲区,用于临时存放接收到的数据,以应付半包及粘包的情况。在解包及解密完成后,我们会将这个数据包复制到逻辑线程消息队列中,如果我们只使用一个队列,那这里也将会是个环形缓冲区,IO线程往里写,逻辑线程在后面读,互相追逐。可要是我们使用了前面介绍的优化方案后,可能这里便不再需要环形缓冲区了,至少我们并不再需要他们是环形的了。因为我们对同一个队列不再会出现同时读和写的情况,每个队列在写满后交给逻辑线程去读,逻辑线程读完后清空队列再交给IO线程去写,一段固定大小的缓冲区即可。没关系,这么好的技术,在别的地方一定也会用到的。

时间: 2024-09-20 04:10:08

服务器公共组件实现 -- 环形缓冲区的相关文章

windows server 2003 frontpage服务器扩展组件怎么卸载呀

问题描述 windows server 2003 frontpage服务器扩展组件怎么卸载呀 我想升级2003到2008但是不能升级,要卸载Frongtpage才可以升级,但是我在组件里面都取消它为什么还说有呢,要怎么卸载? 解决方案 Frontpage好像是微软做网页的软件吧!在卸载程序里面看看

asp上传出错-win2008 服务器 无组件上传图片 小于100K提示参数错误

问题描述 win2008 服务器 无组件上传图片 小于100K提示参数错误 win2008 服务器 无组件上传图片 小于100K提示参数错误 程序本地测试没问题上传到服务器上就这个问题很纠结

嵌入式 环形缓冲区的设计与实现

环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在一个视频处理的机制中,环形缓冲区就可以理解为数据码流的通道,每一个通道都对应着一个环形缓冲区,这样数据在读取和写入的时候都可以在这个缓冲区里循环进行,程序员可以根据自己需要的数据大小来决定自己使用的缓冲区大小.          环形缓冲区,顾名思义这个缓冲区是环形的,那么何谓环形这个意思也很好理解,就是用一个指针去访问该缓冲区的最后一个内存位置的的后一位置时回到环形缓冲区的起点.类似一个环一样.这样形容就很好理解了,当然有办法实现了.我在这

线程安全的环形缓冲区实现

来源:http://blog.csdn.net/lezhiyong    应用背景:线程1将每次数量不一的音频采样点(PCM音频数据)写入环形缓冲区,线程2每次取固定数量采样点送音频编码器,线程1线程2在平均时间内的读写数据量相等.(倒入桶中的水量有时大有时小,但每次取一瓢喝:)   该环形缓冲区借鉴CoolPlayer音频播放器中的环形缓冲区代码实现,在读写操作函数中加了锁,允许多线程同时操作.CPs_CircleBuffer基于内存段的读写,比用模板实现的环形缓冲队列适用的数据类型更广些,

C 语言中实现环形缓冲区_C 语言

1.实现代码: #include #include #include #include #include #define BUFFSIZE 1024 * 1024 #define min(x, y) ((x) < (y) ? (x) : (y)) pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; struct cycle_buffer { unsigned char *buf; unsigned int size; unsigned int in

C#环形缓冲区(队列)完全实现_C#教程

公司项目中经常设计到串口通信,TCP通信,而且大多都是实时的大数据的传输,然后大家都知道协议通讯肯定涉及到什么,封包.拆包.粘包.校验--什么鬼的概念一大堆,说简单点儿就是要一个高效率可复用的缓存区.按照码农的惯性思维就是去百度.谷歌搜索看有没有现成的东西可以直接拿来用,然而我并没有找到,好吧不是很难的东西自己实现一个呗.开扯--  为什么要用环形队列?环形队列是在实际编程极为有用的数据结构,它有如下特点: 它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单.能很快知道队列是

服务器部分组件(FSO、XMLDOM、MSXML2)的安装方法

dom|fso|xml|分组|服务器 描述:管理过服务器的朋友都连接组件的重要性,windows系统老是出现一些错误,好好的就会某个服务出错. 没有办法不学点东西真是无法应付现在的职位:网管,真想把学校的老师都抓来痛扁,在学校那么多年为什么就不教我们一些实用的东西,全部还要我们工作以后再自己学呢? 我学了好长时间,先整理了三个组件出来,因为管理过虚拟主机的朋友,一定是知道他们的重要性了,好废话不说,看技术: 关键组件: (缺少关键组件的服务器会不支持很多网站,会丢失很多客户) Scripting

服务器常用组件_应用技巧

1.上传组件: SA-FileUp V5.0.14_eval 例如BBSXP,急速论坛等他们都喜欢使用这个组件,如果你要卖空间,服务器可能要安装这个哟 下载地址:http://www.qcode.org/soft/6/26/2006/2006031112224.html lyf刘宇锋上传组件 v1.2B,这个东西让我第一次感觉到国产组件其实也很优秀 http://www.qcode.org/soft/1/09/2006/200603093257.html AspUpload v3.0.0.5 特

服务器常用组件

1.上传组件: SA-FileUp V5.0.14_eval 例如BBSXP,急速论坛等他们都喜欢使用这个组件,如果你要卖空间,服务器可能要安装这个哟 下载地址:http://www.qcode.org/soft/6/26/2006/2006031112224.html lyf刘宇锋上传组件 v1.2B,这个东西让我第一次感觉到国产组件其实也很优秀 http://www.qcode.org/soft/1/09/2006/200603093257.html AspUpload v3.0.0.5 特