Recent Posts
-
August 02, 2012
Linux 内核 ftrace 实现原理 和gcc的性能分析选项 Pg
在这里http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html 看到 ftrace的实现原理,觉得很有意思的用法。 linux 内核里面配置了开启ftrace之后,利用 gcc 的 -pg 选项,让每个内核函数的开头自动插入调用 mcount函数的代码。gcc 的 -pg选项是为了性能测试用的,但不知道ftrace还能利用到这点。ftrace实现了自己的mcount函数,这样就可以在每个内核函数调用到的时候i进...
-
June 14, 2012
C++字符串查找和匹配相关数据结构trie ,radix Tree,hat Trie,hash table和最好的字符串哈希函数fnv 1a
现在认为Murmurhash3 和CityHash 还有SpookyHash都比fnv这个算法要快吧。参考http://gmd20.blog.163.com/blog/static/16843923201362985128582/Trie 就是字典树http://en.wikipedia.org/wiki/Trie里面有个rie和 red black tree (红黑树)和hash table的性能比较的图,也有一些特点对比的介绍Gnu c++ std 的实现里面的容器http://gc...
-
June 14, 2012
C++ std list 是可以做到像linux 内核的list一样o(1)复杂度把元素从链表里面删掉的(std iterator的用法)
之前不知道iterator 还可以这样使用啊,搞到我想自己写了类似Linux内核的一个list的实现。可以把 list<Request*>::iterator 其实就是链表节点来的,整个list的其他元素的添加删除不会影响到你这个iterator 的。所以插入元素到list容器的时候,顺便把:iterator 这个也保存到元素自己一个子变量。然后需要删除的时候,根据iterator来删除就可以了。vector那些的iterator 类似普通的数组指针,但vector会自动...
-
June 12, 2012
C++ 单例模式 和静态变量初始化顺序导致的dll加载失败问题
C++如果有很多静态变量处于不同的文件里面,静态变量的初始化顺序是不确定的。碰到一个bug,就是单例模式 静态变量实例A的构造函数里面去调用 类B的静态函数, B的这个静态函数里面访问了自己的静态成员编码C。结果A初始化实在B的静态变量的前面的,所以程序就crash了。因为是在静态变量的构造函数里面失败的,就只会出来一个对话框提示DLL初始化失败,如果是用loadlibrary的也会提示dll加载不成功的。 好像在类的构造函数里面,很容易碰到这种依赖初始化顺序导致的bug啊...
-
June 04, 2012
C++ 的placement new () 语法,在指定内存地址构建对象
经常看到这种用法,在这里又看到一个了https://github.com/facebook/folly/blob/master/folly/ProducerConsumerQueue.h最简单的, “new (指定的地址) ” 其实就是 在 指定的地址已经存在的内存上面调用构造函数建新的对象。 有时可以避免动态申请内存,提高性能,例子参考上面文件里面queue里面插入元素的构建。解释可以参考下面这两个。Placement syntaxhttp://en.wikipedia.org/wiki...
-
May 31, 2012
Linux tcpdump抓包程序原理,pf_packet socket接口相关的实现
PF_PACKET 往是专门用于抓包的,往系统网络层注册一个协议。然后所有的往外发的包和进来的包都会调到http://lxr.linux.no/linux+v3.4/net/packet/af_packet.c 这个文件里面 的packet_rcv() 函数,其中 outgoing方向(出去的包)会在 dev_queue_xmit_nit里面遍历 ptype_all 链表进行所有网络协议处理的时候调用到packet_rcv 。incoming 方向(从外面其他机器进来的包会在 neti...
-
May 25, 2012
C++ template 模板实现分开在头文件和源文件导致的linker找不到函数实现的链接错误
C++的模板的代码,最好全部放在一个头文件里面,不然编译的时候,可能看到链接器找不到模板函数的错误。简单的就是模板的实例化的时候找不到定义。书中给出了好几种解决办法除了 全部放在头文件的 这种“Inclusion Model”办法之外,还有利用C++关键字 export的办法,其他几种办法自己去看书吧。上次一个同事碰到这个问题了,我当时也不知道。不知道以后会不会忘记了,记录一下便于查找方便。C++ Templates - The Complete Guide.pdf 一书的Chap...
-
May 21, 2012
Zeromq 基于无锁消息队列(lock Free的pipe)的无锁多线程模型 (actor model) 比较有意思的
原文地址: ZeroMq的架构文档http://www.aosabook.org/en/zeromq.html强烈建议读一下这个吧在线源码:https://github.com/zeromq/libzmq/tree/master/src1.i_engine.hpp -> stream_engine.hpp有多种继承自i_engine的类调用socket api的代码就是在这里面。2.socket_base.hpp -> xsub_socket_t session_base...
-
May 15, 2012
一个单个消费者和生产者的无锁队列 (lock Free queue ringbuffer)的c++实现
下载LOFTER我的照片书 |因为只有两个线程,一个线程里面只修改一个head,另外一个修改tail指针,所以没有竞争的问题。x86可以保证写内存操作不会乱序,所以下面的简单时间是没有问题的。 一开始怀疑代码里面用spinlock+ std::list 做的一个队列是不是锁竞争导致性能问题,不过最后发现耗时都是在网络的read write操作上。这种的无锁的 ringbuffer的实现,在每秒 几千个的情况下根本看不出和spinlock的区别来。网上抄来的,随便看看吧,以后...
-
May 14, 2012
False sharing 的原理还是这篇文章讲的最清楚
http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/Avoiding and Identifying False Sharing Among Threads多个线程同时写一个cache line的时候出现。