1. 程式人生 > >Linux核心工程導論——資料結構:連結串列與雜湊

Linux核心工程導論——資料結構:連結串列與雜湊

         scatterlist table由於可以被拼接(chain),不同的scatterlist如果所指向的記憶體是相鄰的還可以被合併,所以其遍歷格外複雜。

1.4 llist

llist全稱是Lock-less NULL terminated single linked list,意思是不需要加鎖的list。在生產者消費者模型下,如果有多個生產者和多個消費者,生產者意味者連結串列新增,消費者意味著連結串列刪除操作。但多個一起操作時就需要加鎖,加鎖畢竟是高耗費的操作,核心現在流行無鎖操作,為這個需求誕生的專門的list就是llist。

        典型的情形就是中斷。我們都知道中斷有上半部分和下半部分。上半部分是會關閉所有中斷,使系統失去響應,為了減小這個時間,上班部分不能休眠,複雜的操作也得放到下半部分執行。也就是意味著上班部分的程式碼不能使用加鎖操作,而中斷重入是很容易發生的,這就又誕生了加鎖的需求。最好的提供上半部分使用list資料結構能力的方式就是使用無鎖list。

核心實現的方法是使用cmpxchg巨集。這本來是一個intel平臺的彙編指令,linux喜歡這個指令,但其他平臺不一定有,所以就封裝了一個巨集,在其他平臺重新實現,而intel平臺就可以直接呼叫cmpxchg指令即可。這個指令是原子的,有3個引數,對比第一個和第二個引數,如果相等就寫入第三個引數到第一個引數指向的地址。如果不相等就返回第三個引數。本意是將第三個引數寫入第一個引數指向的地址。但是加上了對比,對比之後寫入之前第一個引數指向的記憶體就不會被其他任何指令修改,這就確保了在寫入操作之前和之後的一致性。具體到llist就是在新增連結串列節點到頭部時,需要確保修改head->first指標時,沒有其他的並行操作也在修改。如此就會造成同時進行的兩個操作有一個丟失。所以cmpxchg先讀出head->next,然後head->first作為第一個引數,剛讀出的head->first作為第二個,要新增的作為第三個。

作者是intel公司的 Huang Ying。

LRU

List-lru

       在mm下有定義,主要用在記憶體管理。在 Linux 中,作業系統對 LRU 的實現主要是基於一對雙向連結串列:active連結串列和 inactive 連結串列,這兩個連結串列是 Linux作業系統進行頁面回收所依賴的關鍵資料結構,每個記憶體區域都存在一對這樣的連結串列。顧名思義,那些經常被訪問的處於活躍狀態的頁面會被放在active連結串列上,而那些雖然可能關聯到一個或者多個程序,但是並不經常使用的頁面則會被放到 inactive連結串列上。頁面會在這兩個雙向連結串列中移動,作業系統會根據頁面的活躍程度來判斷應該把頁面放到哪個連結串列上。頁面可能會從 active 連結串列上被轉移到 inactive連結串列上,也可能從 inactive 連結串列上被轉移到 active連結串列上,但是,這種轉移並不是每次頁面訪問都會發生,頁面的這種轉移發生的間隔有可能比較長。那些最近最少使用的頁面會被逐個放到inactive 連結串列的尾部。進行頁面回收的時候,Linux作業系統會從 inactive連結串列的尾部開始進行回收。

   LIRS

    這個演算法是LRU的改進演算法。LRU在遍歷時會導致被全部重新整理,失去意義,反而會帶來效率的損失。但是LIRS使用兩層列表,一個是cold,一個是hot。利用兩層資料保證經常使用的資料不被遍歷操作刷掉。但是這個演算法在核心中還沒有實現,估計日後有人會做。

相關推薦

Linux核心工程導論——資料結構連結串列

         scatterlist table由於可以被拼接(chain),不同的scatterlist如果所指向的記憶體是相鄰的還可以被合併,所以其遍歷格外複雜。1.4 llistllist全稱是Lock-less NULL terminated single linked list,意思是不需要加鎖

Linux核心工程導論——資料結構

樹 樹作為一種很常用的資料結構,主要包括二叉搜尋數(BST)、多路搜尋樹(B-樹)、B樹根據葉子節點樹分為二叉樹和多叉樹。根據左右節點是否高度上對稱,分為平衡樹和非平衡樹,平衡樹的一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡樹。簡單的說

資料結構連結串列順序表的優缺點

1.順序表儲存     原理:順序表儲存是將資料元素放到一塊連續的記憶體儲存空間,存取效率高,速度快。但是不可以動態增加長度     優點:存取速度高效,通過下標來直接儲存     缺點:1.插入和刪除比較慢,2.不可以增長長度                    比如:插

玩轉資料結構——第三章最基礎的動態資料結構連結串列

內容概括: 3-1.什麼是連結串列 3-2.在連結串列中新增元素 3-3.使用連結串列的虛擬頭結點 3-4.連結串列的遍歷,查詢和修改 3-5.從連結串列中刪除元素 3-6.使用連結串列實現棧 3-7.帶有尾指標的連結串列:使用連結串列實現佇列

最基礎的動態資料結構連結串列

