linux之鏈表和哈希表應用淺析一

1. Linked Lists

 

Linux使用一種軟件工程技術將它的數據結構連接在一起。多數情況下它使用鏈表數據結構。如果每一個數據結構描述一個物體或者發生的事件的單一的實例,比如一個進程或一個網絡設備,核心必須能夠找出所有的實例。在鏈表中,根指針包括第一個數據結構或單元的地址,列表中的每一個數據結構包含指向列表下一個元素的指針。最後元素的下一個指針可能使0NULL,表示這是列表的結尾。在雙向鏈表結構中,每一個元素不僅包括列表中下一個元素的指針,還包括列表中前一個元素的指針。使用雙向鏈表可以比較容易的在列表中間增加或刪除元素,但是這需要更多的內存存取。這是典型的操作系統的兩難情況:內存存取數還是CPU的週期數。

 

2. Hash Tables

 

鏈接表是常用的數據結構,但是遊歷鏈接表的效率可能並不高。如果你要尋找指定的元素, 可能必須查找完整個表才能找到。Linux使用另一種技術:Hashing 來解決這種侷限。Hash table是指針的數組或者說向量表。數組或向量表是在內存中依次存放的對象。書架可以說是書的數組。數組用索引來訪問,索引是數組中的偏移量。再來看書架的例子,你可以使用在書架上的位置來描述每一本書:比如第5本書。

 

Hash table是一個指向數據結構的指針的數組,它的索引來源於數據結構中的信息。如果你用一個數據結構來描述一個村莊的人口,你可以用年齡作爲索引。要找出一個指定的人的數據,你可以用他的年齡作爲索引在人口散列表中查找,通過指針找到包括詳細信息的數據結構。不幸的是,一個村莊中可能很多人年齡相同,所以散列表的指針指向另一個鏈表數據結構,每一個元素描述同齡人。即使這樣,查找這些較小的鏈表仍然比查找所有的數據結構要快。

 

Hash table可用於加速常用的數據結構的訪問,在Linux裏常用hash table來實現緩衝。緩衝是需要快速存取的信息,是全部可用信息的一個子集。數據結構被放在緩衝區並保留在那裏,因爲核心經常訪問這些結構。使用緩衝區也有副作用,因爲使用起來比簡單鏈表或者散列表更加複雜。如果數據結構可以在緩衝區找到(這叫做緩衝命中),那麼一切很完美。但是如果數據結構不在緩衝區中,那麼必須查找所用的相關的數據結構,如果找到,那麼就加到緩衝區中。增加新的數據結構到緩衝區中可能需要廢棄一箇舊的緩衝入口。Linux必須決定廢棄那一個數據結構,風險在於廢棄的可能使Linux下一個要訪問的數據結構。

發佈了41 篇原創文章 · 獲贊 43 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章