Linux2.6核心中鏈表的實現

來源:互聯網
上載者:User

      對於一個電腦專業的學生,鏈表這種資料結構對我們來說再熟悉不過了,畢竟在大學的《資料結構》中就講解過,相信你也自己實現過,它實現起來可能是這個樣子:(這裡的例子都來自《Linux核心設計與實現》第三版)

      假定我們有一個資料結構來描述犬科動物中的一員

struct fox{unsigned long tail_length;unsigned long weight;bool          is_fantastic;}

      儲存這個結構到鏈表裡的通常方法是在資料結構中嵌入一個鏈表指標,比如:

struct fox{unsigned long tail_length;unsigned long weight;bool          is_fantastic;struct fox    *next;struct fox    *prev;}


      由此得到的鏈表就像是這樣:

      Linux核心方式與眾不同,它不是將資料結構塞入鏈表,而是將鏈表節點塞入資料結構!
      1.鏈表資料結構

      在過去,核心中有很多鏈表的實現,該選一個既簡單,又高效的鏈表來統一它們了。

      鏈表代碼在標頭檔<linux/list.h>中聲明,其資料結構很簡單:

struct list_head{struct list_head *next;struct list_head *prev;}

      next指標指向下一個鏈表節點,prev指標指向前一個。然而,似乎這裡還看不出它們有多大的作用。到底聲明才是鏈表格儲存體的具體內容呢?其實關鍵在於理解 list_head 結構是如何使用的。

      

struct fox{unsigned long tail_length;unsigned long weight;bool          is_fantastic;struct list_head   list;}

      上述結構中,fox 中的list.next指向下一個元素,list.prev 指向前一個元素。現在鏈表已經能用了,但是顯然還不夠方便。因此核心又提供了一組鏈表操作常式。比如list_add()方法加入一個新的節點到鏈表中。但是,這些方法都有一個統一的特點:它們只接受 list_head 結構作為參數。使用宏 container_of() 我們可以很方便的從鏈表指標找到父結構中包含的任何變數。這是因為在 C 語言中,一個給定結構中的變數位移在編譯時間地址就被ABI固定下來了。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.