<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[luotuo44的专栏]]></title><description><![CDATA[千里之行始于足下]]></description><link>https://blog.youkuaiyun.com/luotuo44</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; luotuo44]]></copyright><item><title><![CDATA[C++11多线程]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/69666628</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/69666628</guid><author>luotuo44</author><pubDate>Sat, 08 Apr 2017 12:52:56 +0800</pubDate><description><![CDATA[线程例子程序需要从main函数开始，同样线程也是从某个函数开始的(这个函数下文称为线程函数)。和pthread_create一样，C++11提供的线程类std::thread,在创建类变量的时候就产生一个线程，因此需要在std::thread的构造函数中传入线程函数作为参数。得益于C++11支持可变参数模板和完美转发，如果线程函数拥有参数，那么可以十分自然地通过std::thread的构造函数传递。]]></description><category></category></item><item><title><![CDATA[用AVCodecParameters代替AVCodecContext]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/54981809</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/54981809</guid><author>luotuo44</author><pubDate>Thu, 16 Feb 2017 00:12:19 +0800</pubDate><description><![CDATA[AVCodecParameters使用在高版本的ffmpeg库中使用AVStream::codec成员时，编译和运行时都出现一堆警告：]]></description><category></category></item><item><title><![CDATA[C++11时间详解]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/46854229</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/46854229</guid><author>luotuo44</author><pubDate>Tue, 14 Jul 2015 00:08:50 +0800</pubDate><description><![CDATA[转载请注明出处：

       C++ 11增加了三个与时间相关的类型：时间段、时钟、时间点。

