XGuru's Blog

技术,是一种态度。关注:高性能后端技术/服务器架构/C++/C/LAMP

   :: 首页 :: 联系 :: 聚合  :: 管理
  20 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks

公告





twitter / xoXGuru

feedsky
抓虾
google reader
鲜果
QQ邮箱
九点

常用链接

留言簿(12)

搜索

  •  

最新评论

阅读排行榜

#

 

2.1 event_base核心事件基类数据结构



 


      可以看出event_base是整个libevent的核心部分,它由三种结构构成:一个时间堆 (对应EVLIST_TIMEOUT),一个已注册队列(对应EVLIST_INSERTE),一个活跃事件队列(对应EVLIST_ACTIVE)。

      时间堆采用的是min-Heap最小二叉堆,已注册队列和活跃事件队列采用的都是双向链表。

      已注册队列对应事件基中的eventqueue,活跃事件队列对应的是事件基中的activequeues[ev->ev_pri]结构体数组。其中的ev_pri代表的是事件的优先级,数值越小代表越高的优先级别。

      可以通过调用event_priority_set()函数对其优先级进行设置,默认插入中等优先级(nactivequeues/2 ,即活跃队列总数除以2)。


 

2.2 超时队列(min-Heap最小二叉堆)

      在这里处理超时机制中使用了一个经典的数据结构min-Heap,源码位于Min_heap.h

libevent从1.4版本之后就开始采用min-Heap来代替RB-Tree。

min-Heap(最小二叉堆)遵循的原则:

1.它是一种完全二叉树

2.它最小的元素在顶端每个元素都比它的父节点大(或相等)。

插入元素时间复杂度为O(log n),找出最小值的复杂度仅为O(1)。

libevent实现的min-Heap变量名有点猥琐。

1typedef struct min_heap
2{
3    struct event** p;
4    unsigned n, a;
5}
 min_heap_t;
6

 

 

p可以理解成存储事件指针的数组,n表示的是容量,a表示的是当前数。

堆的操作函数里一般e代表事件,s代表被操纵的min-Heap。

这个min-heap作者应该是OOP阵营的,其中出现有对应构造函数的min_heap_ctor(),和对应析构函数min_heap_dtor()。


 

2.3事件队列(双向链表)

libevent中的活跃事件队列和已注册队列采用的数据结构都是用宏来实现的,原在freeBSD的<sys/queue.h>中已有定义,为了对Linux跨平台支持考虑,libevent将部分代码集中到event_internal.h里。


1#define TAILQ_ENTRY(type)                        \
2struct {                                         \
3    struct type *tqe_next;    /* 下一个元素 */         \
4    struct type **tqe_prev;    /*上一个元素的地址*/      \
5}

6

 

libevent用到的宏操作

宏名称

操作

TAILQ_INIT

初始化队列

TAILQ_FOREACH

对队列进行遍历操作

TAILQ_INSERT_BEFORE

在指定元素之前插入元素

TAILQ_INSERT_TAIL

在队列尾部插入元素

TAILQ_EMPTY

检查队列是否为空

TAILQ_REMOVE

从队列中移除元素

posted @ 2010-06-24 00:23 XGuru 阅读(1959) | 评论 (1)编辑 收藏

Libevent简介

The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts. 

 

Libevent的API提供了这样的一套机制:
当指定文件描述符中一个特定的事件发生,或者超时时间到达后执行指定的回调函数。
此外,libevent回调功能也支持由信号或者常规的超时触发。
注意其许可协议为BSD-style的协议,可以在商业级产品中采用而不必开源。

 

1.编译安装


 

ubuntu下可以使用apt的方法直接安装:

 

 ~$  sudo apt-get install libevent

或者使用

~$  wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
~$  tar –xzvf  libevent-1.4.13-stable.tar.gz
~$  cd libevent-1.4.13-stable
~$  ./configure
~$  make
~$  sudo make install

2.库的使用
 

可以从这几个简单的例子中了解到libevent的基本使用方法。编译时需加上 "-levent"参数。

 

2.1.I/O事件(对应EV_READ、EV_WRITE)

下面提供了一个有所省略简单使用libevent返回系统时间的服务端程序片段。

 1void get_time(int fd,short event,struct event *arg)  /*获取系统时间并将其往回write*/
 2{
 3……
 4    localtime_r(&now,&t);
 5    asctime_r(&t,buf);
 6    write( fd,buf,strlen(buf) );
 7……
 8}

 9void con_accept(int fd,short event,void *arg) /*提供给事件的回调函数,接收一个连接*/
