<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[巴山独钓]]></title><description><![CDATA[不积跬步，无以至千里；不积小流，无以成江海]]></description><link>https://blog.youkuaiyun.com/tankles</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tankles]]></copyright><item><title><![CDATA[执行ldconfig后遇到的问题]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/9173729</link><guid>https://blog.youkuaiyun.com/tankles/article/details/9173729</guid><author>tankles</author><pubDate>Tue, 25 Jun 2013 21:37:32 +0800</pubDate><description><![CDATA[今天装了一个lib（./configure, make, make install），编译程序时，提示链接错误，找不到对应的.so文件，然后就在/etc/ld.so.conf.d下面增加了一个文件，内容为: /usr/local/lib，因为刚刚在自己的虚拟机上做过此过程，想都没想就执行了ldconfig，话说这些操作在开发过程中都很正常。
　　但是奇葩的事出现了，之后执行任何shell命令（确]]></description><category></category></item><item><title><![CDATA[关于锁的自动释放]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7922378</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7922378</guid><author>tankles</author><pubDate>Wed, 29 Aug 2012 23:50:08 +0800</pubDate><description><![CDATA[这种方案一直在用，但是一直没能领会到它的意图，也是在一个面试过程中，被问到一个此类问题，从而才想到的。

    问题：当在一个函数中使用锁时，如果加锁后由于某种原因（疏忽，异常等），没有释放锁就直接退出了，那么将导致锁的状态错误，怎样解决这个问题？


1、没有正常释放锁：

就像下面的程序一样（这里仅作为示例，选用mutex）：

#include 
#include]]></description><category></category></item><item><title><![CDATA[SSH远程会话管理工具]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7886055</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7886055</guid><author>tankles</author><pubDate>Mon, 20 Aug 2012 13:02:36 +0800</pubDate><description><![CDATA[SSH远程会话管理工具


VPS侦探在刚接触Linux时最怕的就是SSH远程登录Linux VPS编译安装程序时（比如安装lnmp）网络突然断开，或者其他情况导致不得不与远程SSH服务器链接断开，远程执行的命令也被迫停止，只能重新连接，重新运行。相信现在有些VPSer也遇到过这个问题，今天就给VPSer们介绍一款远程会话管理工具 - screen命令。

一、screen命令是什么？]]></description><category></category></item><item><title><![CDATA[Hadoop学习笔记]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7740041</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7740041</guid><author>tankles</author><pubDate>Thu, 12 Jul 2012 13:47:55 +0800</pubDate><description><![CDATA[前段时间，学习了一下Hadoop MapReduce，这里进行简单的总结，主要来自于《Hadoop In Action》。
        后续将按照Hadoop处理的顺序整理一些笔记，主要包括：
                      （1）Hadoop预定义数据类型；
                      （2）Hadoop InputFormat；]]></description><category></category></item><item><title><![CDATA[平滑升级Nginx的Shell脚本]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7699613</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7699613</guid><author>tankles</author><pubDate>Thu, 28 Jun 2012 15:36:09 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-TableCache]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663929</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663929</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 17:37:44 +0800</pubDate><description><![CDATA[Table相当于.sst文件在内存中的映像，它保存了.sst文件的Index Block数据。
       TableCache相当于所有打开的.sst文件在内存中的管理结构，内部采用LRUCache，每个打开的.sst文件在LRUCache中都有一项：map {file, table}>
    
	
   static void DeleteEntry(const Slice& key]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-SSTable：.sst文件构建与读取]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663918</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663918</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 17:35:47 +0800</pubDate><description><![CDATA[.sst文件的构建是通过TableBuilder进行的，读取主要集中在TableBuilder操作(table_builder.cc)如下：

    struct TableBuilder::Rep {					   // TableBuilder内部使用的结构，记录当前的一些状态等
        Options options;
        Options index_block_o]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-SSTable：Block]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663908</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663908</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 17:32:55 +0800</pubDate><description><![CDATA[levelDB中涉及Block操作的接口机函数基本如下：

   class Block;     											// Block数据结构定义,主要通过Block::Iter操作
    class Block::Iter : public Iterator ;				// Block中每个entry的迭代器，内部使用DecodeEntry解析每个entry
	
    static]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-SSTable]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663905</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663905</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 17:30:40 +0800</pubDate><description><![CDATA[SSTable是Bigtable中至关重要的一块，对于LevelDB来说也是如此，对LevelDB的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。

    本节内容主要讲述SSTable的静态布局结构，SSTable文件形成了不同Level的层级结构，至于这个层级结构是如何形成的我们放在后面Compaction一节细说。本节主要介绍SSTable某个文件的物理布局和]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-Log文件]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663873</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663873</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 17:22:40 +0800</pubDate><description><![CDATA[levelDB中log文件在LevelDb中的主要作用是系统故障恢复时，能够保证不会丢失数据。因为在将记录写入内存的Memtable之前，会先写入Log文件，这样即使系统发生故障，Memtable中的数据没有来得及Dump到磁盘的SSTable文件，LevelDB也可以根据log文件恢复内存的Memtable数据结构内容，不会造成系统丢失数据，在这点上LevelDb和Bigtable是一致的。]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-Memtable]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663635</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663635</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 16:36:42 +0800</pubDate><description><![CDATA[本节讲述内存中LevelDB的数据结构Memtable，Memtable在整个体系中的重要地位也不言而喻。总体而言，所有KV数据都是存储在Memtable，Immutable Memtable和SSTable中的，Immutable Memtable从结构上讲和Memtable是完全一样的，区别仅仅在于其是只读的，不允许写入操作，而Memtable则是允许写入和读取的。当Memtable写入的数据]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-Cache（LRUCache、HashTable）]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663608</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663608</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 16:31:59 +0800</pubDate><description><![CDATA[leveldb内部通过双向链表实现了一个LRUCache，利用双向链表实现LRUCache的算法在《操作系统》中描述的很清楚，这里和标准的LRUCache一样，这里不再描述。
        LRUCache内部实现了一个Hashtable，用于快速查找key对应的双向链表节点。


        Class Cache采用虚函数定义了Cache的接口，具体实现的LRUCache继承Ca]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-Skiplist]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663540</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663540</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 16:19:15 +0800</pubDate><description><![CDATA[这里主要介绍levelDB中关于SkipList的实现，关于SkipList介绍请求参阅《SkipList》，这里不再引用了。


        在levelDB中的使用：
        levelDB中Memtable有一个核心的数据结构Skiplist，具体实现的代码稍有不同，但是基本原理是一致的。
        levelDB中Skiplist定义为模板类：]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-Arena]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663471</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663471</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 16:08:29 +0800</pubDate><description><![CDATA[Arena在leveldb中它是一个内存池，它所作的工作十分简单，申请内存时，将申请到的内存块放入std::vector blocks_中，在Arena的生命周期结束后，统一释放掉所有申请到的内存，内部结构如下图所示。








       Arena定义为：
    class Arena {
        public:
        Arena();]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-Status]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663372</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663372</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 15:54:08 +0800</pubDate><description><![CDATA[leveldb::Status表示levelDB的一个返回状态，通常的错误处理（如:errno）是返回一个错误号，然后根据错误号可以获得出错的描述信息。
        leveldb将错误号和错误信息封装成Status类，来统一进行处理。 


        声明如下：

    class Status {
        public:
        // Create a]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-Slice]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663311</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663311</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 15:44:16 +0800</pubDate><description><![CDATA[levelDB中Slice非常简单的数据结构，它包括length和一个指向外部字节数组的指针。为什么使用Slice，而不直接使用std::string呢？
        1、相比返回string，返回Slice的开销会小的多（没有拷贝，Slice中没有实际数据，只有指向数据的指针，开销低）。 

        2、leveldb允许key和value包含'\0'，不能返回以null结尾的]]></description><category></category></item><item><title><![CDATA[levelDB源码分析-提纲]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7663125</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7663125</guid><author>tankles</author><pubDate>Thu, 14 Jun 2012 15:26:39 +0800</pubDate><description><![CDATA[好久没有动静了，工作、加班、独自学习源码、整理资料 ...



        接下来将发表一系列levelDB源码学习过程中记录下的东西，现已部分整理完毕，其中很多描述直接参照网上已经发布的关于levelDB实现原理及源码分析等相关资料，随后附上链接，并结合自己研读，附上代码注释，主要包括：
                《levelDB源码分析-Slice》]]></description><category></category></item><item><title><![CDATA[Source Insight宏 - CppUnit单元测试框架自动生成]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7269882</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7269882</guid><author>tankles</author><pubDate>Sat, 18 Feb 2012 12:20:55 +0800</pubDate><description><![CDATA[一个好的开发工具能够极大的提高工作效率，而好的开发工具是智慧与努力的结晶。
这里包括2个宏：CppUnitTest_CreateSuite和CppUnitTest_CreateMain
CppUnitTest_CreateMain用来产生单元测试主框架，产生的文件为alltest.cpp，如下：

#include 
#include 

int main(int argc, char**]]></description><category></category></item><item><title><![CDATA[Source Insight宏 -  头文件与源文件切换（不限目录）]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7269823</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7269823</guid><author>tankles</author><pubDate>Sat, 18 Feb 2012 11:40:23 +0800</pubDate><description><![CDATA[前面发布的帖子：Source Insight 宏 - 头文件与源文件切换用到的切换宏有一定的限制（要求在同一目录下），如源码结构为src、include、test时，include下头文件与src下源文件之间就不能实现切换，在使用过程中不免会产生一点影响，今天将其进行了修改，经测试可以达到不同目录下的文件切换，对目录再没有要求，但是同时如果源码中存在多个相同文件名（不同目录下）时，需要用户自己选择]]></description><category></category></item><item><title><![CDATA[libmemcached1.0.2 C/C++ API使用实例、测试及修改]]></title><link>https://blog.youkuaiyun.com/tankles/article/details/7208988</link><guid>https://blog.youkuaiyun.com/tankles/article/details/7208988</guid><author>tankles</author><pubDate>Wed, 18 Jan 2012 13:42:31 +0800</pubDate><description><![CDATA[memcached是一个分布式的缓存系统，且其分布式是一种“轻量级”的分布式，完全依赖客户端库来实现，libmemcached就是一个开源的C/C++库。

        使用libmemcached的C/C++ API客户端库资料及官方资料都很少，且网络上存在的C/C++ libmemcached实例都是采用的MOD的分布式算法，其缺点显而易见，当存在失效的memcached server]]></description><category></category></item></channel></rss>