代码改变世界

随笔分类 -  C/C++

thttpd源码分析

2011-11-16 17:12 by Aga.J, 1679 阅读, 收藏,
摘要: 最近多了个看源码的嗜好 main函数已经分析好了,找时间分离好代码,待续...thttpd Web Server模块thttpd Web Server#include<stdio.h>#include<sys/socket.h>#include<stdlib.h>#include<arpa/inet.h>#include<string.h>#include<unistd.h>#include<time.h>#include<sys/time.h>#include<errno.h>#inc 阅读全文

Memcached源码拆分:Slabs

2011-11-14 15:03 by Aga.J, 650 阅读, 收藏,
摘要: 个人笔记,不做详细介绍 Memcached的Slab内存分配策略其实很简单,通过首次使用预分配内存空间或者系统启动时预分配内存空间,避免多次malloc和free等函数调用。 除此以外,Slab对于内存碎片的处理策略是通过为每个slab制定固定的chunk大小,相邻(可以理解为逻辑上,也可以理解为物理上,源码里面实现的物理上)slab之间chunk大小为1+factor倍,这样每个slab可以适配适合chunk大小的内存空间请求。 而slab中的chunk的管理则是使用了很多延迟管理策略,它不会经常检查chunk是否超时,直到使用时才检查,它会把回收的chunk放到slot中,而不是free掉 阅读全文

Memcached源码拆分:Libevent_Thread

2011-11-04 17:01 by Aga.J, 1905 阅读, 收藏,
摘要: 个人笔记,不做详细介绍 最近看完Memcached的源码后总是忍不住再看一遍,虽然有些地方写得有点不是那么华丽,但是总感觉想从Memcached里面挖出一些东西来,所以就再看了其他人的关于Memached的源码的一些分析,加上自己对Memcached的理解,目前觉得Memcached的源码里有下面几部分可以好好学学: (1)SLAB内存分配策略 (2)线程模型 (3)Memcached通信协议 (4)Consistent Hashing (5)LRU策略 (6)UNIX domain,UDP,TCP客户端连接 (7)Libevent (8)Memcached的分布式 今天... 阅读全文

求Linux C++高手解答

2011-08-04 19:57 by Aga.J, 656 阅读, 收藏,
摘要: 问题如下,今天整天就耗在和它有关的地方上了……#include<stdio.h> #include<string.h> #include<errno.h> #include<unistd.h> #include<fcntl.h>void main() { char *buf="hello\n"; int len=strlen(buf); close(1); FILE* fd0=freopen("/dev/tty","w",stdout); write(1,buf,len+1) 阅读全文

STL源码剖析之container,stream,functor Adapter

2011-07-02 13:44 by Aga.J, 846 阅读, 收藏,
摘要: 6 container adapter Stack是一个container adapter,它封装了所有的deque对外接口,只开放符合stack原则的几个函数,从stack的定义中我们可以看到,它是使用deque作为底层逻辑结构,封装其接口来暴露自身接口 Template<class T, class Sequence=deque<T> > Class stack { Protected: Sequence c; }; Queue也是同样的道理 Template< class T, class Sequence = deque<T> > Cla 阅读全文

STL源码剖析之Adapter以及functor adapter初体验

2011-07-01 21:52 by Aga.J, 1062 阅读, 收藏,
摘要: 1 adapter在设计模式上的定义如下:将一个class的接口转换为另一个class的接口,使得原本因为接口不兼容而不能合作的classes可以一起运作。2 STL提供多种adapter,其中改变functor(仿函数)的接口的叫做 function adapter。改变 container(容器)接口的叫做container adapter改变 iterator(迭代器)接口的叫做iterator adapter3 container adapter容器queue和stack就是一种container adapter,他们修饰deque的接口形成一种新的容器接口4 iterator ada 阅读全文

STL源码剖析之仿函数简介

2011-06-29 21:33 by Aga.J, 840 阅读, 收藏,
摘要: 1 仿函数也称为函数对象,是一种具有函数特质的对象。调用者可以像函数一样的使用这些对象,例如在很多STL算法中,都可以看到,我们可以将一个方法作为模板内的参数传入到算法实现中,例如sort的时候我们可以根据我们传入的自定义的compare函数来进行比较排序。解决办法是使用函数指针,或者是将这个“操作”设计为一个所谓的仿函数,再用这个仿函数生成一个对象,并用这个对象作为算法的一个参数。 2 那为什么STL不使用函数指针而使用仿函数呢,因为函数指针不能满足STL对抽象性的要求,无法和STL的其他组件搭配以产生更加灵活的效果。 3 怎样实现这样一个仿函数呢?(可以直接使用对象名来使用函数)?答: 阅读全文

STL源码剖析之关联式容器底层的又一实现:Hash

