内存池
摘要:1.内存池是用来干什么的可以避免频繁的小块内存分配导致内存碎片在用户层和操作系统层之间的一层,使得内存分配更稳定分配速度更快2.总体设计二个层次,chunk管理层和slot分配器层,分别作为与操作系统接口和用户分配接口chunk管理?chunk数据结构设计。每个chunk大小为1KB。通过链表链接起来。有个全局head指针指向第一个chunk,以便到最后释放内存Chunk块的插入使用头插法每个chunk中还需要保存的信息必须有:当前chunk中的可用空间首地址/指向下一chunk指针slot管理?slot数据结构设计第一级slot大小是上一级slot大小的两倍。从4字节开始,一共8级4B,8B
阅读全文
beansdb-0.5.3源代码分析
摘要:htree是一个hash树的实现。注意其中存的内容Item是uint32_t pos; 低8位表示bucket 高24位表示在文件中的位置 文件大小限制为2Gint32_t ver; 版本号char name[1]; key用这个域存储hash树的作用第一是快速的key到pos的定位。这一点跟普通hash一样.有了pos就相当于有了路径和offset,可以找到数据块了.这个过程是一层一层进行的,每次根据key值,Node的层,定位到下一层的孩子第二,冲突解决。用分裂这种方式来处理冲突的,节点满了就分裂到下一层。Item全部在叶子结点。beansdb中是一个16叉树,每个Node有个Data指针
阅读全文
浮点计算的误差集累
摘要:同一个函数,即使用递归和非递归两种形式实现,其计算结果都可能不相同。比如计算 1+e^2+e^3+...+e^ndouble f(int n){ if(n == 0) return exp(0); else return exp(n) + f(n-1);}//对比下面---------------------------------------------sum = 0;for(int i=0; i<n; i++){ sum += exp(i);} 有什么区别呢?计算顺序不同。上面的是递归到函数栈的底部,回去的时候计算的。也就是说它的计算顺序是:f(n) = exp(n) + f(n-1
阅读全文
红黑树总结
摘要:5个条件1.结点要么是红色要么是黑色2.根是黑色3.叶子是黑色(空指针的也算作叶子)4.红色结点的两个孩子都为黑5.从根到叶子的每条路径出现的黑色结点数量相同插入5种情况总结:1.根为空2.pb不必调整3.prur改色继续向上调整4.prub<旋转,跳到第5步5.prub\改色 旋转
阅读全文
反思实习招骋
摘要:简历方面策略方面什么是没用的精通C,到街头找个要饭的也精通国内的招骋,geek确实没什么价值,听话的民工就够用了...项目经验即有意义也没意义。有意义是指面试者会根据项目经验决定你是否适合职位方向。没意义的地方是指:面试过程是由面试官主导的,所以并不一定给机会展现自己做过什么。如果跟职业方向不一致,或者跟面试官的方向不一致,它就是完全没意义的。如果项目经验写太多,而涉及到的领域太分散,面试官反而不能从中看出面试者适合做什么,有什么优势。什么是有用的1.忽悠面试时间太有限,即使谈到项目也跟本不会太具体的展开。争对这一点,有忽悠机会,不要怕,大胆写。因为只要不展开太具体面试官就无法抓住漏洞,如果表
阅读全文
elisp的动态作用域的实现
摘要:主要文件在lisp.h和eval.csymbol对象包含4个域:name符号名value值function函数plist属性链隐含一个next域指针,指向下一个symbol有个全局的obarray,其实就是个vector类型的lisp对象。符号名通过hash确定在obarray中的哪一个桶,然后根据next域出去找到最终的symbol对象-----------------------------------------------struct specbinding { Lisp_Object symbol, old_value; specbinding_func func; ...
阅读全文