Archive for 二月, 2010

C++智能指针之auto_ptr实现分析

星期三, 二月 24th, 2010

C++的动态内存的分配与释放是个挺折磨人的事情,尤其当业务逻辑变得复杂时(比如一堆try catch中,各catch里需要做delete 掉相关的堆上分配的内存),极有可能产生内存泄露的情况,尤其是一些很难触发的分支条件。C++中提供了智能指针作为可选的解决方案, C++标准库中自带的智能指针是auto_ptr,它在大多数场景下是满足需求的。针对auto_ptr的缺点,boost和loki两套库都扩展出一些智能指针,并且boost中有两位幸运儿入选了tr1中(std::tr1::shared_ptr,std::tr1::weak_ptr)。本文就gcc中auto_ptr的实现做些分析,以飨自己。笔记采用注释源码的方式。

豆瓣beansdb源码浅析

星期六, 二月 20th, 2010

Beansdb是豆瓣荣誉出品的分布式key-value存储系统,该系统是对经典的Dynamo的简化。项目地址:http://code.google.com/p/beansdb/,其上的
Inside BeansDB.pdf文档是对beansdb的很好的介绍。

Beansdb的CAP特点表现为:

1)分布式的,伸缩性比较好(P)

2)最终一致的(C),可能出现短时间内的数据不一致。

3)高可用的(A),部分节点出现故障不影响服务。

Beansdb在豆瓣内部有着广泛的使用,比如图片文件、小媒体文件、profile、properties等等。Beansdb不像GFS等分布式存储系统,一般不用于存储百兆以上单位的大数据。

使用记录锁实现进程间锁

星期五, 二月 12th, 2010

在一篇比较lightty和nginx实现机制的文章中提到,nginx相比于lightty,在多work进程accept时做了加锁处理,对于linux2.4之前的版本,不加锁会出现“惊群现象”。之前也隐约记得,apache对多进程的accept也是做了加锁处理。对这方面不是很熟悉,所以就翻看nginx代码查找加锁的实现代码,最后确认是使用的文件记录锁(record lock),APUE上有详细说明,这里只简单的摘取说明。

一周技术文档分享

星期四, 二月 11th, 2010

1、SYNCHRONIZING DATABASES IN DIFFERENT GEOGRAPHIC LOCATIONS

http://highscalability.com/blog/2007/12/7/synchronizing-databases-in-different-geographic-locations.html

翻出很久之前的一篇文章,该文提出了跨地域同步数据的问题。就Mysql来说,如果数据需要在两个地域传输,使用双主复制模式是较为简单的方法。如果mysql能支持多主复制模式,多地域的数据复制或许就解决了。但多主复制很难搞,这种多点并发复制很难自动化的处理提交冲突的问题。

SEDA介绍与分析

星期天, 二月 7th, 2010

SEDA(Staged Event-Driven Architecture)并不是很新的技术,但它总会在我阅读的资料里出现些许影子,所以就拿出一些时间看了一下与它相关的论文资料。SEDA的目标很远大,它要构建支持大并发的互联网系统,并克服多线程及事件驱动的服务器端模型的缺点。但SEDA来源于学术界,并且这个东西还是有些复杂了,所以至今工业级的应用不是很多。它的官网是http://www.eecs.harvard.edu/~mdw/proj/seda/,上面的一些论文还是很不错的,值得拜读。