2011-06-29 20:43 by Aga.J, 878 阅读, 收藏,
摘要: 281 hastable二叉搜索树再插入,删除,查找具有对数的平均时间,但是它是基于这样的假设,插入的数据具有一定的随机性,不然的话,如果是有序元素的插入,会使得二叉搜索树严重不平衡。而hashtable这种数据结构,在插入,删除,查找也有常数平均时间,而不依赖于插入元素的随机性,是以统计为基础的。Hash table可以提供对任何named item的存取和删除操作,因为所有被操作的对象都是named,所以hash table可以看做是一个dictionary。如何避免使用一个大得换谬的array呢,办法之一就是使用某种映射函数,将大数映射为小数,这样一来,array就不需要特别的大,但是可 阅读全文

STL源码剖析之关联式容器map

2011-06-28 21:34 by Aga.J, 1075 阅读, 收藏,
摘要: 257 MapMap中所有元素都是以 pair的形式出现,《key,value》, 然后所有元素都会根据key来排序,当然,key不可以有相同的,而value可以有相同的。Template<class T1, class T2> //classT1 for key, ClassT2 for valueStruct pair{Typedef T1 first_type;Typedef T2 second_type;T1 first;T2 second;Pair() : fisrt(T1()), second( T2()) {}Pair( const T1& a , const 阅读全文

STL源码剖析之关联式容器set的底层实现RB-tree

2011-06-12 15:47 by Aga.J, 2597 阅读, 收藏,
摘要: 57RB-tree红黑树:(满足以下条件)1 二叉搜索树2 每个节点不是红色就是黑色3 根节点一定为黑色4 如果节点为红,那么子节点必须为黑(如果节点为黑,子节点可以为黑也可以为红)(新增加的节点既然一定要为红色,那么其父节点一定要为黑色【根据第5条】)5 任意一个节点到树尾端的任何路径,所含的黑节点数必须“相等”(暗示着新增加的节点一定只能是红色,可以通过调换其他节点的颜色来做到满足) 总结起来就是说,在插入删除等操作过程中,必须维护这样的树结构:新插入的节点只能是红色,并且只能挂在黑色节点上,如果不能满足这样的情况,就必须旋转树,重新绘制树节点的颜色。1) 插入节点 这里想要插入3,8,3 阅读全文

STL源码剖析之关联式容器基础知识

2011-06-12 10:11 by Aga.J, 365 阅读, 收藏,
摘要: 54 标准的STL关联式容器有 set (multiset)和 map(multimap),他们底层的机制都是RB-tree即红黑树来实现。还有其他 hash_table, hash_set,hash_map,hash_multiset,hash_multimap(他们的底层都是以hash_table来实现)RB-tree Set (RB_SET) Map (RB_MAP) Multiset (RB_MULTISET) Multimap (RB_MULTIMAP)Hashtable Hash_set Hash_map Hash_multiset Hash_mutimap 关联式容器,概念上类似 阅读全文

STL源码剖析之序列式容器Heap及Priority Queue

2011-06-11 09:55 by Aga.J, 716 阅读, 收藏,
摘要: 50 heap Heap的背景是建立在优先队列的基础上,priority queue允许我们任意的插入一个元素,但是会自动将元素进行排序,使得取出时一定是从优先级最高的元素开始取。我们可以考虑使用list这种数据结构完成priority queue,也就是说,我们可以轻松的完成插入(因为list其实是线性链表),但是我们要取得list中的极值时,则需要对整个list进行遍历。或者我们可以这样考虑,将元素插到list的合适位置,这样一来,虽然很容易取得极值,但是我们的搜索插入也是需要线性搜索。 很自然的想到二分法来减少复杂度,也就是使用二叉搜索树,这样插入和求极值都值需要O(logN)的复杂度, 阅读全文

STL源码剖析之Deque的Adapter

2011-06-11 09:16 by Aga.J, 422 阅读, 收藏,
摘要: 46Stack不允许遍历,只有一个出口,只允许对最顶端的元素进行操作。SGI STL默认以deque作为stack的底层结构。为什么要使用deque作为stack的底层结构呢?因为deque可以很容易的封住其中某个方向的接口,而且deque便于扩容,底层结合了list和vector,比起单一的使用list或者vector来实现stack更加方便高效。由于stack是依赖底层容器完成其功能的,所以这种“修改某个物件的接口,形成另一种新的接口”的,叫做adapter。Template<class T, class Sequence=deque<T> > Class stac 阅读全文

STL源码剖析之序列式容器Deque

