亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

Kernel數據結構移植(list和rbtree)

2024-06-28 13:25:31
字體:
來源:轉載
供稿:網友
Kernel數據結構移植(list和rbtree)

主要移植了內核中的 list,rbtree。使得這2個數據結構在用戶態程序中也能使用。

同時用 cpputest 對移植后的代碼進行了測試。(測試代碼其實也是使用這2個數據結構的方法)

內核代碼的如下文件:(內核版本 v3.2 debian 7.5源碼)

  1. include/linux/list.h (刪除了 hlist 相關內容)
  2. include/linux/rbtree.h
  3. lib/rbtree.c

對上面的代碼進行了一些簡化,只留了常用的函數。同時刪除了其中和內核相關的部分。

主要內容:

  • list 介紹 (循環雙向鏈表)
  • rbtree 介紹

1. list 介紹 (循環雙向鏈表)1.1 簡介

Linux中的鏈表用法與一般數據結構書中介紹的用法有些不一樣。

Linux內核中,為了保證鏈表的通用性,將鏈表的節點結構單獨抽取了出來,也就是將鏈表的結構和鏈表的數據分開定義。

一般數據結構的書中介紹到的鏈表都是將鏈表的數據和鏈表的結構一起定義的。

注:具體介紹可以我之前的博客參見:http://www.CUOXin.com/wang_yb/archive/2013/04/16/3023892.html 中的 1.2節

里面很重要的一點就是:鏈表結構和數據分開后,是如何通過鏈表節點結構來獲取數據的?

帶有safe的函數或者宏都是可以用于多線程的

1.2 修改部分
  1. 刪除了hlist相關內容
  2. 修改了 list_del 函數: 將 LIST_POISON1 和 LIST_POISON2 改成了 NULL
  3. 刪除了 list_empty_careful: 用戶空間用不上
  4. 刪除 __list_for_each: 和 list_for_each 重復
  5. 刪除 list_PRepare_entry: 暫時不需要
  6. 刪除 list_safe_reset_next: 暫時不需要
  7. 刪除 list_rotate_left: 暫時不需要
  8. 所有變量 new 改為了 newnode: new 是 c++ 關鍵字,用CppUTest進行測試時無法編譯

1.3 list.h 對外的接口

No.

主要 函數

說明

1.list_add在 head 之后追加一個節點
2.list_add_tail在 head 之前追加一個節點, 也就是在末尾追加一個節點
3.list_del刪除一個節點, 并將這個節點的next, prev 置為 NULL
4.list_del_init刪除一個節點并初始化刪除的節點
5.list_replace替換一個節點
6.list_replace_init替換一個節點, 并初始化被替換的節點
7.list_move移動節點到 head 之后
8.list_move_tail移動節點到 head 之前
9.list_is_last判斷節點是否是鏈表中最后一個
10.list_empty判斷鏈表是否為空 (即, 是否只有 head 節點)
11.list_is_singular判斷鏈表中是否只有一個節點 (除了 head 之外)
12.list_cut_position將1個鏈表截斷為2個鏈表
13.list_splice將2個鏈表合并為1個鏈表, @list中的所有節點(不包括list)加入到 head 之后
14.list_splice_tail將2個鏈表合并為1個鏈表, @list中的所有節點(不包括list)加入到 head 之前
15.list_splice_init同 list_splice, 最后會初始化 @list
16.list_splice_tail_init同 list_splice_tail, 最后會初始化 @list

No.

主要 宏

說明

1.list_entry獲取包含此節點的 struct
2.list_first_entry獲取包含此節點的 首個 struct
3.list_for_each從 head節點之后一個節點開始向后循環
4.list_for_each_prev從 head節點之前一個節點開始向前循環
5.list_for_each_safelist_for_each 的安全版本, 即, 循環時即使有其它線程刪除節點也可正常運行
6.list_for_each_prev_safelist_for_each_prev 的安全版本
7.list_for_each_entry同 list_for_each, 只是參數不同
8.list_for_each_entry_reverse同 list_for_each_prev, 只是參數不同
9.list_for_each_entry_continue同 list_for_each_entry, 但不是從頭(head)開始循環的
10.list_for_each_entry_continue_reverse同 list_for_each_entry_reverse, 但不是從頭(head)開始循環的
11.list_for_each_entry_from從指定位置開始向后循環
12.list_for_each_entry_safelist_for_each_entry 的安全版本
13.list_for_each_entry_safe_continuelist_for_each_entry_continue 的安全版本
14.list_for_each_entry_safe_fromlist_for_each_entry_from 的安全版本
15.list_for_each_entry_safe_reverselist_for_each_entry_reverse 的安全版本

1.4 使用示例 - 測試 list.h 中所有的list操作

構造如下場景,用來測試上述列出的所有的 list 操作:

1. 構造用來測試的 struct:(為了使得測試結果一目了然,struct盡量簡單)

struct test_struct {int num;    struct list_head head;};

2. 逐個函數進行測試,使用測試框架 cppUTest

3. 宏 相關的暫時沒有測試

