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

原创 2007年09月20日 23:01:00

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

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

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

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

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

Mangos源码分析(9):服务器公共组件实现之环形缓冲区

消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了。频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行。也许我们可以...
  • u011686361
  • u011686361
  • 2015年09月10日 15:19
  • 326

服务器公共组件实现2

服务器公共组件 -- 事件与信号   关于这一节,这几天已经打了好几遍草稿,总觉得说不清楚,也不好组织这些内容,但是打铁要趁热,为避免热情消退,先整理一点东西放这,好继续下面的主题,以后如果有机...
  • robin2659
  • robin2659
  • 2014年08月20日 13:47
  • 255

服务器公共组件实现 -- 消息队列

  既然说到了消息队列,那我们继续来稍微多聊一点吧。  我们所能想到的最简单的消息队列可能就是使用stl的list来实现了,即消息队列内部维护一个list和一个互斥锁,putMessage时将mess...
  • lfhfut
  • lfhfut
  • 2007年09月20日 22:10
  • 3774

服务器公共组件实现 -- 状态机

  有关State模式的设计意图及实现就不从设计模式中摘抄了,我们只来看看游戏服务器编程中如何使用State设计模式。  首先还是从mangos的代码开始看起,我们注意到登录服在处理客户端发来的消息时...
  • lfhfut
  • lfhfut
  • 2007年09月24日 22:04
  • 3122

服务器公共组件实现1

服务器公共组件实现 -- 环形缓冲区   消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了。频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,...
  • robin2659
  • robin2659
  • 2014年08月20日 13:46
  • 188

环形缓冲区实现总结

环形缓冲区的数据结构 1.typedef struct {     char buf[DATA_LENGTH];     char head;     char tail;     c...
  • EDman_linux
  • EDman_linux
  • 2018年01月04日 17:28
  • 62

环形缓冲区的应用ringbuffer

在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。 1、环形缓冲区的实现原理 环形缓冲区通常有一个读...
  • u011046042
  • u011046042
  • 2016年07月07日 19:29
  • 5930

C++ 无锁环形缓冲区实现

前段时间有个项目要实现一个基于live555的rtspserver,部分功能要用到环形缓冲区,网上看了一些blog,大部分是实验性质的,不太敢用,原理比较简单,所以就自己写了一个; 实现环形缓冲区的关...
  • LIFEXX
  • LIFEXX
  • 2016年06月26日 20:38
  • 1845

基于环形缓冲区的deque实现方法

众所周知,C++ STL中有一个叫做deque的容器,实现的是双端队列数据结构,这种队列允许同时从队列的首部和尾部插入和删除数据。 然而在STL中这种数据结构是用”分段连续”的物理结构实现的(可以参...
  • vipally
  • vipally
  • 2016年10月20日 00:50
  • 607

环形缓冲区的C语言实现

#include   #include    #include   #include   #include   #define BUFFSIZE 1024 * 1024   #...
  • u014353386
  • u014353386
  • 2016年04月01日 01:37
  • 2647
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务器公共组件实现 -- 环形缓冲区
举报原因:
原因补充:

(最多只允许输入30个字)