成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

闡述Linux內存管理:紅黑樹

系統 Linux
很多的人都開始學習Linux操作系統。當我們學習Linux時,會遇到很多的問題。最近看Linux內存管理,看到紅黑樹這一部分甚為頭大,于是了解了一下紅黑樹的基本知識。詳細講解一下Linux內存管理。

很多的人都開始學習Linux操作系統。當我們學習Linux時,會遇到很多的問題。最近看Linux內存管理,看到紅黑樹這一部分甚為頭大,于是了解了一下紅黑數的基本知識。詳細講解一下Linux內存管理。

紅黑樹是平衡二叉樹的一種,它有很好的性質,樹中的結點都是有序的,而且因為它本身就是平衡的,所以查找也不會出現非常惡劣的情況,基于二叉樹的操作的時間復雜度是O(log(N))。Linux內核在管理vm_area_struct時就是采用了紅黑樹來維護內存塊的。

先到include/Linux/rbtree.h中看一下紅黑樹的一些定義,如下:

  1. struct rb_node  
  2. {  
  3. struct rb_node* rb_parent; 該節點的父節點  
  4. int rb_color;  該節點的顏色  
  5. #define RB_RED 0  
  6. #define RB_BLACK 1  
  7. struct rb_node *rb_right; 該節點的右子節點  
  8. struct rb_node *rb_left;  該節點的左子節點  
  9. } __attribute__((aligned(sizeof(long)))); 

struct rb_root只是struct rb_node*的一個包裝,這樣做的好處是看起來不用傳遞二級指針了。不錯,很簡單。

測試顏色和設置顏色也是水到渠成的事了。需要特別指出的是下面的一個內聯函數:
static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, struct rb_node ** rb_link);

它把parent設為node的父結點,并且讓rb_link指向node。

我們把重點集中在lib/rbtree.c上,看看一些和紅黑樹相關的重要算法。開始之前我們一起回憶一下紅黑樹的規則:

1. 每個結點要么是紅色要么是黑色;
2. 根結點必須是黑色;
3. 紅結點如果有孩子,其孩子必須都是黑色;
4. 從根結點到葉子的每條路徑必須包含相同數目的黑結點。
5、每個樹節點N的左孩子樹上的所有元素都是排在N之前,右孩子樹子上的所有元素都是排在N之后

這四條規則可以限制一棵排序樹是平衡的。

__rb_rotate_left是把以root為根的樹中的node結點進行左旋,__rb_rotate_right是進行右旋。這兩個函數是為后面的插入和刪除服務,而不是為外部提供接口。

新插入的結點都設為葉子,染成紅色,插入后如果破壞了上述規則,通過調整顏色和旋轉可以恢復,二叉樹又重新平衡。插入操作的接口函數是
void rb_insert_color(struct rb_node *node, struct rb_root *root);

它把已確定父結點的node結點融入到以root為根的紅黑樹中,具體算法的分析可以參考[1]中第14.3節,這里的實現和書中的講解幾乎完全一樣。怎么確定node的父結點應該在調用rb_insert_color之前通過手工迭帶完成。值得指出的一點是,雖然插入操作需要一個循環迭代,但是總的旋轉次數不會超過兩次!所以效率還是很樂觀的。

刪除操作多多少少都有點麻煩,它要先執行像普通二叉查找樹的“刪除”,然后根據刪除結點的顏色來判斷是否執行進一步的操作。刪除的接口是:
void rb_erase(struct rb_node *node, struct rb_root *root);

其實它并沒有真正刪除node,而只是讓它和以root為根的樹脫離關系,最后它還要判斷是否調用__rb_erase_color來調整。具體算法的講解看參考[1]中第13.3和14.4節,__rb_erase_color對應書中的RB-DELETE-FIXUP,此處的實現和書上也基本上一致。

其余的幾個接口就比較簡單了。
struct rb_node *rb_first(struct rb_root *root);

在以root為根的樹中找出并返回最小的那個結點,只要從根結點一直向左走就是了。
struct rb_node *rb_last(struct rb_root *root);

是找出并返回最大的那個,一直向右走。
struct rb_node *rb_next(struct rb_node *node);

返回node在樹中的后繼,這個稍微復雜一點。如果node的右孩子不為空,它只要返回node的右子樹中最小的結點即可;如果為空,它要向上查找,找到迭帶結點是其父親的左孩子的結點,返回父結點。如果一直上述到了根結點,返回NULL。
struct rb_node *rb_prev(struct rb_node *node);

返回node的前驅,和rb_next中的操作對稱。
void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root);

用new替換以root為根的樹中的victim結點。
因為紅黑樹的這些良好性質和實現中接口的簡易性,它被廣泛應用到內核編程中,大大提高了內核的效率。

通過本文的介紹你就能熟練掌握Linux內存管理。

【編輯推薦】

  1. 掌握操作技巧 玩轉Linux桌面操作系統
  2. 各種各樣的Linux來自Linux個人開發者
  3. 倫敦證券啟用Linux操作系統平臺
  4. Linux基金會大動作
  5. Linux操作系統:普通用戶安全執行管理員程序
責任編輯:小霞 來源: 51CTO
相關推薦

2020-09-17 07:37:09

紅黑樹數據結構

2009-12-25 17:15:03

Linux內存

2016-12-08 11:01:39

紅黑樹Java

2020-07-09 07:00:00

HashMap

2020-11-05 09:03:32

紅黑樹面試數據

2020-10-09 06:56:55

紅黑樹動圖二叉樹

2010-07-19 14:17:47

SQL Server內

2009-12-21 14:33:11

2020-11-05 13:12:47

紅黑樹

2019-08-22 09:22:44

數據結構二叉搜索樹

2023-03-31 08:24:29

數據結構算法數目

2020-05-06 16:41:36

紅黑樹二叉查找樹

2009-12-16 15:59:13

Linux設備文件管理

2023-08-29 08:31:13

B+樹數據索引

2019-10-12 08:36:48

Java程序員數據結構

2020-03-11 08:40:51

紅黑樹平衡二叉B樹

2019-09-23 11:35:23

數據結構設計紅黑樹

2019-01-22 09:37:47

紅黑樹數據二叉樹

2021-03-19 07:59:33

紅黑樹面試數據

2009-12-09 14:15:39

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 理论片午午伦夜理片影院 | av在线视| 亚洲 成人 av | 成人午夜影院 | 久久高清 | 亚洲国产欧美日韩 | 成人中文字幕在线观看 | 亚洲欧美日韩精品久久亚洲区 | 久久精品99| 色在线免费视频 | 99精品电影 | 久久精品免费观看 | 日韩中文字幕网 | 国产一区二区三区免费观看在线 | 免费看大片bbbb欧美 | 一区二区三区电影网 | a级在线免费观看 | 久久人| 一区精品国产欧美在线 | 亚洲视频在线一区 | 亚洲一区网站 | 久久在线看 | a毛片 | 青青草一区 | 国产欧美性成人精品午夜 | 亚洲综合国产 | 午夜影院在线免费观看视频 | 成人国产网站 | 一区二区在线 | 久久一二 | 国产日韩一区二区 | 不卡视频一区二区三区 | 国产一区二区精华 | 大乳boobs巨大吃奶挤奶 | 91精品国产色综合久久不卡98 | 亚洲色图婷婷 | 精品久久久久久久久久久 | 久久精品91久久久久久再现 | 欧美久久久久久 | 午夜小视频在线观看 | 国产女人与拘做视频免费 |