什麼是連結串列 連結串列是一種線性結構,也是最基礎的動態資料結構。我們在實現動態陣列、棧以及佇列時,底層都是依託的靜態陣列,靠resize來解決固定容量的問題,而連結串列是真正的動態資料結構。學習連結串列這種資料結構,能夠更深入的理解引用(或者指標)以及遞迴。其中連結串列分為單鏈連結串列和雙鏈連結串列,本文

基本資料結構連結串列(list)

那個單向連結串列程式樓主寫的很不錯,學習了,但是實際應用執行後,還是發現幾個問題1,第一個是最嚴重的問題,Delete函式中的temp變數並不是用new來分配的,但是後面卻用delete來撤銷,這樣在執行時是報錯的。在insert和insertHead函式中用new來分配的node變數,最後卻沒有用delet

[C++]資料結構連結串列形式的堆疊LinkedStack類

//自定義連結串列形式的堆疊 #include<iostream> using namespace std; template<class T> class Node{ public: T data; Node<T> *lin

資料結構連結串列(指標+遊標)

指標實現連結串列 沒什麼好廢話的, 註釋在程式碼中 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef

C資料結構-優化連結串列鏈隊

優化連結串列與鏈隊 筆者上一個版本的連結串列,在尾部插入或刪除的操作時,需要使用for迴圈挪動到尾部,這樣時間複雜度就位O(n)。再用其來實現鏈隊的話,那麼鏈隊的入隊和出隊的時間複雜度也會因此受限。如果在連結串列中加入一個指標,指向尾部元素。那麼這個問題就可以迎刃而解。下面是優化過後的

[C++]資料結構散列表(表)、函式構造、處理衝突

        關鍵字{12,25, 38, 15, 16, 29, 78, 67, 56, 21, 22, 47 } , 對應後位置是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}。 不過這種方法很容易產生衝突(如果關鍵字餘數大部分相同)。一般地,散列表長為m, 通常p

Linux核心工程導論——程序ELF檔案執行原理(2)

ELF強符號與弱符號(本小節是轉別人的)我們經常在程式設計中碰到一種情況叫符號重複定義。多個目標檔案中含有相同名字全域性符號的定義,那麼這些目標檔案連結的時候將會出現符號重複定義的錯誤。比如我們在目標檔案A和目標檔案B都定義了一個全域性整形變數global,並將它們都初始化,

Linux核心工程導論——網路Netfilter概覽

簡介最早的核心包過濾機制是ipfwadm,後來是ipchains,再後來就是iptables/netfilter了。再往後,也就是現在是nftables。不過nftables與iptables還處於爭雄階段,誰能勝出目前還沒有定論。但是他們都屬於netfilter專案的子成員

linux核心工程導論-網路tcp擁塞控制

這篇文章本來是在tcp那篇裡面的,但是那篇太長了,不專一。就完善了一下提取出來了。 TCP擁塞控制        擁塞控制討論的是很多個同時存在的tcp連線應該怎麼規劃自己的資料包傳送和接收速度,以在彼此之間共享頻寬,同時與其他實體的機器公平的競爭頻寬,

資料結構連結串列系列)連結串列建立,連結串列刪除特定節點,連結串列氣泡排序,連結串列快速排序

一、連結串列的理解: 1,各個節點間地址存放可以不連續,雖說是表,但是指標存在是為了找到其他的節點,如果連續了,都沒必要用連結串列了。 2,各節點依賴上一節點,要找到某一個節點必須找到他的上一個節點,所以要訪問連結串列,必須要知道頭指標,然後從頭指標訪問開始。 3,各節點間原來是獨立的,本

資料結構連結串列相關練習題反轉連結串列

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 這道題有兩種思路 ①傳統的使用三個指標:兩個指標用來交換,另一個指標用來向前走  ,

資料結構連結串列相關練習題連結串列的中間節點

給定一個帶有頭結點 head 的非空單鏈表,返回連結串列的中間結點。 如果有兩個中間結點,則返回第二個中間結點。 示例 1: 輸入:[1,2,3,4,5] 輸出:此列表中的結點 3 (序列化形式:[3,4,5]) 返回的結點值為 3 。 (測評系統對該結點序列化表述是

資料結構連結串列相關練習題連結串列中倒數第k個結點

題目描述:輸入一個連結串列,輸出該連結串列中倒數第k個結點。 分析:這個題同樣是引入快慢指標,為了遍歷一次就找到倒數第k個節點,可以定義兩個指標:fast指標從連結串列的頭指標開始遍歷向前走k-1(k)步,slow指標保持不動;從第k步開始,slow指標開從連結串列的頭指標

資料結構連結串列相關練習題刪除連結串列中重複的節點

題目描述 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5。 思路分析

資料結構連結串列相關練習題判斷兩個連結串列是否相交

編寫一個程式,找到兩個單鏈表相交的起始節點。 例如,下面的兩個連結串列: A: a1 → a2 ↘ c1 → c2 → c3 ↗

資料結構連結串列相關練習題環形連結串列

給定一個連結串列,判斷連結串列中是否有環。 思路分析: 判斷連結串列是否帶環,實際上歸屬於快慢指標問題,快指標先進環,慢指標後進環,然後快指標和慢指標最終會在環裡面相遇,如果不會相遇,則表示不是迴圈連結串列,也就是說到頭了,即不帶環。 具體程式碼如下: /**