4. 運行測試非常簡單(前提是得安裝 cpputest)

make./test_list -v

2. rbtree 介紹1.1 簡介

紅黑樹是一種自平衡的二叉搜索樹。紅黑樹是有序的。

注: 具體介紹可以我之前的博客參見:http://www.CUOXin.com/wang_yb/archive/2013/04/16/3023892.html 中的 第4節

這里只補充一點,紅黑樹雖然有些復雜,但是它的查找,插入,刪除操作的效率還不錯。查找,插入,刪除的時間復雜度都是O(log n) n是樹中元素數目

1.2 修改部分

為了是 rbtree 更加簡單,暫時刪除了以下內容:

  1. 刪除了函數指針的定義 typedef rb_augment_f
  2. 刪除了 rb_augment_insert
  3. 刪除了 rb_augment_erase_begin
  4. 刪除了 rb_augment_erase_end
  5. 刪除了 rb_link_node

1.3 rbtree.h 對外接口

注意: rbtree 的對外接口中沒有插入node的接口,只有在插入node之后改變node顏色的接口

可能是由于node的順序因具體struct而異,所以沒法統一實現

No.

主要 函數

說明

1.rb_set_parent設置父節點的地址
2.rb_set_color設置節點顏色
3.rb_init_node初始化節點
4.rb_insert_color設置新插入節點的顏色
5.rb_erase刪除一個節點
6.rb_next返回當前節點的下一個節點
7.rb_prev返回當前節點的上一個節點
8.rb_first返回第一個葉子節點(也就是最左邊的葉子節點)
9.rb_last返回最后一個葉子節點(也就是最右邊的葉子節點)
10.rb_replace_node替換rbtree中的一個node(只是簡單的替換,沒有管替換的顏色對不對,數據的順序對不對)

No.

主要 宏

說明

1.rb_parent獲取父節點的地址
2.rb_color節點的顏色
3.rb_is_red是否紅節點
4.rb_is_black是否黑節點
5.rb_set_red設置節點為紅色
6.rb_set_black設置節點為黑色
7.RB_ROOT初始化根節點
8.rb_entry獲取包含rbtree node的struct
9.RB_EMPTY_ROOT判斷是否只有根節點
10.RB_EMPTY_NODE判斷節點是否剛初始化,還沒有加到樹中
11.RB_CLEAR_NODE設置節點的父節點也指向自己

1.4 rbtree.c 補充說明

rbtree.c 中函數都比較簡單,比較復雜的是 rb_insert_color 和 rb_erase

這2個函數還涉及其它未公開的函數 __rb_rotate_left, __rb_rotate_right, __rb_erase_color

1. __rb_rotate_left : 左旋,即,以參數 node 為中心點,逆時針旋轉。左旋可以調整右子樹的高度

下面的4副圖演示了左旋時,struct rb_node 的 left 和 right 指針的變化。

下圖是最復雜的一種情況,即所有相關節點的左右子樹不為空的情況

rbtree-rotate-left

2. __rb_rotate_right : 右旋,即,以參數 node 為中心點,順時針旋轉。右旋可以調整左子樹的高度

下面的4副圖演示了右旋時,struct rb_node 的 left 和 right 指針的變化。

下圖是最復雜的一種情況,即所有相關節點的左右子樹不為空的情況

rbtree-rotate-right

3. rb_erase : 刪除節點,調用 __rb_erase_color 調整顏色

下圖演示刪除節點時,struct rb_node 的 left 和 right 指針的變化。

下圖是最復雜的一種情況,即所有相關節點的左右子樹不為空的情況

rbtree-erase

4. __rb_erase_color : 刪除節點后,調整被刪除節點后節點的顏色

被刪除節點 A 的位置由被刪除節點的下一個節點 B(即被刪除節點的右子樹中最左的節點)替換。

調整的顏色就是 B 節點的 child 和 parent

刪除時各種情況的分析參見:http://zh.wikipedia.org/wiki/紅黑樹

5. rb_insert_color : 設置新插入節點的顏色,調整rbtree的平衡

插入的位置需要自己定義,這個函數只是調整插入后節點的顏色

插入時各種情況的分析參見:http://zh.wikipedia.org/wiki/紅黑樹

1.5 使用示例

構造如下場景,用來測試上述列出的所有的 rbtree 操作:

1. 構造用來測試的 struct:(為了使得測試結果一目了然,struct盡量簡單)

struct test_struct {    int num;    struct rb_node node;};

2. 逐個函數進行測試,使用測試框架 cppUTest

3. 宏 相關的暫時沒有測試

4. 運行測試非常簡單(前提是得安裝 cpputest)

make./test_rbtree -v

相關測試代碼下載


上一篇:安裝 tomat

