摘要: 将用户级线程添加到我的工具库中,主要的目的就是用于实现同步远程调用接口。这里的同步,是指在调用返回或超时之前,用户级线程的执行路径阻塞在调用接口上,但其底层的线程并不会阻塞,可以继续其它的工作。基于这个结构,我的服务器主线程将运行一个用户级线程调度器,并预先创建一组用户级线程池。当收从网络层收到一个网络消息时,从线程池中取出一个空闲的线程,将消息交给它处理。这个线程在执行的过程中如果发生了阻塞调用,就将运行权交换给调度器,由调度器挑选下一个可用的线程执行。阻塞线程直到超时,或被通知可以解除阻塞才被重新投入到调度器的可运行队列中。下面贴出一个简单的测试代码,用于测试调用的效率。首先是两个远程函数 阅读全文
posted @ 2012-09-27 09:21 sniperHW 阅读(2074) 评论(1) 推荐(0)
摘要: 网络游戏的数据变动比较频繁,如果每次数据变动都刷往后端数据库,会导致数据库不负重荷。在游戏逻辑和数据库间提供一层缓冲服务,有利于减轻这重压力.首先,网络游戏的数据在数据库中是以表的形式保存的,每个玩家的数据占用其中的一行或几行.以玩家基本属性为例:基本表: chainfo表结构:chaid,chaname,hp,mp,maxhp,maxmp ...为此,内存数据库将建立针对行集和行数据的抽象。为了提高查询的效率,在内存中建立一个大的hash-table,hash-table中只支持两种数据结构:变长的list和定长的array.list用以表示集,array表示数据行.根据建立的逻辑索引,数据 阅读全文
posted @ 2012-08-11 22:03 sniperHW 阅读(6220) 评论(11) 推荐(2)
摘要: 前段时间实现的C协程依赖栈传递参数,在开启优化时会导致错误,于是实现了一个ucontext的版本,但ucontext的切换效率太差了,在我的机器上执行4000W次切换需要11秒左右,这达不到我的要求,所以重新设计了实现,使得在开启优化时也能得到正确的结果.并且效率也令人满意,4000W次切换仅需要730ms左右,足足比ucontext的实现快乐近15倍。下面贴出实现:#include "uthread.h"#include <stdlib.h>#include <ucontext.h>#include <pthread.h>#includ 阅读全文
posted @ 2012-08-05 22:52 sniperHW 阅读(3418) 评论(20) 推荐(1)
摘要: 以前曾经写过一篇为lua添加网络功能的博客,当然那篇文章提提供的lua网络接口纯粹是实验玩玩的,没有任何实用性.今天突然又想起了这件事,想用前段时间写的KendyNet为lua提供一套网络接口.这套接口是单线程的,通过PeekMsg获取网络事件,PeekMsg会在底层驱动epoll主循环.虽然也可以提供多线程的接口,在下面启动一个线程来驱动epoll,将事件提交到消息队列,由PeekMsg获取。但是,没人有会指望用lua写一个高性能的网络服务器,所以决定还是提供一个简单的接口,用来写写简单的小程序就可以了.首先介绍一下向lua提供的接口: lua_register(lState,"C 阅读全文
posted @ 2012-07-29 21:25 sniperHW 阅读(9423) 评论(10) 推荐(2)
摘要: 最近两天测试了下tcmalloc,性能的确牛B.所以修改了下固定对象分配器,模仿tcmalloc利用tls做thread cache.下面是在我机器上对自己写的各个内存分配器与tcmalloc的对比测试,fix_obj_pool finish:326fix_obj_pool finish:165fix_obj_pool finish:168fix_obj_pool finish:164fix_obj_pool finish:174fix_obj_pool finish:164fix_obj_pool finish:174fix_obj_pool finish:185fix_obj_pool f 阅读全文
posted @ 2012-07-24 11:33 sniperHW 阅读(2243) 评论(9) 推荐(0)
摘要: 本篇使用上一篇提供的接口,实现一个简单的协程调度框架.基本思想是,创建一个调度器,用于将处于活动状态的协程调度运行,调度器维护着一个actived列表,调用spawn创建协程时,将新建立的协程添加到活动列表中。调用schedule将启动调度器主循环.coro.h#ifndef _CORO_H#define _CORO_H#include <stdint.h>#include "uthread.h"struct coro{ struct coro *next; uthread_t ut; uint32_t id; start_fun st_fun; uint32_ 阅读全文
posted @ 2012-06-20 16:32 sniperHW 阅读(2284) 评论(0) 推荐(1)
摘要: 协程的概念就不介绍了,不清楚的同学可以自己google,windows和unix like系统本身就提供了协程的支持,windows下叫fiber,unix like系统下叫ucontext.在这里重复制造轮子,一是为了更清楚了解协程的实现,二是为了在windows和unix like系统下都提供一套统一的协程接口.首先介绍下接口,很简单,只有几个函数:#ifndef _UTHREAD_H#define _UTHREAD_Htypedef void (*start_fun)(void *); typedef struct uthread* uthread_t;uthread_t uthread 阅读全文
posted @ 2012-06-19 11:43 sniperHW 阅读(11804) 评论(22) 推荐(2)
摘要: KendyNet for linux的测试程序已经写好,项目地址:https://github.com/sniperHW/kendylib因为本人的工作环境下没有linux的机器,只是在两台服务器上安装了linux的虚拟机测试,效果并不是太好,有条件的同学可以下载代码,帮助测试一下. 阅读全文
posted @ 2012-05-25 11:31 sniperHW 阅读(465) 评论(1) 推荐(0)
摘要: 这几天编写了一个测试程序,测试我的网络库(KendyNet for Windows)的性能,主要用于模拟大量玩家在同一区域内,互相可见情况下网络的压力情况.测试环境:客户机和服务器 E5520 4GB windows 2008 server千兆网.客户机启动一个进程,建立360个连接到服务器,模拟360个客户端,每个客户端每秒发送16个28字节的封包,服务器收到每个封包都将其转发给所有的360个客户端.处理能力是每秒接收6000+,转发220W+,CPU占满单个核心,内存占用8M左右,封包一个来回的平均延时在46ms左右.这已经达到了最大处理能力,再加连接就开始导致性能下降,内存消耗暴增.ht 阅读全文
posted @ 2012-05-17 21:55 sniperHW 阅读(1655) 评论(7) 推荐(0)
摘要: 本文贴出用C语言重写的网络封包,主体设计思路前文已经介绍过,就是尽可能的共享缓存,减少不必要的内存拷贝.其次,封包主要是为了适合网络游戏等有固定模式的,面向字节流的协议,所以并不适合用于http类协议的处理.最后,代码没有做优化,内存的分配都是经由calloc,后面会用内存池代替。项目地址:https://github.com/sniperHW/KendyNet/tree/master/IOCPrpacket从网络中接收到的数据封包:#ifndef _RPACKET_H#define _RPACKET_H#include "buffer.h"typedef struct r 阅读全文
posted @ 2012-05-12 21:21 sniperHW 阅读(4223) 评论(0) 推荐(1)