自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zmyer的专栏

集腋成裘 方能铸就大气

  • 博客(56)
  • 收藏
  • 关注

原创 Mangos服务器框架设计分析(二)

在上一篇博文中,我们分析了Mangos服务器的登陆服务器,Mangos登陆服务器主要就是验证用户的合法性,并且针对通过验证的用户发送游戏列表服务器列表,用户选择了相关游戏服务器时所涉及到的流程就是今天本博文需要分析的,Mangos游戏服务器的主要架构就是一对多的关系,下层的I/O是多线程的,而上层的游戏主逻辑是单线程的,两者的胶合部分就是已经封装好的session模块,好了,下面就来看看具体的流程

2015-01-28 22:10:22 1957

原创 Mangos服务器框架设计分析(一)

距离上次写博客已经大半年了,这大半年中经历了很多的人和事,并且也收获了很多,所在的项目组游戏已经成功上线运营了,在此稍微花点时间记录一下这大半年在业余时间做的一些技术积累吧,在此就以堪称是“大魔兽私服”服务器框架——Mangos来做些框架设计上的分享吧,Mangos整体看来还是1:n模式的架构,底层的采用了多线程的IO,而游戏的主逻辑依旧是单线程的,Mangos服务器框架主要是基于ACE开源库的,

2015-01-22 20:41:52 2923

原创 内存泄露检查之C++实现

从事C++研发的筒子们,最挥之不去可能要数内存泄露带来的痛苦吧,在C++中,虽说其实现底层代码方面所凸显出来的性能要远高于其他类型语言,但是其由于缺乏天生的内存回收机制,从而也被业界予以诟病,那有没有办法能够监测到程序中的内存泄露问题呢,其实是有很多的办法,例如efence ,vagrind类型的工具等,但是这些工具最大的问题就是太重量级了,需要在自己的代码中安插部分调试代码,使用起来也是不很方面

2014-03-18 20:29:13 2017 1

转载 使用grep恢复被删文件内容

在Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root下使用这个命令的时候,我都要盯着命令行看上几分钟才敢把回车敲下去。以前,看到同事在脚本中使用rm命令 ——rm {$App_Dir}/* 。因为脚本没有判断变量$App_Dir是否为空,结果,在一次用root操作的时候,整个操作系统一下就不见了,还好只是开发机。从此,我们大家都再也不敢使用rm命令了。这里给大家介绍一个

2014-03-14 12:14:56 646

原创 设计模式之享元模式

在上一篇博文中,我们学习了代理模式,代理模式最大的特点:将实际的操作对象进行封装成为一个代理,对于上层所有的用户请求都是由代理对象代之完成,这种模式的优点就是使得程序的封装性很好,能够提高模块之间的内聚度,今天我们在此学习下面一个设计模式——享元模式,从名字中我们可能就已经只知道这种模式的特点:就是共享,一般之中模式是使用在一些能够共享对象的地方,首先我们来看看享元模式的定义吧,享元模式:运用共享

2014-03-14 11:50:24 895

原创 开源项目(库)之boost::asio学习(二)

在上篇博文中,我们学习了boost::asio库的同步I/O机制,里面的代码比较的简单,但是也是很重要,在这篇博文中,我们继续学习boost::asio库的异步方式,异步方式与同步方式的最大的不同,想必大家都很清楚,简单地来讲就是一个需要等待,一个不会等待,至于两者之间一些细节的不同,大家就放狗搜吧,好了,下面来看代码,代码如下:服务器端代码#ifndef __ASERVER__H#d

2014-03-13 13:45:24 2002

原创 开源项目(库)之boost::asio学习(一)

boost::asio库是一个很牛逼的库,想必接触过boost::asio开发过的人都应该有这种感觉,前段时间在项目中使用了下boost::asio库,给我的第一感觉就是boost::asio封装已到达如此的地步,于是勾起了我想要深入学习boost::asio库的冲动,好了,总结下之前在项目中使用boost::asio的一些案例,这些案例也是上网看到的,但是之后的一些编程实例,都是在这些案例上不断

2014-03-12 22:34:31 2800 1

原创 模板编程之技巧(一)

最近在coolshell上看到这样的一个程序,通过使用模板来求质数序列,感觉挺有意思,于是自己将代码导到自己机子上跑了下,感觉还是不错的,根据这个思想自己回忆起了在找工作时,曾遇到的一个面试题(不能使用乘除法以及循环,求解一个1+2+3+4+5....+N的和),这道题通过使用这个思想同样可以求解,下面我们先来看看coolshell上的这个代码吧,代码如下:#include using n

2014-03-12 14:01:36 905

原创 设计模式之代理模式

在上一篇博文中,我们学习了组合模式,组合模式最大的特点就是叶子对象和组合对象所表现的的行为很相似,使得用户在使用这个模式时,使得单个对象和组合对象的表现行为一致,易于管理,而今天我们继续学习另外一个设计模式——代理模式,根据代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。怎么来理解呢,我们完全可以将这里的代理想象成现实生活中的代理,现实生活中的代理主要职责就是为普通用户提供服务,而普

2014-03-12 10:55:27 857

原创 列举出一小时内占用的cpu最多的10个进程

CPU是一种很重要的资源,如果能够跟踪某个阶段内占用的CPU最多的进程,通过监视一段时间内的CPU使用情况,我们可以找出长期占用CPU的进程并对其进行优化,提高CPU使用效率,我们知道ps指令适用于收集进程详细信息,接下来我们就来通过使用ps指令来监视并计算一分钟内CPU使用情况,shell代码如下:#!/bin/bashSECS=60UNIT_TIME=5STEPS=$(

2014-03-12 09:14:20 3127

原创 使用rsync备份系统快照

在日常工作中,尤其是那些系统管理员,备份数据应该说是一件必不可少的工作,对于搞服务器端开发的工程师来讲,对于一些重要的数据备份应该也是家常便饭了,今天我们就来看看通过使用rsync这个工具来如何实现备份的,rsync可以对位于不同地方的文件和目录进行同步,并且其利用差异计算以及压缩技术来最小化数据的传输量。相比于cp,rsync的优势在于使用了高效的差异算法,另外它还支持网络数据传输,下面我们就来

2014-03-04 10:00:49 2420

转载 MySQL性能优化的最佳20+条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。1. 为查询

2014-03-03 23:21:26 565

转载 由12306.cn谈谈网站性能技术

12306.cn网站挂了,被全国人民骂了。我这两天也在思考这个事,我想以这个事来粗略地和大家讨论一下网站性能的问题。因为仓促,而且完全基于本人有限的经验和了解,所以,如果有什么问题还请大家一起讨论和指正。(这又是一篇长文,只讨论性能问题,不讨论那些UI,用户体验,或是是否把支付和购票下单环节分开的功能性的东西)业务任何技术都离不开业务需求,所以,要说明性能问题,首先还是想先说说业务问题。

2014-03-03 23:17:27 733

转载 性能调优攻略

关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法。本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充。在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的《代码优化概要》,这篇文章基本上告诉你——要进行优化,先得找到性能瓶颈!

2014-03-03 23:14:48 588

原创 性能优化之C++ Profiler

最近在做有关性能优化方面的东西,其中使用到了Profiler,就目前来看除了glibc中自带的gprof以外,还有一个使用的比较广泛的由google开发的GooglePerformance tools,在这篇博文中,我们就来学学gprof这个性能调试工具吧,在介绍gprof之前,我们有必要来思考下我们优化的性能主要包括哪些部分,这部分内容可以参考这篇博文http://coolshell.cn/ar

2014-03-03 21:37:58 4184

原创 基于Shell的网页相册生成器

在做web开发时,有时候需要提供相册机制,而一般通过人工方式来实现的相册,即费力又易出错,那能不能通过脚本的方式来自动生成这部分内容呢,答案是可以的,下面我们就来写一个自动生成网页相册的生成器吧,代码如下:#!/bin/bashecho "Creating album"mkdir -p zmyercat index.htmlbody{width:470

2014-03-01 09:59:15 1338

原创 设计模式之组合模式

在上篇博文中,我们学习了设计模式中的外观模式,这种模式主要是通过对外提供一个易用的接口,从而使得用户不必关系接口内部的实现,这种设计模式在一些构件开发中,使用很广泛,今天我们就来学习一下另外一个设计模式——组合模式,首先来看看组合模式的定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。怎么来理解这句话,就好比一家跨国公司,在本土有总部,而在

2014-02-28 22:15:32 846

原创 循环缓存区之C++实现

最近,在优化服务器端底层代码时,遇到了一个比较影响系统性能的东西——缓存区,最已有的方案里,其采用了单缓冲区,每次需要空间时,都会检查缓冲区空闲空间是否满足,如果满足还得进行移动内存的操作(想必搞过服务器开发的同事,这点深有体会吧),当数据交换量猛增时,这个方案效果立马显现,于是自己私下写了一个简单版的循环缓存,原理很简单,在这之上自己将代码进行了规整和优化,并替换了原来的单缓存区方案,效果显著,

2014-02-26 18:33:00 4170 2

原创 正则表达式学习(一)

正则表达式是一种十分强大的文本分析工具,其使用了一套复杂的语法规则,解决了文本处理领域的绝大多数问题,诸如验证,匹配,查找以及替换,今天我们就来学习boost库下的xpressive这个先进,灵活的正则表达式库吧,在介绍之前,我们需要了解下正则表达式的一些基础知识:1)点号开头可以匹配任意的单个字符2)^匹配行的开头3)$匹配行的末尾4)()用于定义一个正则表达式匹配的子元素(子表

2014-02-26 13:58:12 934

原创 基于Shell的图片抓取器

最近,在学习Linux Shell方面的东西,早在大学时期就接触个这方面的东西,只是工作的时候很少涉及到shell方面的,于是就荒废了,最近在服务器方面遇到了一些问题,当时写测试程序时,需要使用shell,于是重新拾取这部分内容,好了,说了这么多,参照《攻略》里的案例,自己调试了下这个图片抓取器,代码如下:#!/bin/bashif [ $# -ne 3 ];thenecho

2014-02-26 12:22:40 1687

原创 设计模式之外观模式

在上篇博文中,我们学习了建造者模式,这种模式的最大的特点就是:从一系列抽象化的接口中,创建出不同的对象,这些接口组成了整个构建对象的一致流程,而具体的接口实现则因物而异,建筑者模式很好地解决了接口和实现耦合关系,值得大家学习,而今天我们再来学习另外一个设计模式——外观模式,根据DP上的定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

2014-02-25 18:10:48 702

原创 设计模式之建造者模式

在上篇博文中,我们学习了原型模型,在原型模型中,我们是通过一个原型来复制构造新对象,使用方法较为简单,希望能够在实际开发应用中能够灵活运用,下面我们学习另外一个模式——建造者模式,这个模式最大的特点就是对象是分步骤构建出来的,换句话说,建造者模式其实就是将一系列构建过程步骤进行抽象化,之所以这些步骤能够被抽象化主要是因为对象的构建过程是相似的,只是其中的一些具体的操作可能不同,就好比是一条流水线,

2014-02-25 12:16:53 891

原创 设计模式之原型模式

在上篇博文中我们学习了有关单例模式,单例模式通俗点讲就是只有一个对象的类,这种设计模式最大的优点就是对象易于管理,这种设计模式是值得好好地学习下的,其他的我们就不多说了,接下来我们再来学习一下另外一个设计模式——原型模式,在列出代码之前,我们需要了解一下:什么叫原型模式,原型模式的定义:用原型实例指定创建对象的种类,并且通过使用拷贝这些原型创建新的对象。这句话怎么来理解呢,其实说白了,就是使用已有

2014-02-24 23:23:14 853

原创 开源项目(库)之libevent学习(二)

在上一篇博文中,我们只是稍加对libevent进行了学习,自己私下感觉好像好的多东西都没有涉及,于是在这篇中我们就来真正地学习下libevent的一些API用法,废话不说,直接上代码,这段代码也是别人的代码,但是它很有针对性,所以在此列举出,稍后会有针对性地修改,代码如下:#ifndef __ECHO_SERVER__H#define __ECHO_SERVER__H#include

2014-02-24 20:51:51 1607

原创 设计模式之单例模式

在上篇博文中,我们分析了适配器模式,适配器模式通俗地来讲就是实现了接口之间的转换,是之前不能够使用的接口能够在新的环境下使用,今天我们要学习的是另外一个设计模式——单例模式,说到单例模式想必大家都应该明白,通俗地说就是只能产生一个对象的类,个人认为这种设计模式在整个设计模式中都是最简单的,并且这种模式最大的好处就是对象易于管理,这种模式在我的工作中也是时常看到,下面我们就来看看这个单例模式,代码如

2014-02-24 16:37:07 775

原创 设计模式之适配器模式

在上篇博文中,我们系统地讲述了策略模式,策略模式整体来说应该比较简单,其思想也是很容易弄懂,今天我们再来学习下另外一个模式——适配器模式,适配器模式的定义:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。怎么来讲呢,其实理解它也不难,这个模式有点类似我们日常生活中的“翻译”角色,一般都有一个充当适配功能的角色,再明白一点就是:就是与笔

2014-02-24 11:57:05 938

原创 设计模式之策略模式



2014-02-21 18:13:54 874 2

原创 设计模式之工厂模式系列(简单工厂,工厂模式,抽象工厂模式)

每次在做功能时,都会考虑下具体的应该采用神马样的设计模式,今天索性就来整体地学习下我们常用的一些设计模式了,首先是我们的工厂模式系列,在这类模式中,主要分为了三大类:简单工厂模式,工厂方法模式以及抽象工厂模式,它们之间的不同:简单的工厂模式可以比做成一个工厂但是可以生产不同的物品,工厂模式就是不同的工厂生产不同的物件,而抽象工厂则是不同的工厂既可以生产相同的物件也可以生产不同的物件,个人的感觉就是

2014-02-21 15:34:05 876

原创 Boost库之bind适配器学习

最近在学习boost库里的一些常用的库,目前已经看到了boost库的bind适配器这块,个人感觉bind这玩意太好用了,整体来讲bind要比STL里的bind1st和bind2nd要好用很多,下面就从一些基本的用法来说起吧,bind组件在boost中包含了很多的重载函数,其中这些函数主要是以参数的个数以及被绑定的对象类型来划分,而编译器会根据具体的参数类型以及参数个数来自动地调用相关的形式,在bi

2014-02-21 10:56:05 1185

原创 基于Boost::Thread库的多线程网络爬虫程序

在之前的几篇博文中,曾经设计实现了单线程爬虫和多线程爬虫,但是自己私下想了想,其实在实现多线程爬虫时,所有的线程都是自己通过调用底层的API来实现的,这样的调用一般来说并不是很好,并且又鉴于自己最近学习了下boost::thread相关的东西,于是索性想将之前的那个多线程爬虫程序改为boost::thread版的多线程爬虫,好了,废话说了这么多,现在该是设计代码的时候,代码如下:#ifndef

2014-02-19 16:10:58 1655

原创 开源项目(库)之libevent学习(一)

最近花了点时间学习了下有关异步I/O方面的东西,其中主要的一些开源网络库主要有libeven、libev以及boost下的asio,至于ACE这样的库一般的工程项目不会采用,下面就来看看libevent上的一些东西吧,首先是按照libevent这个库,其实在linux下安装这类软件不外乎下面这种通用的步骤:1)下载libevent代码包,http://libevent.org2)解压,(t

2014-02-19 11:12:00 1814

原创 开源项目(库)之libcurl学习(二)

在上一篇博文中,我们曾实现了一个简单的爬虫程序,在那篇博文中,我们使用的是单线程的,感觉多少有些不好,如果在这篇博文中,我们就将其修改为多线程的,废话不多说了,直接上代码,如下:

2014-02-17 22:47:01 936

原创 开源项目(库)之libcurl学习(一)

最近抽了点时间,将之前开发中使用到的一些开源库进行了下总结,主要是为了回顾一下自己所使用的一些库基础知识,并且加深理解,在这些库中,首先一个库就是libcurl,这个库很强大,当时在做openstack swift API时使用到了,这个库一个轻量级的HTTP编程库,里面封装了一套基于HTTP的上层应用协议的数据包的基本操作,其支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,T

2014-02-13 23:16:13 3019

原创 Boost之内存管理学习(二)

在上篇博文中,我们系统地学习了Boost库中智能指针的学习,在处理单个对象时,采用智能指针是一个很不错的选择,但是当需要管理的对象不止一个时,这时候智能指针就有点无能为力了,今天我们就来看看Boost库中pool库的一些东西,Boost.pool库是基于简单分隔存储思想实现的一个快速、紧凑的内存池库,不仅能够管理大量的对象,而且还可以作为stl的内存分配器,在需要大量地分配和释放小对象时,很有效率

2014-02-12 19:59:01 813

原创 Google之Protocol Buffer序列化学习(一)

很早就听闻过Protocol Buffer是个很神奇的东西,只是没有使用过,由于工作上的需要,决定试试Protocol Buffer,废话不多说,先来看看如何安装Protocol Buffer吧,平台是Linux安装步骤:1)下载Protocol Buffer源码包 https://code.google.com/p/protobuf/downloads/list2)   使用

2014-02-11 23:09:02 1108

原创 Boost之内存管理学习(一)

说起内存管理,大多数人第一反应就是new,delete等操作,这一类操作所针对的对象就是堆对象,在使用这一类操作时,一个很突出的问题就是内存泄露,这也是每个C++程序猿的挥之不去的噩梦,曾几何时因为一个不起眼的指针释放问题,而导致了服务器因内存写满而宕机,而如今这类问题,对于C++程序开发者而言已经不再是问题了,为了解决这个问题,C++程序员采用了RAII机制(资源获取即初始化),具体的思想就是:

2014-02-11 15:25:38 1084

原创 boost之序列化学习(一)

最近在研究boost这个库,这个库很强大,鉴于工作的需要,我花了点时间学习了下boost库里的序列化机制,个人感觉很强大,boost库对序列化这块支持的范围很广,其中对于xml这方面的序列化机制感觉支持的很不错,下面就从最基础的开始吧,代码如下:#include #include #include #include #include #include #include

2014-02-10 14:32:00 1816

原创 一个线程池与任务池相结合的案例

在上篇博文中

2014-02-08 11:38:30 969

原创 boost中g++ 链接undefined reference to `boost::system::generic_category()问题

在使用boost库时,遇到了一个比较纠结的问题:Test.cpp:(.text+0x1bd): undefined reference to `boost::system::generic_category()'Test.cpp:(.text+0x1c7): undefined reference to `boost::system::generic_category()'Test.c

2014-02-07 15:26:55 6929

原创 一个自创的多线程池设计-升级版

在上篇博文中,我们自己设计实现了一个简单的多线程池,功能实现很简单,里面有很多的不足,例如对于线程的回调函数,只是在以普通的函数来实现,在此我们想借以任务的形式来给线程池线程指定相应的任务,因而来实现一个任务池+线程池的设计理念,下面我们就开始设计我们的任务,代码如下:#ifndef __TASK__H#define __TASK__H#include #include class

2014-02-07 11:16:41 652

shard-testtesttesttest

shard-testtesttesttest

2023-11-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除