- 博客(39)
- 资源 (10)
- 收藏
- 关注
原创 执行ldconfig后遇到的问题
今天装了一个lib(./configure, make, make install),编译程序时,提示链接错误,找不到对应的.so文件,然后就在/etc/ld.so.conf.d下面增加了一个文件,内容为: /usr/local/lib,因为刚刚在自己的虚拟机上做过此过程,想都没想就执行了ldconfig,话说这些操作在开发过程中都很正常。 但是奇葩的事出现了,之后执行任何shell命令(确
2013-06-25 21:37:32 4906
原创 关于锁的自动释放
这种方案一直在用,但是一直没能领会到它的意图,也是在一个面试过程中,被问到一个此类问题,从而才想到的。 问题:当在一个函数中使用锁时,如果加锁后由于某种原因(疏忽,异常等),没有释放锁就直接退出了,那么将导致锁的状态错误,怎样解决这个问题?1、没有正常释放锁:就像下面的程序一样(这里仅作为示例,选用mutex):#include #include
2012-08-29 23:50:08 2281
转载 SSH远程会话管理工具
SSH远程会话管理工具VPS侦探在刚接触Linux时最怕的就是SSH远程登录Linux VPS编译安装程序时(比如安装lnmp)网络突然断开,或者其他情况导致不得不与远程SSH服务器链接断开,远程执行的命令也被迫停止,只能重新连接,重新运行。相信现在有些VPSer也遇到过这个问题,今天就给VPSer们介绍一款远程会话管理工具 - screen命令。一、screen命令是什么?
2012-08-20 13:02:36 1001
原创 Hadoop学习笔记
前段时间,学习了一下Hadoop MapReduce,这里进行简单的总结,主要来自于《Hadoop In Action》。 后续将按照Hadoop处理的顺序整理一些笔记,主要包括: (1)Hadoop预定义数据类型; (2)Hadoop InputFormat;
2012-07-12 13:47:55 6318
原创 平滑升级Nginx的Shell脚本
Nginx平滑升级说明,来自《Nginx Http Server - Updating Nginx gracefully》,这里不进行翻译了,原文如下: There are many situations where you need to replace the Nginx binary, for example, when you compile a new versio
2012-06-28 15:36:09 1620
原创 levelDB源码分析-TableCache
Table相当于.sst文件在内存中的映像,它保存了.sst文件的Index Block数据。 TableCache相当于所有打开的.sst文件在内存中的管理结构,内部采用LRUCache,每个打开的.sst文件在LRUCache中都有一项:map {file, table}> static void DeleteEntry(const Slice& key
2012-06-14 17:37:44 2277 1
原创 levelDB源码分析-SSTable:.sst文件构建与读取
.sst文件的构建是通过TableBuilder进行的,读取主要集中在TableBuilder操作(table_builder.cc)如下: struct TableBuilder::Rep { // TableBuilder内部使用的结构,记录当前的一些状态等 Options options; Options index_block_o
2012-06-14 17:35:47 5569 3
原创 levelDB源码分析-SSTable:Block
levelDB中涉及Block操作的接口机函数基本如下: class Block; // Block数据结构定义,主要通过Block::Iter操作 class Block::Iter : public Iterator ; // Block中每个entry的迭代器,内部使用DecodeEntry解析每个entry static
2012-06-14 17:32:55 4132 1
原创 levelDB源码分析-SSTable
SSTable是Bigtable中至关重要的一块,对于LevelDB来说也是如此,对LevelDB的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。 本节内容主要讲述SSTable的静态布局结构,SSTable文件形成了不同Level的层级结构,至于这个层级结构是如何形成的我们放在后面Compaction一节细说。本节主要介绍SSTable某个文件的物理布局和
2012-06-14 17:30:40 9359 2
原创 levelDB源码分析-Log文件
levelDB中log文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据。因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及Dump到磁盘的SSTable文件,LevelDB也可以根据log文件恢复内存的Memtable数据结构内容,不会造成系统丢失数据,在这点上LevelDb和Bigtable是一致的。
2012-06-14 17:22:40 5270 2
原创 levelDB源码分析-Memtable
本节讲述内存中LevelDB的数据结构Memtable,Memtable在整个体系中的重要地位也不言而喻。总体而言,所有KV数据都是存储在Memtable,Immutable Memtable和SSTable中的,Immutable Memtable从结构上讲和Memtable是完全一样的,区别仅仅在于其是只读的,不允许写入操作,而Memtable则是允许写入和读取的。当Memtable写入的数据
2012-06-14 16:36:42 2816
原创 levelDB源码分析-Cache(LRUCache、HashTable)
leveldb内部通过双向链表实现了一个LRUCache,利用双向链表实现LRUCache的算法在《操作系统》中描述的很清楚,这里和标准的LRUCache一样,这里不再描述。 LRUCache内部实现了一个Hashtable,用于快速查找key对应的双向链表节点。 Class Cache采用虚函数定义了Cache的接口,具体实现的LRUCache继承Ca
2012-06-14 16:31:59 5308 1
原创 levelDB源码分析-Skiplist
这里主要介绍levelDB中关于SkipList的实现,关于SkipList介绍请求参阅《SkipList》,这里不再引用了。 在levelDB中的使用: levelDB中Memtable有一个核心的数据结构Skiplist,具体实现的代码稍有不同,但是基本原理是一致的。 levelDB中Skiplist定义为模板类:
2012-06-14 16:19:15 6253 3
原创 levelDB源码分析-Arena
Arena在leveldb中它是一个内存池,它所作的工作十分简单,申请内存时,将申请到的内存块放入std::vector blocks_中,在Arena的生命周期结束后,统一释放掉所有申请到的内存,内部结构如下图所示。 Arena定义为: class Arena { public: Arena();
2012-06-14 16:08:29 3614
原创 levelDB源码分析-Status
leveldb::Status表示levelDB的一个返回状态,通常的错误处理(如:errno)是返回一个错误号,然后根据错误号可以获得出错的描述信息。 leveldb将错误号和错误信息封装成Status类,来统一进行处理。 声明如下: class Status { public: // Create a
2012-06-14 15:54:08 3352
原创 levelDB源码分析-Slice
levelDB中Slice非常简单的数据结构,它包括length和一个指向外部字节数组的指针。为什么使用Slice,而不直接使用std::string呢? 1、相比返回string,返回Slice的开销会小的多(没有拷贝,Slice中没有实际数据,只有指向数据的指针,开销低)。 2、leveldb允许key和value包含'\0',不能返回以null结尾的
2012-06-14 15:44:16 5702
原创 levelDB源码分析-提纲
好久没有动静了,工作、加班、独自学习源码、整理资料 ... 接下来将发表一系列levelDB源码学习过程中记录下的东西,现已部分整理完毕,其中很多描述直接参照网上已经发布的关于levelDB实现原理及源码分析等相关资料,随后附上链接,并结合自己研读,附上代码注释,主要包括: 《levelDB源码分析-Slice》
2012-06-14 15:26:39 5078 1
原创 Source Insight宏 - CppUnit单元测试框架自动生成
一个好的开发工具能够极大的提高工作效率,而好的开发工具是智慧与努力的结晶。这里包括2个宏:CppUnitTest_CreateSuite和CppUnitTest_CreateMainCppUnitTest_CreateMain用来产生单元测试主框架,产生的文件为alltest.cpp,如下:#include #include int main(int argc, char**
2012-02-18 12:20:55 2257
原创 Source Insight宏 - 头文件与源文件切换(不限目录)
前面发布的帖子:Source Insight 宏 - 头文件与源文件切换用到的切换宏有一定的限制(要求在同一目录下),如源码结构为src、include、test时,include下头文件与src下源文件之间就不能实现切换,在使用过程中不免会产生一点影响,今天将其进行了修改,经测试可以达到不同目录下的文件切换,对目录再没有要求,但是同时如果源码中存在多个相同文件名(不同目录下)时,需要用户自己选择
2012-02-18 11:40:23 4755 1
原创 libmemcached1.0.2 C/C++ API使用实例、测试及修改
memcached是一个分布式的缓存系统,且其分布式是一种“轻量级”的分布式,完全依赖客户端库来实现,libmemcached就是一个开源的C/C++库。 使用libmemcached的C/C++ API客户端库资料及官方资料都很少,且网络上存在的C/C++ libmemcached实例都是采用的MOD的分布式算法,其缺点显而易见,当存在失效的memcached server
2012-01-18 13:42:31 12164 3
转载 linux epoll 模型介绍及程序实例
linux epoll模型介绍和程序实例1. epoll是何方神圣? epoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,其实都I/O多路复用技术而已,并没有什么神秘的。 其实在Linux下设计并发网络程序,向来不缺少方法,比如典型的Apache模型(Process Per Con
2011-12-16 13:03:06 1368
原创 memcached源码学习-总结篇
研究memcached源码有段日子了,前面几篇文章把memcached主要模块进行了介绍,主要有: memcached源码学习-内存管理机制slab allocator memcached源码学习-hashtable memcached源码学习-多线程模型 memcached源码
2011-12-07 17:03:44 1174
转载 memcached源码学习-daemon进程
memcached守护进程创建函数位于daemon.c中,创建方式同其它守护进程相同,这里只是作为备忘,特此设置转载。 首先引用《Linux 守护进程 daemon》中守护进程的创建过程,然后附上memcached的daemon.c源码说明。 Linux 守护进程编程守护进程最重要的特性是后台运行;其次守护进程必须与其运行前的环境隔离开来,这些环境包括
2011-12-07 16:34:12 1547
原创 memcached源码学习-items操作
今天主要总结items相关的操作,items的操作分布比较多,定义和实现在memcachd.h/c、thread.h/c、items.h/c都有,感觉完全可以放在items.h/c中。这里就对所有的这些操作(除去stats部分)进行一个简单的总结。 首先对数据结构、ITEM_*宏和一些变量进行一个简单的说明,这里先建立一个宏观的概念,理解了它们的用途对后续阅读程序有很大的帮助。
2011-12-07 10:53:58 1732 2
转载 [原创+转载] memcached源码学习-多线程模型
本来计划研究memcached的多线程模型,后来发现网上博文《Memcached源码分析(线程模型)》写的非常好,因此,也省去了我的大部分时间,这里并不打算自己再重新总结。 不过首先奉上我自己画的一张图,就称为memcached多线程交互的活动图吧,通过此图就基本掌握了main thread与单个worker thread的交互过程,图中序号表示基本的处理流程(图中driver_
2011-12-02 19:58:52 2080
原创 memcached源码学习-hashtable
今天来介绍memcached中hashtable部分的源码,hash部分的源码主要分布在assoc.h/c、hash.h/c中,总得来说代码比较简单,这里就稍微介绍一下。 hashtable通常包括哈希函数和解决冲突的方法两个最主要的因素,memcached使用的哈希函数为Bob Jenkins在1996年发明的,定义位于hash.h中,实现在hash.c中,作者与2006年时
2011-12-01 23:17:22 4486
原创 memcached源码学习-内存管理机制slab allocator
前端时间大致浏览了一下memcached的源码,但是并没有对相关的知识点进行总结和记录,所以很快就忘了,这次打算将memcached的源码再学习一遍,并进行总结归纳。 memcached模块化设计比较好,每个模块除了对外接口定义在头文件外,其它函数定义及实现都在源文件中,且定义为static类型,这样很好的降低了模块之间的耦合性。下面,浏览源码将按照功能模块进行划分,逐步学习总结。
2011-11-30 22:01:32 3648 5
原创 source insight与emacs之间中文乱码问题的解决方法
通过source insight编辑后的源码,在linux的emacs中查看时,中文显示总存在乱码;同样,在emacs中编辑后,在source insight中查看时,也是乱码。 经过多次试验,通过设置emacs的编码方式顺序,在~/.emacs中加入下面lisp,就可以正常显示了: (prefer-coding-system 'gb2312)
2011-11-29 14:33:20 2257
原创 源码自动化管理系列一: Mercurial + Apache配置
这段时间一直想配置一套自动化的源码管理服务器,包括:源码版本管理,持续集成,自动进行编译、单元测试、源码测试覆盖率统计,文档生成,基本的冒烟测试和测试目标的发布等等。 基于当前工作,首先选择了Mercurial分布式版本管理工具,Apache Http服务器,Buildbot持续集成工具搭建源码管理服务器,自动编译、单元测试、源码覆盖率等放在后续过程中。 本文主要简单介绍
2011-11-18 17:45:40 2488 1
原创 [python] 解析源码中的structs,并建立它们之间的引用关系
阅读开源软件过程中,如果各数据结构(struct)之间引用关系比较简单时,很容易理解,但如果引用关系非常复杂后,将给我们的理解过程带来很大的挑战。 本文将引入一个python脚本,主要用来提取源码中的struct结构定义,建立相应的引用关系,然后通过一些图形化工具(这里采用了graphviz的dot工具),将引用关系图形化,这样对理解源码具有一定的帮助。 首先,看看具体的效
2011-11-16 12:45:10 2086 1
翻译 graphviz安装及使用
Graphviz是大名鼎鼎的贝尔实验室的几位牛人开发的一个画图工具,它提供了“所想即所得”的理念,通过dot语言来编写脚本并绘制图形,简单易懂。graphviz安装: graphviz有多种安装方式,源码及发行包。 当前最新版源码下载:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz
2011-11-16 09:47:45 22873 2
原创 Source Insight宏-格式化源文件
功能:对整个源码文件进行格式化,使得对齐错落有致,功能类似于VC6.0/VS2005/VS2008的Alt+F8功能。 因为设计功底较差,脚本写的较乱!/** 对文件进行排版,按格式对齐 作者:王丰亮 时间:2011-11-10*/macro files_formatting(){ hwnd = GetCurrentWnd() hbuf = GetCurrentBu
2011-11-10 22:59:42 1866 1
原创 Source Insight 宏 - 头文件与源文件切换
当前宏功能:1、.h/.hpp与.c/.cpp/.cx/.cxx/.cc等类型的呼唤,如果有其它对应的关系,也可以加入脚本中;2、同一目录下相同文件名,不同扩展名文件之间的切换。见脚本:/* cpp和hpp文件互换(当前只支持同一目录下的文件互换)*/macro switch_cpp_hpp(){ hwnd = GetCurrentWnd() hC
2011-11-08 19:29:18 3751
原创 Source Insight 宏-多行注释
上篇文章介绍了单行注释(“//”)宏的实现,这里介绍多行注释(“/**/”)宏的实现。 由于/* ... */ 的注释出现的情况较复杂,大家可以根据自己需要进行修改,这里只将第一非空行,且以“/*”开头的文本(忽略空格)视为要取消注释。脚本中: // while(line_index <= lnSelLast) // 对选中的内容进行操作 while(line_in
2011-11-08 19:19:51 3856
原创 Source Insight 宏-单行注释
以前用VS2005或是VS2008写代码,习惯了它的注释功能,使用Source Insight后发现没有提供相应的功能,只能自己写宏来实现,下面就是插入单行注释的宏脚本。 功能:对选中的内容进行单行注释(//) 使用:将下面宏脚本写到Source Insight的utils.em文件(Source Insight\Projects\Base下)或是新建一个*.em文件,并加入到Ba
2011-11-08 17:50:47 2372
原创 设置IP别名Shell脚本
功能:根据当前网络配置,在CentOS虚拟机中设置IP别名1)找出当前机器的网络接口名称,如:eth0,eth1,...;2)找到当前设置的IP,在其基础上增加IP地址;3)设置IP别名;脚本如下:
2011-10-29 10:01:29 740
原创 zlip静态库编译的问题
最近写Zip压缩和解压程序,其中使用的是Zlib库(minizip接口),从官网下载的zlib-1.2.5.tar.gz源码,使用vs2008进行编译的,zlib动态库链接的时候没有问题,可是使用静态库,链接时产生如下错误: error LNK2019: unresolved external symbol _fill_win32_filefunc64A referenced
2011-06-10 18:04:00 2445
转载 工厂方法与抽象工厂
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工
2011-05-19 11:46:00 443
Source Insight宏 - CppUnit单元测试框架自动生成
2012-02-18
Source Insight宏 - 头文件与源文件切换
2012-02-18
libmemcached使用、测试及修改用例
2012-01-18
boost release library
2008-12-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人