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

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

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

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

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

转载于:https://www.cnblogs.com/zhangjing0502/archive/2012/05/25/2518470.html

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

  1. kazoo源码分析:服务器交互的实现细节

    kazoo源码分析 kazoo-2.6.1 kazoo客户端与服务器概述 上文start概述中,只是简单的概述了kazoo客户端初始化之后,调用了start方法,本文继续详细的了解相关的细节. kaz ...

  2. SkyWalking 源码分析 —— Collector Storage 存储组件

    1. 概述 本文主要分享 SkyWalking Collector Storage 存储组件.顾名思义,负责将调用链路.应用.应用实例等等信息存储到存储器,例如,ES .H2 . 友情提示:建议先阅读 ...

  3. Mangos源码分析(15):游戏对象的实现

    狭义的游戏对象是指游戏世界中所能看到及可交互的对象,如玩家.怪物.物品等,我们这里也主要讨论这类对象在服务器上的组织及实现. 在大部分的MMOG中,游戏对象的类型都大同小异,主要有物品.生物.玩家等. ...

  4. 【Zookeeper】源码分析之服务器(一)

    一.前言 前面已经介绍了Zookeeper中Leader选举的具体流程,接着来学习Zookeeper中的各种服务器. 二.总体框架图 对于服务器,其框架图如下图所示 说明: ZooKeeperServ ...

  5. Mangos源码分析(3):服务器结构探讨之简单的世界服实现

    讨论了这么久我们一直都还没有进入游戏世界服务器内部,现在就让我们来窥探一下里面的结构吧. 对于现在大多数MMORPG来说,游戏服务器要处理的基本逻辑有移动.聊天.技能.物品.任务和生物等,另外还有地图 ...

  6. Mangos源码分析(2):服务器结构探讨之登录服的负载均衡

    回想一下我们在玩wow时的操作流程:运行wow.exe进入游戏后,首先就会要求我们输入用户名和密码进行验证,验证成功后才会出来游戏世界列表,之后是排队进入游戏世界,开始游戏... 可以看到跟前面的描述 ...

  7. Mangos源码分析(4):服务器结构探讨之继续世界服

    都已经看出来了,这种每切换一次地图就要重新连接服务器的方式实在是不够优雅,而且在实际游戏运营中也发现,地图切换导致的卡号,复制装备等问题非常多,这里完全就是一个事故多发地段,如何避免这种频繁的连接操作 ...

  8. mangos源码分析

    mangos 的执行模型  一.线程分布:  1.主线程 main---- Master::Run() ,主要功能:初始化world.创建子线程.回收资源  2.WorldRunnable ----- ...

  9. MapGuide源码分析----MapGuide服务器源码分析

    同样,在介绍MapGuide 服务器如何处理枚举资源操作之前,让我们首先来看看MapGuide 服务器用于处理服务请求和操作的类,图19‑9显示服务请求处理器类的类图,图19‑10显示了操作处理器类的 ...

  10. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

最新文章

  1. ug二次开发环境可以用c语言吗,NX二次开发(1):开发环境配置
  2. jfinal框架中前端向后台传输数据
  3. oracle 安全备份与rman_Oracle 11g下使用RMAN进行备份和恢复操作(一)
  4. 女孩常用双关语--男生进
  5. Nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分...
  6. 多元分类SVM(多类别SVM)程序使用说明
  7. java gc与finalize_finalize方法与Java GC
  8. Spring-装配Bean的3种方式-实现工厂方法方式装配Bean
  9. xp系统关于net use报错
  10. Linux红帽认证管理员(RHCAS)考试笔记
  11. Android的启动模式:singleTask与singleTop的使用
  12. js实现页面打印及bugger
  13. unity2d旋转专攻◤一◢ 角度计算
  14. 利用python将某列修改成另一列
  15. Java语言发展概述
  16. 用强化学习玩《超级马里奥》
  17. colorkey唇釉是否安全_所谓的colorkey真假对比
  18. WebRTC 实现P2P音视频通话——搭建信令服务器
  19. 【阵列信号处理】DOA估计算法
  20. launcher功能入口(三)

热门文章

  1. 防雷探测器在建筑物中的要求
  2. centos nginx和tomcat集群
  3. 数据库中查找哪些表中包含指定字段
  4. Flex4的皮肤skin
  5. R语言中文社区世界读书日图书推荐(含赠书活动)
  6. Python说文解字_半成品再加工
  7. Visual Studio Code的设置及插件同步
  8. SPSS 相关性的选择
  9. 一元稀疏多项式加法运算
  10. SQLSERVER备份事务日志的作用