2011-06-09 19:10 by Aga.J, 1851 阅读, 收藏,
摘要: 37 deque Vector是单向开口的连续线性空间,用户只能在vector尾部进行插入删除操作。(当然它也允许在某个pos处插入元素,但是要注意到Vector的底层实现是数组,所以过多或者频繁的在非队尾的位置插入会有性能上的消耗) 而deque是一种双向开口的连续线性空间,允许我们在头尾两端操作。所以我们需要保证deque可以在常数时间内对头和尾元素进行插入或者删除。 Deque还有一个明显的与Vector不同的特点,就是它没有capacity的概念,它是动态地用分段连续的空间组合起来的,随时可以增加一段新的空间并连接起来,而为了隐藏deque的这些底层细节(分段连续的空间组成---需要一 阅读全文

STL源码剖析之序列式容器list

2011-06-07 13:48 by Aga.J, 924 阅读, 收藏,
摘要: 33 ListList是一个紧凑型的容器,每次插入或者删除一个元素,就需要配置或者释放一个元素空间,并且,对于任何位置的元素插入或元素移除,list都是【常数】时间List的节点和List本身是不同的结构(这和vector一致)Template<class T>Struct __list_node{Typedef void* void_pointer; // typedef __list_node<T>* pointer;Void_pointer prev;Void_pointer next;T data;} 可以看出stl的list是基于链表的。因为list不是一种基 阅读全文

STL源码剖析之序列式容器vector

2011-06-07 10:00 by Aga.J, 1787 阅读, 收藏,
摘要: 常见的数据结构:array,list,tree,stack,queue,hash table,set,map 可以将上面的数据结构按照数据组织形式分为 sequence 和 associative两种类型。28 序列式容器,其中的元素都是“可序”的,C++语言提供了array,而STL提供了vector,list,deque( stack,queue ),priority-queue,而其中 stack和queue是在deque基础上改进,所以实际上是一种adapter。29 vector Vector的数据安排和操作方式 和 常见的array类型很像,但是唯一的不同就在于vector的空间. 阅读全文

STL源码剖析之traits技巧(下)

2011-06-05 10:45 by Aga.J, 1246 阅读, 收藏,
摘要: 21 Traits方法:可以用来萃取迭代器的特性(接着上一篇文章说到原生指针与traits技巧的使用,这里拓展了一点其他类型的使用方法,和上一篇文章介绍的方法一样。)Template<class I>Struct iterator_traits //输入带有value_type的指针{Typedef typename I::value_type value_type;}Template<class I>Typename Iterator_traits<I>::value_typeFunc(I ite){Return *ite;}Template<cla 阅读全文

STL源码剖析之迭代器的概念和traits编程的技法(上)

2011-06-05 10:06 by Aga.J, 1042 阅读, 收藏,
摘要: 15 Iterator是一种抽象的设计概念: design pattern中有一种iterator的模式: 提供一种外部方法,使之可以依序访问聚合器所含的各个元素,而又无需暴露该聚合物的内部表述方式(也就是说做到和聚合物的类型无关); STL的中心思想: 将数据容器和算法分开,彼此独立设计,最后使用粘合剂将他们粘合起来。要做到 容器的泛型化 我们可以借助class template,要做到 算法的泛型化,我们可以借助 function template。而他们之间的交合,就需要细致考虑。 下面是三者之间完美结合的例子Template<class InputIterator, class 阅读全文

STL源码剖析之配置器(下)

2011-06-04 13:34 by Aga.J, 403 阅读, 收藏,
摘要: 11 因为考虑到内存碎片的情况,所以SGI采用【双层级配置器】,第一级配置器直接使用malloc和free。而第二级则: 当 申请区超过128 byte 时,调用一级配置器。当小于128时,采用复杂的memory pool(内存池),下面介绍SGI的方法(有其自己的空间分配等)#ifdef __USE_MALLOC…Typedef __malloc_alloc_template<0> malloc_alloc;Typedef malloc_alloc alloc; // 令alloc为第一级配置器#elseTypedef __default_alloc_template<__ 阅读全文

STL源码剖析之STL简介与STL配置器

2011-06-04 10:56 by Aga.J, 430 阅读, 收藏,
摘要: 1 从底层来看,STL带给我们一套具有实用价值的零部件,以及一个整合起来的整体,STL中组件之间耦合度很低,组件之间可以互相关联整合。2 STL以泛型思维,描述了很多抽象概念,以抽象概念为主体而不是依赖于实际的类3 STL六大组件: 容器 : 数据结构(容纳数据)是一种class template 算法 : 常用的算法,是一种function template 迭代器:容器和算法之间的胶合剂,也是一种泛型组件,“泛型指针”,每个容器都有自己的迭代器,只有容器自己才知道如何使用自己的迭代器来完成迭代。 仿函数:类静态函数 适配器:修饰容器或者仿函数或者迭代器接口的东西,也就是改变了被适配的东西, 阅读全文