Recent Posts
-
April 11, 2012
C和c++ 定时器管理队列结构
下载LOFTER我的照片书 | 不知道asio::deadline_timer 用的比较多的时候,性能怎么样? 打算自己在上层实现一个定时器的管理。这个为了能够在很多定时器里面找到最近超时的定时器,又要用比较小的代价。很多事件驱动库都是用个最小堆结构来管理的吧,好像linux内核里面分了几个长短不一的链表,这样每次只要去最快超时的那个队列去查找就可以了。不过最好就是只用一个定时器啦,这样就比较很多定时器查找的消耗,想以前 Linux的scsi驱动层,以前为每个request设一...
-
March 28, 2012
C++ 十六进制字符编码hex encode decode 和vc2010的性能分析工具(performance analysis)的使用
下载LOFTER我的照片书 | 因为要用到16进制编码的字符串编码,自己 其实也是考虑用stringstream写个简单的格式化函数。然后在网上确实找了一个,然后改了一下。copy起来就是简单啊,不用花太多的时间去敲代码和调试。这就是下面代码里面的hex_encode 和hex_decode函数。但感觉这种方便,生成的临时string对象很多,我那个应用其实是可以原地编解码的,就在网上找了个c风格的,就是下面的hex_encode 和 hex_decode,。从ht...
-
March 19, 2012
Boost bind 传递引用和指针的区别导致的bug
一个例子 。class A {public:virtual void print () { cout << "This is A" << endl;};};class B: public A {public:virtual void print () { cout << "This is B" << endl;};};void print( A & a){ a.print();}void test ( A &...
-
March 12, 2012
Spinlock 的很多线程抢占时的性能优化,补充 pthread mutex 和 futex相关知识
微博里面看到有人说spinlock线程比较多在以前抢占锁时性能比价差。因为之前搜索过c++了spinlock,大多解决办法就是 那种指数的规避的办法咯,就是如果实在不行,就先让cpu指数的等待时间空转几次,实在还是拿不到锁在休眠。可以去看nginx的 core 代码的spinlock文件的实现。像那些boost的spinlock也差不多大,之前说过了。 这样很多个线程都在抢那个锁的时候,不至于都在那里忙等,比较好一点。 在网上搜索一下 “spinlock Exponent...
-
March 09, 2012
Linux 内核fs aio 源码阅读
下载LOFTER我的照片书 | 线程 和执行流程(1)用户调用io_submit 之后,应该是马上通过异步文件操作,request直接下到文件系统下面去了,文件系统完成了之后,调用aio_complete 通知 aio模块,aio模块会把完成事件放到aio_ring的环形缓存里面,或者用eventfd通知用户程序,或者等待用户自己调用io_getevent来检测状态。(2)然后全系统只有唯一一个workqueue 来执行那些需要重试的request 。 看注释说这样是避免多个reque...
-
March 03, 2012
Libeio 源码简单阅读
libeio 和 libev同一个作者写的吧,看网上有一篇文章说是node.js用的这个来做异步文件操作的。http://cvs.schmorp.de/libeio/大概过了了一下,代码很少,全部放到一个文件里面,也不复杂,只是宏用的有点多,看起来不是很明了。其实就是把异步操作放到request里面,然后启动几个工作线程,工作线程就会去队列里面那request处理。没有看到什么印象特别深刻的地方。struct eio_req 每个用户的异步操作都放到一个request结构里面去吧。...
-
March 02, 2012
网卡驱动多队列multiqueue 相关知识
以前还在上家公司做vmware esxi5 hypervisor 移植的时候,有接触到Linux网卡驱动看到这个多队列的,但不是很理解这个来用来干什么 ,那是也是和关系。看了这下面这篇文章才知道这个multiqueue原来是这样用的。按照文章说法,多队列之后,在多cpu机器上就可以每个cpu分配一个队列了,这个没个cpu都有独立的queue,“锁争用"和内存争用的情况就可以避免了,性能有很大提高,文章里面应用于 xen 的虚拟网卡,每个虚拟机有独立的一个队列,性能有很大的提高。那个...
-
February 13, 2012
Memory barrier 内存屏障
关于Memory Barrier,理解并行编程必须掌握的一个知识点吧,但用户编程好像接触的不多,至少我没发现那个语言的参考书有说这个的。(2012-2-24 补充, visual c ++ 里面比较新的版本有支持了,硬件的Memory Barrier 有宏 void MemoryBarrier(void);软件的 编译器提示的Memory Barrier 的有宏 _ReadBarrier, _WriteBarrier, and _ReadWriteBarrier http://msdn....
-
February 12, 2012
C++无锁编程资料,无锁队列等
1. Lamport's Lock-Free Ring Buffer [Lamport, Comm. of ACM, 1977] 也就常说的单生产者-单消费者 的ringbuffer, 限制就是只能一个读线程(消费者),一个写进程(生产者)。 好像有人改进了一下设计, 参加文章 “Cache优化的并发无锁队列” http://www.docin.com/p-30332640.html ,这论文里面 “Fastforward for efficient pi...
-
December 31, 2011
Lsm Tree(log Structured merge Tree)
数据库事务系统的一个优化结构,在某些场合比B-tree要好吧。google 出品的高性能key-value数据库levelDB应该是就是根据这个思想实现的。其实就是一个多级的B-tree吧, 通过延时的“磁盘写和归并排序”来减少磁盘写操作,进而提高系统的整体性能。他把多个随机的磁盘写操作,变成一个批量的连续的磁盘的写操作。适合于那种插入很频繁,但查找不是很频繁的应用场合吧(后台的归并整理之前的查找应该是有些性能损失的。)。网上可以找到这个pdf文档,文档讲的很清楚,什么原理看上去并不复杂,...