一個、Linux多線程編程技術高效開發node
參考博文:http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/linux
幾個環境:面試
一、遞歸鎖
二、本身主動復位條件變量
三、pthread_cond_wait運行前加鎖,運行時會解鎖。成功後會加鎖。運行以後解鎖
四、pthread_join堵塞當前線程,知道指定線程結束
編程
2、trie樹網絡
參考博文:http://blog.csdn.net/hguisu/article/details/8131559數據結構
trie的優點:多線程
假設給1w單詞,找出一個單詞是否在這1w之中函數
利用hash和trie都可以輕鬆作到ui
但是假設問一個前綴是否在這1w單詞中出現spa
顯然利用字符樹會更好
3、紅黑樹
參考博文: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是左孩子
4、考量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 ;
5、可運行程序的內存分佈
參考博文:http://blog.csdn.net/hmsuccess/article/details/2808109
首先是堆棧區(stack),堆棧是由編譯器本身主動分配釋放 。存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。
棧的申請是由系統本身主動分配,如在函數內部申請一個局部變量 int h,同一時候判別所申請空間是否小於棧的剩餘空間。如若小於的話,在堆棧中爲其開闢空間,爲程序提供內存。不然將報異常提示棧溢出。
其次是堆(heap),堆通常由程序猿分配釋放, 若程序猿不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表。堆的申請是由程序猿本身來操做的,在C中使用malloc函數,而C++中使用new運算符,但是堆的申請過程比較複雜:當系統收到程序的申請時。會遍歷記錄空暇內存地址的鏈表。以求尋找第一個空間大於所申請空間的堆結點,而後將該結點從空暇結點鏈表中刪除,並將該結點的空間分配給程序,此處應該注意的是有些狀況下。新申請的內存塊的首地址記錄本次分配的內存塊大小,這樣在delete尤爲是delete[]時就能正確的釋放內存空間。
接着是全局數據區(靜態區) (static),全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的還有一塊區域。
另外文字常量區。常量字符串就是放在這裏,程序結束後有系統釋放。
最後是程序代碼區。放着函數體的二進制代碼。
6、遠堆與近堆
參考博文:http://hi.baidu.com/yangyangye2008/item/673bfa5bec973c16db163539
對於16位的cpu
若申請空間大於64K,那麼將讓段地址偏移,則會改變原來的堆地址,稱爲遠堆
假設小於64K,僅僅需要在偏移地址中分配,則爲近堆
現在cpu32位
基本不分近堆遠堆
7、13年華爲面試筆試題
參考博文:http://blog.csdn.net/ts173383201/article/details/7920048
我的評價:標題簡單的基礎。只有網絡覆蓋普遍議題,不太可能