以史为鉴

       现有的系统API中，时间太过于碎片化了。有time_t(秒)、struct timeval(微秒)、struct timespec(纳秒)这几个时间单位，他们的接口非常不统一，点击这里可以体会一下。主要原因：是由于新业务的需求，要求提供不同精度的时间。于是每次出现新需求就定]]></description><category></category></item><item><title><![CDATA[C++ 11 右值引用以及std::move]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/46779063</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/46779063</guid><author>luotuo44</author><pubDate>Tue, 07 Jul 2015 00:05:38 +0800</pubDate><description><![CDATA[新类型：

         int和int&是什么？都是类型。int是整数类型，int&则是整数引用类型。同样int&&也是一个类型。两个引号&&是C++ 11提出的一个新的引用类型。记住，这是一个新的类型。默念10次吧。如果你记住这个新类型，那么很多疑问都能迎刃而解。并且对《Effective Modern C++》说到的void
 f(Widget&& w)，就很容易明白w是新类型的一]]></description><category></category></item><item><title><![CDATA[DNS查询流程简介]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/45545059</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/45545059</guid><author>luotuo44</author><pubDate>Thu, 07 May 2015 00:32:36 +0800</pubDate><description><![CDATA[转载请注明出处：




        DNS(domain name system)，读者们或多或少都听过，就是可以将域名转换给IP的一个系统。使得我们只需记住域名而非IP就能访问某个网站。当我们在浏览器里面输入一个网址时，浏览器会向本地DNS服务器发出查询请求，本地DNS服务器会把网址对应的IP返回给浏览器。注意：更确切来说，不是本地DNS服务器，而是Windows网络连接里面所配]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----set命令处理流程]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/44236591</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/44236591</guid><author>luotuo44</author><pubDate>Fri, 13 Mar 2015 09:28:44 +0800</pubDate><description><![CDATA[转载请注明出处：





        
前一篇博文以get命令为例子把整个处理流程简单讲述了一遍，本篇博文将以set命令详细讲述memcached的处理流程。具体的命令为“set tt 3 0 10”，并假设当然memcached服务器没有名为tt的item。



读取命令：

        在前一篇博文的最后，conn的状态被设置为conn_new_cmd，回]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----get命令处理流程]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/44217383</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/44217383</guid><author>luotuo44</author><pubDate>Thu, 12 Mar 2015 09:44:10 +0800</pubDate><description><![CDATA[转载请注明出处：





        本文以get命令为例子，探讨memcached是如何处理命令的。本文只是探讨memcached处理命令的工作流程，具体的代码细节在不影响阅读的前提下能省略的就省略、能取默认值就取默认值、内存是足够的(不需要动态申请空间就够用了)。涉及到数组、缓存区的就假设已经分配好了。



        现在假定memcached里面有了一个键值]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----slab automove和slab rebalance]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/43015129</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/43015129</guid><author>luotuo44</author><pubDate>Thu, 22 Jan 2015 09:56:35 +0800</pubDate><description><![CDATA[转载请注明出处：





需求：



        考虑这样的一个情景：在一开始，由于业务原因向memcached存储大量长度为1KB的数据，也就是说memcached服务器进程里面有很多大小为1KB的item。现在由于业务调整需要存储大量10KB的数据，并且很少使用1KB的那些数据了。由于数据越来越多，内存开始吃紧。大小为10KB的那些item频繁访问，并且由于内存不够]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----item过期失效处理以及LRU爬虫]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42963793</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42963793</guid><author>luotuo44</author><pubDate>Wed, 21 Jan 2015 09:46:41 +0800</pubDate><description><![CDATA[转载请注明出处：






        温馨提示：本文用到了一些可以在启动memcached设置的全局变量。关于这些全局变量的含义可以参考《memcached启动参数详解》。对于这些全局变量，处理方式就像《如何阅读memcached源代码》所说的那样直接取其默认值。



过期失效处理：
        一个item在两种情况下会过期失效：1.item的exptime]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----item锁级别与item引用计数]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42913549</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42913549</guid><author>luotuo44</author><pubDate>Tue, 20 Jan 2015 09:52:41 +0800</pubDate><description><![CDATA[转载请注明出处：





锁级别：

        从前面的《扩展哈希表》知道：哈希表进行扩展时，有一个专门的线程负责将item数据从旧哈希表迁移到新哈希表(由此，也称这个线程为迁移线程)。此外，还有一些worker线程会时不时访问item(包括插入、删除和获取)。这些线程的对item所做的操作基本上都是互斥的，必须加锁控制。
        如果只使用一个锁，抢到该锁才能使]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----LRU队列与item结构体]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42869325</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42869325</guid><author>luotuo44</author><pubDate>Mon, 19 Jan 2015 09:46:49 +0800</pubDate><description><![CDATA[转载请注明出处：





LRU队列：

        之前的《slab内存分配》博文已经说到一个slab class里面的所有slab分配器都只分配相同大小的item，不同的slab class分配不同大小的item。item结构体里面有一个slabs_clsid成员，用来指明自己是属于哪个slab class的。这里把slabs_clsid值相同的item称为是同一类ite]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----哈希表基本操作以及扩容过程]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42773231</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42773231</guid><author>luotuo44</author><pubDate>Fri, 16 Jan 2015 10:14:25 +0800</pubDate><description><![CDATA[转载请注明出处：


        温馨提示：本文用到了一些可以在启动memcached设置的全局变量。关于这些全局变量的含义可以参考《memcached启动参数详解》。对于这些全局变量，处理方式就像《如何阅读memcached源代码》所说的那样直接取其默认值。



        assoc.c文件里面的代码是构造一个哈希表。memcached快的一个原因是使用了哈希表。现在就]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----slab内存分配器]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42737181</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42737181</guid><author>luotuo44</author><pubDate>Thu, 15 Jan 2015 10:16:57 +0800</pubDate><description><![CDATA[转载请注明出处：




        温馨提示：本文用到了一些可以在启动memcached设置的全局变量。关于这些全局变量的含义可以参考《memcached启动参数详解》。对于这些全局变量，处理方式就像《如何阅读memcached源代码》所说的那样直接取其默认值。

slab内存池分配器：


slab简介：

        memcached使用了一个叫slab的内]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----网络模型]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42705475</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42705475</guid><author>luotuo44</author><pubDate>Wed, 14 Jan 2015 09:59:20 +0800</pubDate><description><![CDATA[转载请注明出处：



半同步/半异步：

        memcached使用半同步/半异步网络模型处理客户端的连接和通信。
        半同步/半异步模型的基础设施：主线程创建多个子线程(这些子线程也称为worker线程)，每一个线程都维持自己的事件循环，即每个线程都有自己的epoll，并且都会调用epoll_wait函数进入事件监听状态。每一个worker线程(子线程)和]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----memcached启动参数详解以及关键配置的默认值]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42672913</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42672913</guid><author>luotuo44</author><pubDate>Tue, 13 Jan 2015 10:37:00 +0800</pubDate><description><![CDATA[本文将给出memcached启动时各个参数的详细解释以及一些关键配置的默认值。以便在分析memcached源码的时候好随时查看。当然也方便使用memcached时可以随时查看各个参数的含义。《如何阅读memcached源码》说到memcached有很多全局变量(也就是关键配置)，这些全局变量会给]]></description><category></category></item><item><title><![CDATA[memcached源码分析-----安装、调试以及如何阅读memcached源码]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/42639131</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/42639131</guid><author>luotuo44</author><pubDate>Mon, 12 Jan 2015 10:39:42 +0800</pubDate><description><![CDATA[转载请注明出处：



安装：

        安装memcached之前要先安装Libevent。现在假定Libevent安装在/usr/local/libevent目录了。
        因为memcached安装后不像Libevent那样，有一堆头文件和库文件。安装后的memcached不是用来编程而直接用来运行的。所以不需要在/usr/local目录下专门为memcach]]></description><category></category></item><item><title><![CDATA[有限域GF(2^8)的四则运算及拉格朗日插值]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/41645597</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/41645597</guid><author>luotuo44</author><pubDate>Mon, 01 Dec 2014 12:26:01 +0800</pubDate><description><![CDATA[域的性质：

        群和域在数学上的概念就不解释，可以参考维基百科。当然也可以参考《密码编码学与网络安全》这书的有限域一章。形象地说，域有这样一个性质：在加法和乘法上具有封闭性。也就是说对域中的元素进行加法或乘法运算后的结果仍然是域中的元素。有一点要注意，域里面的乘法和加法不一定是我们平常使用的乘法和加法。可以把C语言中的与运算和异或运算分别定义成加法和乘法。但习惯上，仍然使用符号+]]></description><category></category></item><item><title><![CDATA[Libevent使用例子，从简单到复杂]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/39670221</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/39670221</guid><author>luotuo44</author><pubDate>Mon, 29 Sep 2014 15:17:55 +0800</pubDate><description><![CDATA[本文从简单到复杂，展示Libevent的使用]]></description><category></category></item><item><title><![CDATA[libevent编程疑难解答]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/39547391</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/39547391</guid><author>luotuo44</author><pubDate>Thu, 25 Sep 2014 10:46:53 +0800</pubDate><description><![CDATA[前段时间阅读了libevent的源码。读完后，之前在使用libevent时的一些疑问都已经豁然开朗了。对于libevent源码的分析，可以到http://blog.youkuaiyun.com/luotuo44/article/category/2435521查看。
本文通过自问自答的形式，希望能帮助其他人解答在使用libevent时的一些疑惑。]]></description><category></category></item><item><title><![CDATA[Qt跨线程发送信号与元数据]]></title><link>https://blog.youkuaiyun.com/luotuo44/article/details/39395025</link><guid>https://blog.youkuaiyun.com/luotuo44/article/details/39395025</guid><author>luotuo44</author><pubDate>Fri, 19 Sep 2014 10:46:48 +0800</pubDate><description><![CDATA[Qt的signals/slots是可以用在线程间的。由于事件循环(event loop)是在主线程完成的，所以在非主线程发送一个信号时，对应的槽函数将会由主线程执行。


熟悉多线程的读者应该都感受到这里会有一个微妙的问题。如果signals/slots的函数参数是一个自己定义的类型。比如自己定义了一个Student类，信号函数为sendStudent(const Student &stu)]]></description><category></category></item></channel></rss>