【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )
文章目錄
- 一、RCU 機制
- 二、RCU 機制的優勢與弊端
- 三、RCU 機制的鏈表應用場景
一、RCU 機制
RCU , 英文全稱是 " Read-Copy-Update “ , 對應的中文名稱是 ” 讀取-拷貝-更新 “ , 這是 Linux 內核中的 ” 同步機制 " ;
Linux 內核中還有其它同步機制 , 如 " 原子操作 " , " 讀寫信號量 " 等 " 鎖機制 " ;
RCU 機制 :
① 記錄指針 : RCU 會 記錄 所有的 指向 " 共享數據 " 的 指針 ;
② 修改數據 ( 讀取-拷貝 操作 ) : 如果 " 指針持有者 “ 修改該 ” 共享數據 " , 需要先 創建一個共享數據 " 副本 " , 然后在副本中修改 ;
③ 更新數據 ( 更新操作 ) : 只需要讀取 " 共享數據 " 的線程 , 離開 " 讀臨界區 " 后 , 指向原來 " 共享數據 " 的 指針 重新指向 " 副本 " , 然后再刪除原來的 " 共享數據 " ;
二、RCU 機制的優勢與弊端
RCU 的優勢是 " 讀者 " ( 讀取共享數據的線程 ) 不需要承擔同步開銷 ,
同步開銷指的是 : ① 獲取 " 鎖 " , ② 執行 " 原子指令 " , ③ 執行 " 內存屏障 " ;
與此相對的 RCU 機制也有一定弊端 , " 寫者 " ( 修改共享數據的線程 ) 需要 承擔很大的同步開銷 , 其需要
① 延遲對象釋放 ,
② 讀取 并 復制 共享數據 ,
③ 必須使用 互斥鎖 機制 ;
三、RCU 機制的鏈表應用場景
RCU 機制 可以極大地 提高 " 鏈表 " 數據結構的 讀取效率 ,
多個線程 同時讀取 鏈表 時 , 使用 rcu_read_lock() 即可 ,
在多線程讀取的同時還允許有 111 個線程修改 鏈表 ;
RCU 機制 就是 " 讀取-拷貝-更新 " ,
上述 " 寫線程 " 修改 " 鏈表 " 數據結構 的流程如下 :
① 首先 , 讀取 鏈表數據 內容 ;
② 然后 , 拷貝 鏈表數據 到一個 " 副本 " 中 ;
③ 最后 , 更新 數據 , 將 " 鏈表 " 的指針 指向 拷貝的 " 副本 " 中 , 刪除 原始鏈表數據 ;
如果 " 寫線程 " 刪除 " 鏈表 " 數據結構 , 需要 等待 所有 訪問該 鏈表的 線程 訪問結束 , 即 釋放該鏈表指針 , 之后才能銷毀該鏈表 ;
總結
以上是生活随笔為你收集整理的【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux 内核】线程调度示例一 ③
- 下一篇: 【Linux 内核 内存管理】RCU 机