摘要: 打算一边学习tcmalloc的源码一边写总结文章。先从转述TCMalloc的一篇官方文档开始(TCMalloc : Thread-Caching Malloc)。 为什么用TCMalloc TCMalloc比glibc 2.3 的malloc(是一个单独的库叫做ptmalloc2)和其他测试过的malloc都要快。TCMalloc致力于减少多线程对锁的竞争,在获取小的内存对象时候基本上不... 阅读全文
posted @ 2013-11-25 20:51 persistentsnail 阅读(4296) 评论(0) 推荐(1) 编辑
摘要: epoll_create 创建的 文件描述符和其他文件描述符一样,是被fork出的子进程继承的,那也就是子进程可以使用这个epoll fd添加感兴趣的io(epoll_ctl),然后是可以影响到父进程的epoll_wait。比如,子进程中注册了一个io写事件后,因为某种原因挂起来了,导致父进程的epoll_wait频繁返回,CPU占用率飙升。看下下面的演示代码: void DoWrite(int epollfd) { 5 int fd = socket(AF_LOCAL, SOCK_STREAM, 0); 6 if (fd 0) {45 for (;;) {46 int nfds = ep.. 阅读全文
posted @ 2013-10-27 14:23 persistentsnail 阅读(1887) 评论(0) 推荐(0) 编辑
摘要: fork出子进程后父进程并不想关心子进程了,也不想费心wait,自顾自的继续执行自己的代码,之后子进程退出时会变成僵尸进程。要避免产生僵尸进程,使用sigaction函数设置SIGCHLD信号处理,并设置sa_flags 为 SA_NOCLDWAIT,man sigaction可见SA_NOCLDWAIT描述: SA_NOCLDWAIT (Since Linux 2.6) If signum is SIGCHLD, do not transform children into zombies when they terminate. See also waitpid(2). This flag 阅读全文
posted @ 2013-10-22 23:21 persistentsnail 阅读(1052) 评论(0) 推荐(0) 编辑
摘要: 今天看到c专家编程的最后,有一处关于检测链表是否存在环的算法介绍,这个问题和算法之前在很多地方有看见,大致是有三个问题:1.给你一个单向链表判断是否有环;2.求出环的长度;3.给出环的开始节点。算法是这样:让两个指针指向表头,一个每次移动一步,叫做慢指针,一个每次移动两步,叫做快指针,一直循环移动,如果最后两者都碰到NULL指针则表示没有环,如果最后两者指向同一个节点表示有环。至于问题2,3则是可以扩展得到,从快慢指针相遇的那个节点开始,令一个新的指针开始遍历,他从起点回到起点所经历过的步数就是所求长度length,而环的开始节点可以这样求,让一个指针p1指向链表头,另一个p2指向离他leng 阅读全文
posted @ 2013-09-01 18:21 persistentsnail 阅读(1051) 评论(0) 推荐(0) 编辑
摘要: 游戏中的AOI(Area of Interest)算法游戏的AOI算法应该算作游戏的基础核心了,许多逻辑都是因为AOI进出事件驱动的,许多网络同步数据也是因为AOI进出事件产生的。因此,良好的AOI算法和基于AOI算法的优化,是提高游戏性能的关键。我在实践中所熟知的游戏AOI算法大致有两种,在此做一些总结,顺便梳理一下,打算设计出一套统一的接口封装不同的算法实现(网络上还有些其他算法,因为不熟悉不作记录了)。我所记录的这两种算法也算经典了,一个叫做网格法,一个叫做双链表法。统一接口设计:AOI需求大概是这样:1.游戏地图上有一些npc和玩家在移动,每一个这样移动的对象我们叫做AOIEntity 阅读全文
posted @ 2013-07-21 17:07 persistentsnail 阅读(8032) 评论(1) 推荐(2) 编辑
摘要: Google performance Tools (gperftools) 使用心得gperftools是google开发的一款非常实用的工具集,主要包括:性能优异的malloc free内存分配器tcmalloc;基于tcmalloc的堆内存检测和内存泄漏分析工具heap-profiler,heap-checker;基于tcmalloc实现的程序CPU性能监测工具cpu-profiler.上述所说的三种工具在我们服务器进程的性能分析监控,定位内存泄漏,寻找性能热点,提高malloc free内存分配性能的各个方面上都有非常成功的使用经验。1.tcmalloc之前我们一直使用glibc的mal 阅读全文
posted @ 2013-07-07 17:16 persistentsnail 阅读(11885) 评论(0) 推荐(0) 编辑
摘要: 这几天翻出了很久前看过的Inside the C++ Object Model,发现很多东西忘记了,这一遍看下去,想把主要的几个对象模型记下来,也算是把书读薄吧。1. 简单对象模型(没有虚函数,继承)例子:class Point {public:Point(float xval, float yval);float x() const;float y() const;static int PointCount();private:float _x;float _y;static int _point_count;};对象模型:2. 有虚函数的例子:class Point {public:... 阅读全文
posted @ 2013-04-28 22:33 persistentsnail 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 弱引用在许多编程语言中都相当有用,弱引用是相对强引用来说的,强引用是指你在某处使用了一个对象,在你释放这个引用前,这个对象是无法释放的,而弱引用则相反,虽然你拿着这个引用但是对象仍然可以释放,使用时也不保证对象有效。在C++中有两个智能指针,shared_ptr针对强引用,每次构造必增加引用计数,weak_ptr针对弱引用,不增加引用计数,使用前要转换成shared_ptr才能使用。根据自己在实践中的经验,使用weak_ptr弱引用的场景有:1. 比如有一个类引用另一个对象作为成员,但是又不想因为使用强引用,使得这个对象在外面无法释放,这时候刚好可以使用weak_ptr。#include #i 阅读全文
posted @ 2013-04-04 10:38 persistentsnail 阅读(495) 评论(0) 推荐(0) 编辑
摘要: 1.TValue typedef struct { Value value; int tt; } TValue lua所有类型,Value是union, typedef union { // GCObject *gc; 可以gc的类型 GCheader gch; // 头部 union TString ts; // 字符串 union Udata u; // userdata union Closure cl; // 闭包函数 struct Table h; // 表 struct Proto p; // 函... 阅读全文
posted @ 2013-04-02 21:26 persistentsnail 阅读(944) 评论(0) 推荐(0) 编辑
摘要: 1.opcode lua代码执行过程是:源代码先被编译成为字节码,然后虚拟机解释执行。相关模块是lopcode.c,lvm.c。lua的字节码类似汇编,也有pc寄存器这个概念,指向下一条要执行的指令,lua里面每一条指令由无符号数表示,低六位代表opcode,指示这是条什么指令(例如OP_MOVE, OP_ADD,...)。剩下的位主要是给操作数用的,像汇编中一样,lua指令的操作数也可以有不同的寻址方式,但是lua简单很多,主要是根据不同的操作指令变化,分三种模式: | 31 ~ 23 bit | 22 ~ 14 bit | 13 ~ 6 bit | 5 ~ 0 bi... 阅读全文
posted @ 2013-04-01 22:44 persistentsnail 阅读(1034) 评论(0) 推荐(0) 编辑