摘要: 关于 windows IOCP有人说 windows IOCP 是 windows 上最好的东西。 IOCP 是真正的异步 IO,意味着每次发起一个 IO 请求,该调用本身则立即返回, 而包括 IO 操作和数据从内核缓冲区到用户缓冲区之间的拷贝都由系统完成,直到这个过程结束系统才通知用户进程。 li... 阅读全文
posted @ 2014-07-23 10:33 persistentsnail 阅读(3205) 评论(0) 推荐(1) 编辑
摘要: Unix域套接字 Unix域套接字是非常有用的IPC机制,接口上使用socket API,和TCP/IP,UDP/IP保持一致,随时可以相互切换,但是Unix域套接字并不执行协议处理,不需要添加或删除网络报头,无需计算校验和,不要产生顺序号,无需发送确认报文,因此要高效的多。相比其他IPC机制(管道,共享内存),它有下面的特点: 1. 相比网络传输它更安全,因为只能在本机使用,所以又称Unix... 阅读全文
posted @ 2014-03-30 17:14 persistentsnail 阅读(881) 评论(0) 推荐(0) 编辑
摘要: 基于socket的bufferevent由一个socket的传输层和read/write buffer组成。区别于常规的event,当socket可读或者可写时会回调用户的callback,bufferevent当读取或者写入足够多的数据到evbuffer后,才回调用户回调函数。这个足够多的数据由水位线(watermarks)定义。bufferevent四种watermarks:Read low-water mark当输入缓存中读入的数据超过这个水位线则触发用户callback回调,默认是0,所以每次读都会导致callback被调用。Read high-water mark假如输入缓存中读入的 阅读全文
posted @ 2014-02-12 10:46 persistentsnail 阅读(1347) 评论(0) 推荐(0) 编辑
摘要: timer event libevent添加一个间隔1s持续触发的定时器如下: struct event_base *base = event_base_new();struct event *timer_ev = event_new(base , -1, EV_PERSIST, cb_func, NULL );struct timeval one_sec = {1,0};event_add(... 阅读全文
posted @ 2014-01-01 11:35 persistentsnail 阅读(836) 评论(0) 推荐(0) 编辑
摘要: A*算法是一种启发式的BFS,目的就是找到到达目标位置的最短路径。启发式函数如下: f(x) = g(x) + h(x) g(x)是对出发点到达当前点距离的估约,h(x)是当前点到终点距离的估约。算法是一个广度优先搜索的过程,但是搜索时的可选集合是一个优先级队列,f(x)越小优先级越高。 算法过程描述 1。用起点初始优先级队列opened; 2。在opened中取最小f(x)的坐标节点,如果该... 阅读全文
posted @ 2013-12-22 16:22 persistentsnail 阅读(1081) 评论(1) 推荐(0) 编辑
摘要: 随机迷宫生成 游戏地图的动态生成要追溯到传统的随机迷宫生成。随机迷宫生成可以描述成这样的问题:在一个m*n的网格中,每一个网格的边代表一堵墙,初始时所有网格彼此不联通,现在要随意打穿一些墙,使得特殊的两个网格(起点和终点)能够联通。 以图论来描述就是:初始其实是一个 连通图,每一个网格代表图的节点,墙代表图的边,每一个随机生成的迷宫对应这个图的一个生成树。 完美迷宫 完美迷宫就是没有回路,没... 阅读全文
posted @ 2013-12-20 21:42 persistentsnail 阅读(1823) 评论(0) 推荐(0) 编辑
摘要: Protocol Buffer仅仅是提供了一套序列化和反序列化结构数据的机制,本身不具有RPC功能,但是可以基于其实现一套RPC框架。 Services protocol buffer的Services类型是专门用来给RPC实现定义服务用的。 定义示例如下: service SearchService { rpc Search (SearchRequest) returns (Searc... 阅读全文
posted @ 2013-12-04 20:56 persistentsnail 阅读(7640) 评论(0) 推荐(0) 编辑
摘要: pagemap_和pagemap_cache_ PageHeap有两个map,pagemap_记录某一内存页对应哪一个span,显然可能多页对应一个span,pagemap_cache_记录某一内存页对应哪一个SizeClass。 在TCMalloc源码分析(一)中有提到过pagemap_所占内存的问题,假设32位系统4GB可用内存,若pagemap_使用数组实现需要占用4MB的内存(假设一页... 阅读全文
posted @ 2013-11-28 23:08 persistentsnail 阅读(3196) 评论(0) 推荐(0) 编辑
摘要: 线程本地cache 线程本地cache对应的是类 ThreadCache,每一个thread一个实例,初始化代码在static函数CreateCacheIfNecessary中, 在该线程第一次申请内存的时候初始化,调用堆栈是 : 1 tcmalloc::ThreadCache::CreateCacheIfNecessary()2 tcmalloc::ThreadCa... 阅读全文
posted @ 2013-11-27 21:15 persistentsnail 阅读(3504) 评论(0) 推荐(0) 编辑
摘要: 替换libc中的malloc free 不同平台替换方式不同。 基于unix的系统上的glibc,使用了weak alias的方式替换。具体来说是因为这些入口函数都被定义成了weak symbols,再加上gcc支持 alias attribute,所以替换就变成了这种通用形式: void* malloc(size_t size) __THROW __attribute__ (... 阅读全文
posted @ 2013-11-27 20:33 persistentsnail 阅读(2099) 评论(0) 推荐(0) 编辑