10{
11    struct sockaddr_in s_in;
12    socklen_t len = sizeof(s_in);
13    int ns = accept(fd,(struct sockaddr *&s_in,&len);
14    struct event *ev = malloc(sizeof(struct event));
15    event_set(ev,ns,EV_WRITE,(void *)get_time,ev);
16    event_add(ev,NULL);
17}

18                
19int main()
20{
21    int sockfd = socket(PF_INET,SOCK_STREAM,0);
22    struct sockaddr_in s_in;
23……
24    bind(sockfd,(struct sockaddr*&s_in,sizeof(s_in));
25    listen(sockfd,5);
26    event_init(); //libevent初始化
27
28    struct event ev;
29    event_set(&ev,sockfd,EV_READ|EV_PERSIST,con_accept,&ev);
30//设置事件属性为可读、持续,回调函数为con_accept()
31    event_add(&ev,NULL);//添加事件,未设置超时时间
32    event_dispatch();//进入libevent主循环
33    return 0;
34}

35

2.2. 信号处理事件(对应EV_SIGNAL)

 1 static void signal_cb(int fd, short eventvoid *arg)
 2{
 3    struct event *signal = arg;
 4    printf("%s: got signal %d\n", __func__, EVENT_SIGNAL(signal));
 5    if (called >= 2)
 6        event_del(signal); //如果调用了两次以上,就删除这个信号
 7    called++;
 8}

 9
10int main (int argc, char **argv)
11{
12    struct event signal_int;
13    event_init();//libevent初始化
14    event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb, &signal_int); 
15//设置事件属性为信号触发、持续,回调函数为con_accept()
16    event_add(&signal_int, NULL); //添加事件
17    event_dispatch();//进入libevent主循环
18    return 0;
19}

20

2.3.常规超时处理(对应EV_TIMEOUT)
 1static void timeout_cb(int fd, short eventvoid *arg)
 2{
 3    struct timeval tv;
 4    struct event *timeout = arg;
 5    int newtime = time(NULL);
 6    printf("%s: called at %d: %d\n", __func__, newtime,
 7        newtime - lasttime);
 8    lasttime = newtime;
 9    evutil_timerclear(&tv);
10    tv.tv_sec = 2;
11    event_add(timeout, &tv);
12}

13
14int main (int argc, char **argv)
15{
16    struct event timeout;
17    struct timeval tv;
18    event_init();//libevent初始化
19    evtimer_set(&timeout, timeout_cb, &timeout);
20//实际上该函数对应的是event_set(timeout, -1, 0, timeout_cb,&timeout)
21evutil_timerclear(&tv); //如果有时间清理函数则直接对应timerclear(),如果没有则将tv_sec和tv_usec设置为0
22
23    tv.tv_sec = 2;
24    event_add(&timeout, &tv);
25    lasttime = time(NULL);
26    event_dispatch();
27    return 0;
28}

29

posted @ 2010-06-24 00:13 XGuru 阅读(6044) | 评论 (0)编辑 收藏

     摘要: 很多程序员讨厌去阅读代码,来接受它吧。就像人人都喜欢写代码一样--写代码很有乐趣。但阅读代码却是一种困难的工作。它不仅仅繁重,而且很无聊,让我们面对这个事实,任何不是自己写的代码都是差劲的(嘿嘿,虽然我们没有这样说过,但是其实我们都是这样想的)。甚至当你写完代码后的仅仅几个小时之后,你的那些代码就开始变得越来越烂了,时间一长,你就会把它当作看起来的那种差劲作品。为何我喜爱读他人的代码?阅读代码又有什么技巧和方法呢?而且你还需要去寻找代码阅读机会--而不是逃避它们  阅读全文
posted @ 2010-06-04 15:55 XGuru 阅读(6491) | 评论 (10)编辑 收藏

     摘要: 我读了大量关于如何招募 卓越 开发者 的文章,但是如果你只对招聘蹩脚程序员感兴趣,那又该怎么办呢?也许你不愿意用钱去利滚利,或者你只觉得把工作完成就谢天谢地了。不管什么原因,这个蹩脚程序员系列文章就是玩这个把戏的。欢迎来到第一部分:如何招聘蹩脚程序员  阅读全文
posted @ 2010-04-26 15:43 XGuru 阅读(2607) | 评论 (0)编辑 收藏

     摘要: 数学对于一个开发者而言是否重要呢?一位不愿透露姓名的读者写道:“目前,大多数的编程工作的性质就是这样,你并不真正需要的数学技能,甚至能做得更好,毕竟线性代数对建立数据库驱动的网站是没有任何帮助的。然而, Skorkin争辩说,如果你想在软件开发领域做真正令人兴奋的工作,数学技能是必要的,而且它将会变得越来越重要!  阅读全文
posted @ 2010-04-02 00:18 XGuru 阅读(4919) | 评论 (6)编辑 收藏

这是一个非常有趣的,从计算机科学、软件工程、程序设计、经验、学识各方面评估程序员能力的参照表。

如果你想看看自己的水平处在哪个层级(仅供参考),就快来看看吧~

汉化版地址在这里


错误在所难免,如果发现,请您拍砖!
*原作者 :Sijin Joseph
*英文原文请看 这里
*感谢 bearice 提供修改意见和空间。
posted @ 2010-03-12 21:33 XGuru 阅读(4066) | 评论 (1)编辑 收藏

Memcached是一个自由、源码开放、高性能、分布式内存对象缓存系统,目的在于通过减轻数据库负载来使动态Web应用程序提速。

俗话说好记性不如烂笔头。
这个文档是我用来记录阅读Memcached源码过程中的一些经验,以及分析memcached的一些内部工作机制。
希望也能给大家带来方便。

PDF目录

1. 背景 .................................................................................................................................. 3
2. memcached的安装 ........................................................................................................... 4
3. memcached的配置 ........................................................................................................... 5
4. memcached的使用 ........................................................................................................... 6
4.1. 存储命令 ............................................................................................................ 7
4.2. 读取命令 ............................................................................................................ 8
4.3. 删除命令 ............................................................................................................ 8
4.4. 高级命令 ............................................................................................................ 9
4.5. 其他命令 .......................................................................................................... 10
5. Memcached内部工作机制 ............................................................................................. 11
5.1. Memcached基本的数据结构 .......................................................................... 11
5.2. 基本设计概念和处理流程 .............................................................................. 12
5.3. 内部Hash机制 ................................................................................................ 15
5.3.1. Hash函数及冲突解决 ............................................................................. 15
5.3.2. HashTable主要函数 ................................................................................ 15
5.4. slab内存处理机制 ........................................................................................... 17
5.4.1. slab主要函数 ........................................................................................... 17
5.4.2. slab机制中所采用的LRU算法 ............................................................. 19
5.5. 控制item各种函数 ......................................................................................... 20
5.6. 守护进程机制 .................................................................................................. 22
5.7. Socket处理机制 .............................................................................................. 23
5.7.1. Unix域协议 .............................................................................................. 23
5.7.2. TCP/UDP协议 ......................................................................................... 24
5.8. 多线程处理机制 .............................................................................................. 25
5.9. 事件处理机制 .................................................................................................. 25
6. 未完善之处 ..................................................................................................................... 27
7. 参考文献 ......................................................................................................................... 28

本人水平有限,欢迎大家拍砖!
下载PDF

参考文献

[1].Masahiro Nagano[JP] & charlee().memcached全面剖析.2008-7-2

[2].W.Richard Stevens & 杨继张().UNIX 网络编程(第三版).2004

[3]. W.Richard Stevens.UNIX环境高级编程(第二版).2005

[4]. dsallings.Memcached FAQ.2009-9

[5]. bachmozart .Memcached源码分析(线程模型).

[6]. 爱写字开发博客.Linux下启用Wordpressmemcached支持.


posted @ 2010-01-23 00:39 XGuru 阅读(7250) | 评论 (10)编辑 收藏

     摘要: by Xguru  又说阶乘,这是老生常谈了吧。想都不用想,一个递归轻松搞定! int factorial(int n){    if( n == 1)        return 1; &n...  阅读全文
posted @ 2009-12-30 19:02 XGuru 阅读(1889) | 评论 (4)编辑 收藏

 

大家对数组的使用再熟悉不过了吧?
来看下这个程序,挺简单的。

1#include<iostream>
2int main()
3{
4    int a[] = {1,2,3,4,5};
5    for(int i = 0 ; i < 5; i++)
6        std::cout << i[a] << " ";
7    return 0;
8}


现在请仔细看第6行。
发现了什么?
试下编译一下看能不能通过?


把这个程序更加简化

1int a[5= {1,2,3,4,5};
2int b = 1[a];

 
再来看下产生的汇编代码
4:       int a[5] = {1,2,3,4,5};
00401568   mov         dword ptr [ebp-14h],1
0040156F   mov         dword ptr [ebp-10h],2
00401576   mov         dword ptr [ebp-0Ch],3
0040157D   mov         dword ptr [ebp-8],4
00401584   mov         dword ptr [ebp-4],5
5:        int b = 1[a];
0040158B   mov         eax,dword ptr [ebp-10h]
0040158E   mov         dword ptr [ebp-18h],eax

你没有看错,此刻这个数组春哥附体,a[1]的指向地址和1[a]是一样的,都是[ebp-10h]。

Why?

我们回忆一下数组和指针的关系,如何用指针来表示数组?
*a  就是 数组 a中下标为0的值的引用,即a[0],
那么*(a+i) 呢?
表示的就应该是数组 a中下标为i的值的引用了,即a[i],
那么这种现象也不足为怪了:
因为 *(a+i)  == *(i+a)
所以 a[i] == i[a]

是不是感到 啊哈!灵机一动(aha! Insight)了呢?

扩展资料:《C陷阱与缺陷》p33~p38




posted @ 2009-12-24 00:55 XGuru 阅读(2138) | 评论 (14)编辑 收藏

      深入学习了STL的内部构造以及一些C++深层次的机制与技巧以后,突然浮现出每个Programmer都要面对的问题。

      Why Programming in C++?

      比起质朴纯净的C,灵活庞大的JAVAC#,我为什么要选择C++?

       在各大技术BBS和牛人的BLOG里逛,大家都在为自己喜欢的语言争论,C#/JAVA的程序员说,不要重复造车轮,拥有良好的语言平台,有丰富全面的库比较全,可以将注意力转向更为重要的架构方面,软件工程方面。又何必在语言的表层基础苦上苦痴迷?C++标准中连最基本的GUI库和网络库都没有。包括 C++创始人BJ本人也想将C++发展成为一个平台(palform)。

       C++STL库固然不错,但是一个新手用STL时,一个小错误编译就跳出上K的错误信息(就算有STLFilt,确实也以难安装),最新的C++0x中 能改善这一问题的万众瞩目的Concept已被取消,C++又该何去何从?C的程序员(包括Linus大叔)说,C++简直就是邪恶的语言,效率底下,语言繁杂,违反KISS原则,更无法在底层如操作系统中胜任。大家说的好像都有道理,难道C++就是这样一门高不成,低不就的语言么?

       我也用过C语言和C#语言,而且还在大学里也拿过关于这两种语言竞赛一些小小的奖,最起码能说对这两种语言还有粗略的了解。

       但是我最喜欢、花的时间最多的还是C++C++是我学的第一门语言,一路学来吃了不少苦,C++作为语言国度的一个联邦[EFC++Item1],灵活,弹性大让我着迷,它像一个精通太极的大师,容纳百川,但却深藏若拙。它有精妙的技法如SFINAEtag distributing (技法的复杂性这也是它被指责的重要原因)。

       它有沉着老练的STL库,其中有各种数据结构和常用算法的灵活精巧的实现和高度可扩充性,有锐意进取的boost库,loki库,有超重量级的网络通信开发框架ACE,还有效率较高的Blitz++科学库等。

       C#中的各种“高阶”功能C++都能实现(没有“基本”两字,您和我说不可能?那就去看看C#的托管机制是用什么语言写的吧),虽然您将花费更多的时间学习与调试,但是我觉得中途的乐趣只有您自己做过才能深有体会。

       它和C语言工作效率不分伯仲,(您说C++效率低下?请问您深入用过C++么?您看过SGI实做中内存分配的实现么?)C++也可以毫不费力的使用现有的 C代码(所谓C-Sytle),C++STL中泛型的sort完胜C中的qsort这也是C++程序员津津乐道的话题。

       但哪种语言不是经过无数大牛们大师们千锤百炼的产物?争论哪种语言的好坏只是显出您的自卑心理。当你去说一门语言好与不好的时候,你有想过,你有真正的深入的学过它么?你真正的了解这门语言的特性么?

       请记住这句话:好手艺人从不会责怪他的工具。语言没有好坏之分,只有在特定环境下,具备各自的优势。

       对于初学者而言,学通一门语言是他叩开计算机底层原理世界的大门的钥匙。语言的好坏不重要,关键是看你自身从学习这门语言中得到了什么。

       若是单单执着于语法细节,把把你的思想全部拘束在孔乙已争论茴香豆的“茴”的几种写法上(像贵国的等级考试这类的考察语言偏僻细节上),你将会得不偿失

       在学习的提高阶段,可以通过大体学习其他的语言,来发散自己的思维;甚至还可以帮助你更好的理解你所目前热爱的语言。

       还有一些人执着争论哪门语言更有“钱途”的时候,我建议您嘞,改行吧。 (您说我装清高,什么程序员也要吃饭,现实也很残酷之类的。我只能说,连吃饭都成问题的,您也不适合在这个层面上讨论语言的好坏,您还是继续学吧)。

  by XGuru 09年12月

posted @ 2009-12-20 23:10 XGuru 阅读(2006) | 评论 (11)编辑 收藏

仅列出标题
共2页: 1 2