下一篇:文件操作

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人av电影天堂| 欧美激情视频在线| 亚洲欧美国产精品久久久久久久| 精品一区二区亚洲| 久久天天躁狠狠躁夜夜av| 欧美日韩美女视频| 国产成人精品免费久久久久| 欧美午夜影院在线视频| 国产成人aa精品一区在线播放| 91免费福利视频| 亚洲精品电影网在线观看| 久久久999国产| 午夜精品蜜臀一区二区三区免费| 久久精品国产欧美激情| 久久91精品国产91久久跳| 日韩大陆毛片av| 精品视频www| 精品少妇一区二区30p| 中文字幕亚洲综合久久筱田步美| 亚洲人成啪啪网站| 国产主播喷水一区二区| 日韩av网站在线| 日韩大片免费观看视频播放| 国产欧美在线播放| 国产精品一区二区性色av| 久久久爽爽爽美女图片| 国产视频亚洲视频| 亚洲福利在线视频| 日韩精品在线视频美女| 国产成人短视频| 国产精品香蕉在线观看| 热久久这里只有精品| 欧美日韩亚洲视频| www.久久久久久.com| 久久精品亚洲94久久精品| 亚洲区bt下载| 欧美日韩色婷婷| 成人97在线观看视频| 亚洲一区二区免费在线| 欧美资源在线观看| 国产日韩欧美在线视频观看| 色婷婷**av毛片一区| 成人在线播放av| 国产精品video| 久久精品国产久精国产思思| 亚洲综合小说区| 51ⅴ精品国产91久久久久久| 影音先锋欧美精品| 美女av一区二区三区| 黄色成人在线免费| 久久成人18免费网站| 中文字幕亚洲一区在线观看| 亚洲精品欧美极品| 疯狂做受xxxx高潮欧美日本| 久久久久久噜噜噜久久久精品| 日韩成人久久久| 欧美在线激情视频| 久久不射电影网| 国产精品国产三级国产aⅴ9色| 久久久久免费视频| 美女视频久久黄| 国产成人综合精品| 国产日韩欧美在线| 欧美一级片免费在线| 国产一区二区三区精品久久久| 亚洲缚视频在线观看| 久久影院免费观看| 69av在线播放| 欧美国产亚洲精品久久久8v| 国产午夜精品全部视频播放| 国产一区二区av| 亚洲天堂av在线免费| 亚洲自拍av在线| 中文字幕国产精品久久| 亚洲最大av网| 国产精品久久久久久久久| 亚洲色图综合久久| 亚洲毛片在线看| 国产精品久久久久久久久久新婚| 91精品视频观看| 91久久国产精品91久久性色| 国产精品露脸av在线| 亚洲精品视频在线播放| 日韩av中文在线| 亚洲欧美一区二区三区情侣bbw| 日韩中文av在线| 亚洲第一精品自拍| 精品成人国产在线观看男人呻吟| 5278欧美一区二区三区| 日韩成人激情视频| 久久夜色精品国产亚洲aⅴ| 亚洲第一偷拍网| 日韩精品在线观看视频| 成人性生交xxxxx网站| 91精品国产自产在线观看永久| 日本在线精品视频| 久久成人18免费网站| 国产精品www| 日韩黄在线观看| 欧美中文字幕在线视频| 国产精品第七十二页| 欧美伊久线香蕉线新在线| 伊人久久免费视频| 亚洲天堂成人在线| 日韩av中文字幕在线免费观看| 九色91av视频| 国产一区二区欧美日韩| 日韩av免费看网站| 国产精品男人爽免费视频1| 亚洲精品国产精品国自产在线| 国产一区二区三区免费视频| 亚洲字幕在线观看| 亚洲精品v天堂中文字幕| 亚洲成人av中文字幕| 国模视频一区二区| 亚洲精品美女网站| 国产精品视频成人| 亚洲性av在线| 9.1国产丝袜在线观看| 国产主播欧美精品| 欧美精品免费看| 国产亚洲美女精品久久久| 欧美日韩一区二区精品| 伊人一区二区三区久久精品| 欧美一级视频免费在线观看| 国产精品久久国产精品99gif| 国产精品久久久久秋霞鲁丝| 亚洲激情视频在线观看| 日韩精品免费电影| 亚洲免费小视频| 亚洲国产精彩中文乱码av在线播放| wwwwwwww亚洲| 精品人伦一区二区三区蜜桃网站| 美女撒尿一区二区三区| 久久久最新网址| 日韩精品中文字幕在线播放| 久久夜色精品国产亚洲aⅴ| 日本在线精品视频| 日韩欧美一区二区三区久久| 亚洲精品之草原avav久久| 亚洲国产女人aaa毛片在线| 一区二区成人av| 欧美电影在线观看网站| 欧美亚洲在线观看| 91精品国产亚洲| 亚洲性生活视频在线观看| 亚洲国产天堂久久综合| 欧美在线视频免费观看| 亚洲成人性视频| 国内揄拍国内精品少妇国语| 国产一区二区丝袜高跟鞋图片| 成人激情在线播放| 国产综合在线视频| 在线国产精品视频| 5566成人精品视频免费| 国产精品一区二区久久精品| 亚洲精品久久久久中文字幕欢迎你| 久久久久久久久电影| 成人精品视频久久久久| 欧美专区日韩视频| 国产成人福利视频| 日韩中文字幕视频在线| 66m—66摸成人免费视频| 另类天堂视频在线观看|