一、Linux多线程编程的高效开发技术
参考博文:http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/
几种环境:
1、递归锁
2、条件变量的自动复位
3、pthread_cond_wait执行前加锁,执行时会解锁,成功后会加锁,执行之后解锁
4、pthread_join阻塞当前线程,知道指定线程结束
二、trie树
参考博文:http://blog.csdn.net/hguisu/article/details/8131559
trie的优势:
如果给1w单词,找出一个单词是否在这1w之中
利用hash和trie都可以轻松做到
但是如果问一个前缀是否在这1w单词中出现
显然利用字符树会更好
三、红黑树
参考博文:http://blog.csdn.net/ts173383201/article/details/7866387
红黑树的实际处理:
在实际处理过程中,往往将最底层的孩子结点和根结点的父亲都指向同一个 NIL 结点,以便于处理红黑树代码中的边界条件
5条性质:
性质1. 结点是红色或黑色。
性质2. 根是黑色。
性质3 每个叶结点是黑色的。
性质4 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
性质5. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。
需要旋转的3种情况:
Case1 : z的叔叔y是红色的
Case2:z的叔叔y是黑色,而且z是右孩子
Case3:z的叔叔y是黑色,而且z是左孩子
四、考量hash的两个指标:单调性和平衡性
参考博文:http://blog.csdn.net/sparkliang/article/details/5279393
考量hash的一个指标:单调性:
单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。
一致性hash:
将hash表想象成环形
将对象和cache都映射到hash中
对象沿着环形hash的顺时针进行移动,遇到一个cache就将对象存储到cache中
考量hash的另一个指标:平衡性:
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。
虚拟节点:
“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一实际个节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。
cache A1, cache A2 代表了 cache A ; cache C1, cache C2 代表了 cache C
objec1->cache A2 ; objec2->cache A1 ; objec3->cache C1 ; objec4->cache C2 ;
五、可执行程序的内存分布
参考博文:http://blog.csdn.net/hmsuccess/article/details/2808109
首先是堆栈区(stack),堆栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈的申请是由系统自动分配,如在函数内部申请一个局部变量 int h,同时判别所申请空间是否小于栈的剩余空间,如若小于的话,在堆栈中为其开辟空间,为程序提供内存,否则将报异常提示栈溢出。
其次是堆(heap),堆一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。堆的申请是由程序员自己来操作的,在C中使用malloc函数,而C++中使用new运算符,但是堆的申请过程比较复杂:当系统收到程序的申请时,会遍历记录空闲内存地址的链表,以求寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,此处应该注意的是有些情况下,新申请的内存块的首地址记录本次分配的内存块大小,这样在delete尤其是delete[]时就能正确的释放内存空间。
接着是全局数据区(静态区) (static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 另外文字常量区,常量字符串就是放在这里,程序结束后有系统释放。
最后是程序代码区,放着函数体的二进制代码。
六、远堆与近堆
参考博文:http://hi.baidu.com/yangyangye2008/item/673bfa5bec973c16db163539
对于16位的cpu
若申请空间大于64K,那么将让段地址偏移,则会改变原来的堆地址,称为远堆
如果小于64K,只需要在偏移地址中分配,则为近堆
现在cpu32位
基本不分近堆远堆
七、13年华为面试笔试题
参考博文:http://blog.csdn.net/ts173383201/article/details/7920048
个人评价:题目简单基础,不过网络方面的题目涉及比较广,不怎么会