- 博客(28)
- 资源 (1)
- 收藏
- 关注
原创 libevent
Libevent 运用了大量的数据结构,小根堆:Libevent使用堆来管理Timer事件,其key值就是事件的超时时间,源代码位于文件min_heap.h中。所有的数据结构书中都有关于堆的详细介绍,向堆中插入、删除元素时间复杂度都是O(lgN),N为堆中元素的个数,而获取最小key值(小根堆)的复杂度为O(1)。堆是一个完全二叉树,基本存储方式是一个数组。哈希表:
2015-01-30 23:34:24 551
转载 stl内存池学习(一)——内存池初认识
最近开始学习内存池技术,《高质量c++/c编程指南》在内存管理的第一句话就是:欢迎进入内存这片雷区,由此可见掌握内存管理对于c++/c程序员的重要性。使用内存池的优点有:降低动态申请内存的次数,提升系统性能,减少内存碎片,增加内存空间使用率。 内存池的分类: 一、不定长内存池:优点:不需要为不同的数据创建不同的内存池,缺点是分配出去的内存池不能回收到池中(?)。代表有a
2015-01-30 00:26:53 1064
转载 深入理解TAILQ队列
工作的主要内容是tcp/ip,平台是FreeBSD,而且在内核态开发,所以很多情况下会涉及内核的一些数据结构和宏,比如说mbuf和TAILQ等。 TAILQ是FreeBSD/linux内核对双向队列操作的一种抽象,抽象程度不亚于C++,能实现操作队列需要的各种操作:插入元素,删除元素,遍历队列等。这个队列的优点是插入元素很快。 这里先回顾一下队列的特点(来自维基百科http://zh.wiki
2015-01-29 23:55:51 681
转载 Linux queue.h之TAILQ队列分析
libevent中的例子中使用的是FreeBSD下的queue.h,在linux的/usr/include/sys/queue.h也有该头文件,但是是一个缩减版本,而且没有看到queue 的access method,不知道是不是跟我们的linux服务器版本有关,没办法google了一下,找到了FreeBSD 下queue.h的定义,我们看一下tail queue的定义 C代码
2015-01-29 23:55:10 813
转载 关于libevent与FreeBSD内核中TAILQ队列的理解
在看libevent源码中TAILQ的时候发现了一些让我迷惑的地方,就是里面的双端队列以及链表中节点的next与prev指针,它的设计与我们一般的链表以及linux内核的list完全不一样,因为里面的prev根本不是指向前一个节点,而是指向前一个节点的next元素的地址:#define TAILQ_HEAD(name, type)
2015-01-29 00:58:09 856
转载 Protocol Buffers Language Guide之proto文件类型格式分析
1、 定义一个消息类型:message SearchRequest { required string query = 1; optional int32 page_number = 2; optional int32 result_per_page = 3;}A.特定域的类型:两个整型变量page_number和result_per_page
2015-01-27 23:38:14 628
转载 TCP/IP 协议族简述
网络协议通常都是分层开发的,一个协议族(protocol suite)则是不同 layer(层)上的协议的集合,TCP/IP 协议族是我们常用的一个协议族,其包含 4 个 layer:Link layer 也被叫做 Data link layer(数据链路层)或者 Network interface layer(网络接口层)。此 Layer 主要包括设备的驱动(device driver)
2015-01-27 01:03:38 565
转载 TCP 连接的建立和中断
在阅读本文之前,可以先了解一些基本术语:http://name5566.com/1348.htmlTCP 是一个面向连接(connection-oriented)的协议(区别于 UDP),在双方发送数据前需要在它们之间建立一个连接(connection)。为了搞清楚 TCP 连接的建立和中断,我们从一个实际的例子说起(这里直接摘取《TCP/IP Illustrated, Volum
2015-01-27 01:01:22 1411
转载 网络游戏协议以及分发模块的设计
应用层消息的格式无论是做何种网络应用,必须要解决的问题之一就是应用层从字节流中拆分出消息的问题,也就是对于 TCP 这种字节流协议,接收方应用层能够从字节流中识别发送方传输的消息。解决此问题有几种方法:使用特殊字符或者字符串作为消息的边界,应用层解析收到的字节流时,遇见此字符或者字符串则认为收到一个完整的消息为每个消息定义一个长度,应用层收到指定长度的字节流则认为收到了一个完整的消
2015-01-27 00:57:57 932
转载 在网络游戏中使用 Protobuf 解决属性同步问题
网络游戏常常需要把一个对象的属性同步到客户端去,例如物品详细信息:耐久度、堆叠数量、位置等。逻辑常常是这样的,玩家上线,服务端将某个物品的所有属性同步到客户端,为此我们会定义一个消息来做此工作,如果某个时刻物品的耐久度发生了变化,我们就需要把耐久度发送下去,这样就又存在一个同步耐久度的消息,因此我们需要为一个属性定义一个消息。那么必然面临几个问题:维护的问题,每次增加和删除属性都需要:
2015-01-27 00:51:23 1334
转载 C++ 并发编程的一种思维 — Theron 库简述
本文由 name5566 首发于 InfoQ:http://www.infoq.com/cn/articles/cpp_concurrent_programming_introduce_theron愈发紧迫的挑战现今,单台机器拥有多个独立的计算单元已经太常见了,这点在服务器的处理器上表现尤为明显,据 AMD 的一张 2012-2013 服务器路线图显示,服务器处理器的核心数将在 2
2015-01-27 00:40:00 3184
转载 从 bufferevent 实现学习 Libevent 的使用
Libevent 2 提供了 bufferevent 接口,简化了编程的难度,bufferevent 实际上是对底层事件核心的封装,因此学习 bufferevent 的实现是研究 Libevent 底层 event、event_base 用法的一个好办法。本文假定你已经对 Libevent 有一定的认识,否则可以先阅读我关于 Libevent 的介绍: Libevent(1)— 简介、编译、配
2015-01-27 00:27:38 1050
转载 Libevent(5)— 连接监听器
此文编写的时候,使用到的 Libevent 为 2.0.21Libevent 提供了连接监听器 evconnlistener创建 evconnlistener 实例// 连接监听器回调函数原型typedef void (*evconnlistener_cb)( struct evconnlistener *listener, // 新的 socket evut
2015-01-27 00:21:50 633
转载 Libevent(4)— Bufferevent
此文编写的时候,使用到的 Libevent 为 2.0.21Buffer IO 模式bufferevent 提供给我们一种 Buffer IO 模式(这里以写入数据为例):在我们需要通过某个连接发送数据的时候,先将等待发送的数据放入到一个 buffer 中等待此连接可以写入数据尽可能多的获取 buffer 中的数据写入此连接如果 buffer 中还有需要写入的数据则继续等待直到此连
2015-01-27 00:21:24 552
转载 Libevent(3)— 基础库
此文编写的时候,使用到的 Libevent 为 2.0.21常用基本数据类型evutil_socket_t 用于保存 socketev_uint64_t 取值范围 [0, EV_UINT64_MAX]ev_int64_t 取值范围 [EV_INT64_MIN, EV_INT64_MAX]ev_uint32_t 取值范围 [0, EV_UINT32_MAX]ev_int32_t 取值
2015-01-27 00:20:26 535
转载 Libevent(2)— event、event_base
此文编写的时候,使用到的 Libevent 为 2.0.21。本文略过了关于 event 优先权和超时相关的讨论。创建和销毁 event_baseevent_base 是首先需要被创建出来的对象。event_base 结构持有了一个 event 集合。如果 event_base 被设置了使用锁,那么它在多个线程中可以安全的访问。但是对 event_base 的循环(下面会马上解释什
2015-01-27 00:18:25 666
转载 Libevent(1)— 简介、编译、配置
此文编写的时候,使用到的 Libevent 为 2.0.21Libevent 之跨平台在处理大量 SOCKET 连接时,使用 select 并不高效。各个系统都提供了处理大量 SOCKET 连接时的解决方案:Linux 下的 epoll()BSD 下的 kqueue()Solaris 下的 evportsWindows 下的 IOCP由于各个平台使用了不同的接口,那
2015-01-27 00:17:16 2188
转载 Protocol Buffer技术深入理解(C++实例)
这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较有利于培训和内部的技术交流。还是那句话,没有最好的,只有最适合的。我想写Blog也是这一道理吧,不同的技术主题可能需要采用不同的风格。好了,还是让我们尽早切入主题吧。一、生成目标语言代码 下面的命令帮助我们将MyMessage.proto
2015-01-26 23:54:40 552
转载 怎样在VS2010中打开VS2012的项目
VS2012中对C#的支持度非常好,不管是编写方便程度(不需要插件就能高亮代码及代码自动提示功能),还对MFC的一些功能优化很多。 我们可以修改两个工程文件来把VS2012的工程文件一直到VS2010中去。 首先当然是修改解决方案文件(.sln文件)。 使用记事本打开,把里面的Microsoft Visual Studio Solution Fil
2015-01-26 23:22:36 516
转载 boost::noncopyable学习
在学习boost的时候,发现很多类都继承至boost::noncopyable,那么boost::noncopyable这个类是干什么用的呢?原来boost::noncopyable允许程序实现一个禁止复制的类,即不能使用类的复制构造函数和复制赋值操作符。以前在写程序的时候,经常反复实现一个不可复制的类或者单例类,于是经常性的拷贝、粘贴,不时还有一些小错误发生。现在boost::noncopyab
2015-01-25 00:23:10 810
转载 如何断点调试多线程? .
下面是我的代码: private void menuItem2_Click(object sender, System.EventArgs e) { Thread thread=new Thread(new ThreadStart(this.foo)); thread.Start(); //在这一行
2015-01-08 12:56:01 3104
转载 Linux和Windows下Socket句柄(描述符)的分配策略
烽驿2009开源实时通信平台 源码获取:svn checkout http://fy2009.googlecode.com/svn/trunk/ fy2009-read-only 大型通信服务器软件通常需要管理成千上万的连接,为了在底层Socket句柄(Linux上称为描述符)上收到数据时能快速递交给应用层连接对象,实现一种高效的以Socket句柄为Key的连接对象查找算法是绝对必
2015-01-08 11:51:51 1775
转载 多线程编程指南
多线程编程指南1--线程基础线程编程指南1--线程基础Wednesday, 29. March 2006, 11:48:45多线程本文出自:BBS水木清华站 作者:Mccartney (coolcat) (2002-01-29 20:25:25)multithreading可以被翻译成多线程控制。与传统的UNIX不同,一个传统 的UNIX进程包含一个单线程,
2015-01-03 13:20:23 1078
转载 如何在三个月内获得三年的工作经验
在多年的工作生涯中,总会目睹一批人的升职像火箭速度一样。而总有一批人,就像蜗牛一样,工作岗位和职位几乎从来不变。我们看看,2个名人的快速成长史。一个是教英语的李阳,他读大学时成绩不好,英语不及格,然后他做什么去了?他跑到没人的地方大声喊英语去了.一个是做广告的叶茂中,他卖广告卖不出去了,他跑回家写书.别人看到的和他自己说的是拿着书出版出了名,发达了.其实做过这个
2015-01-03 13:16:56 625
转载 tcp 三次握手和四次断连深入分析:连接状态和socket API的关系
说到tcp协议,凡是稍微看过的人都能顺口说出三次握手和四次断连,再牛逼的一点的就能够把每个状态(SYNC_SENT、CLOSE_WAIT。。。。。。等)都能背出来,而说道socket编程,基本上写过网络编程的人都会熟悉那几个标准的API:socket、connect、listen、accept。。。。。。等但是,我敢打赌很少有人明白tcp状态和socket编程API之间
2015-01-03 00:28:28 507
转载 Nginx的事件处理机制
Nginx的事件处理机制:对于一个基本的web服务器来说,事件通常有三种类型,网络事件、信号、定时器。 首先看一个请求的基本过程:建立连接---接收数据---发送数据 。再次看系统底层的操作 :上述过程(建立连接---接收数据---发送数据)在系统底层就是读写事件。1)如果采用阻塞调用的方式,当读写事件没有准备好时,必然不能够进行读写事件,那么久只好等待,等事件准备好了,才能进行读
2015-01-03 00:19:51 428
转载 Nginx特点
Nginx特点:1,跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本。2,配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置。3,非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)。4,
2015-01-03 00:18:37 548
转载 MarioTCP:一个单机可百万并发长连接服务器
注:如果用此服务器做变长data的传输,请在业务处理函数中为input buffer增加清空功能(一行memset搞定;也可以在mariotcp核心代码mario_network.c的read功能中增加,mariotcp为了追求性能极限没做此设置)。mario_network.c 文件的 on_conn_read()函数中:[cpp] view plainc
2015-01-03 00:15:47 2847
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人