正文内容加载中...
posted @ 2013-05-30 22:51 PromisE_谢 阅读(799) 评论(3) 推荐(0) 编辑
摘要:我们在阅读C/C++的开源代码时,常常会遇到这样的烦恼。很多开源项目是跨平台的,代码中使用了大量条件编译,充斥着各种#ifdef(#ifudef)等等。这些代码段对于源码阅读者来说,通常是一种干扰(源码阅读者通常是基于某一个固定平台的),这里介绍一种简单的方法,用来移除不必要的代码段。首先下载一个源码处理的小工具:(其他Linux发行版请使用对应的包管理工具)sudo apt-get install unifdef拷贝一份源代码目录,并进入拷贝的目录中:cp src/ src_bak/ -r && cd src_bak/使用unifdef(假定我们要去掉所有基于WINDOWS和 阅读全文
posted @ 2013-03-11 23:26 PromisE_谢 阅读(818) 评论(0) 推荐(0) 编辑
摘要:就在近日,Facebook宣布开源了内部使用的C++底层库,总称folly,包括散列、字符串、向量、内存分配、位处理等,以满足大规模高性能的需求。这里是folly的github地址:https://github.com/facebook/folly在folly项目的Overview.md中,谈到了folly库的初衷:It complements (as opposed to competing against) offerings such as Boost and of coursestd. In fact, we embark on defining our own component o 阅读全文
posted @ 2012-06-05 01:55 PromisE_谢 阅读(10019) 评论(8) 推荐(9) 编辑
摘要:本文仅仅从应用的角度来谈一谈Berkeley DB中锁相关的理论与实践经验,接下来还会有一篇博客来介绍BDB锁的内部实现。锁粒度除了Queue Access Method,其他所有的Access Pattern都是页级锁(page-level locking),而Page大小默认为操作系统filesystem的block size(Linux下默认为4K)。(可以通过减少Page大小,使一个Page上容纳更少的记录来减少页级锁粒度,但是减小Page会影响数据库的IO效率,在缺乏足够性能数据支撑的情况下,很少会这样做。) BDB的页级别的锁粒度一向是比较恼人的问题,由于Queue并不常用(ke. 阅读全文
posted @ 2012-06-01 13:11 PromisE_谢 阅读(3337) 评论(0) 推荐(4) 编辑
摘要:对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。一个简单的问题:在*nix操作系统上,怎样保证对文件的更新内容成功持久化到硬盘?1. write不够,需要fsync一般情况下,对硬盘(或者其他持久存储设备)文件的write操作,更新的只是内存中的页缓存(page cache),而脏页面不会立即更新到硬盘中,而是由操作系统统一调度,如由专门的flusher内核线程在满足一定条件时(如一定时间间隔、内存中的脏页达到一定比例)内将脏页面同步到硬盘上(放入设备的IO请求队列)。因为write调用不会等 阅读全文
posted @ 2012-05-27 14:11 PromisE_谢 阅读(11479) 评论(3) 推荐(3) 编辑
摘要:本文简单地介绍了Berkeley DB在多进程环境下的环境恢复机制。 阅读全文
posted @ 2012-05-09 23:49 PromisE_谢 阅读(2222) 评论(2) 推荐(1) 编辑
摘要:Copy-on-write(以下简称COW)是一种很重要的优化手段。它的核心思想是懒惰处理多个实体的资源请求,在多个实体之间共享某些资源,直到有实体需要对资源进行修改时,才真正为该实体分配私有的资源。COW技术的一个经典应用在于Linux内核在进程fork时对进程地址空间的处理。由于fork产生的子进程需要一份和父进程内容相同但完全独立的地址空间,一种做法是将父进程的地址空间完全复制一份,另一种做法是将父进程地址空间中的页面标记为”共享的“(引用计数+1),使子进程与父进程共享地址空间,但当有一方需要对内存中某个页面进行修改时,重新分配一个新的页面(拷贝原内容),并使修改进程的虚拟地址重定向到 阅读全文
posted @ 2012-03-22 23:35 PromisE_谢 阅读(14855) 评论(9) 推荐(5) 编辑
摘要:我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉:1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等)2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplexing、非阻塞、异步等各种技术。关于TCP/IP协议,建议参考Richard Stevens的《TCP/IP Illustrated,vol1》(TCP/IP详解卷1)。关于第二层面,依然建议RichardStevens的《 阅读全文
posted @ 2012-03-03 00:28 PromisE_谢 阅读(27638) 评论(9) 推荐(11) 编辑
摘要:实现一个开源KV数据库的想法来源于对目前项目中所使用的K-V数据库使用情况的不满意。先介绍一下我们的目前项目,作为本文的背景:较为底层的分布式运行平台,使用C/C++实现的Actor模型(异步消息传递系统)数据schema简单灵活,使用key-value能够很好表示。数据库有大量的读写请求,有事务需求,数据丢失容忍度很低。当前,从众多的KV和NOSQL存储产品中,我们使用了Berkeley DB作为底层的存储引擎。为什么选择BDB呢?1.与传统的RDBMS相比,简单K-V存储的Berkeley DB(再加入“嵌入式”直接库链接的特性)有着优越的性能,容易满足我们大量读写(尤其是大量写)的需求。 阅读全文
posted @ 2012-01-12 23:09 PromisE_谢 阅读(3503) 评论(1) 推荐(1) 编辑
摘要:1.false sharing原因:CPU loads memory into cache by "line"Linux下获取cache line :cat /proc/cpuinfo | grep cache_alignmentor cat /sys/devices/system/cpu/cpuN/cache/indexN/coherency_line_size 以及其他详尽的cpu cache信息Maybe : get cacheline programatically ( via C language )Multi-cpu contention algorithm & 阅读全文
posted @ 2012-01-11 22:38 PromisE_谢 阅读(1028) 评论(0) 推荐(0) 编辑