💨

RCU

2023/06/06に公開

RCU(Read Copy Update)をちゃんと知る(1)-1 ほんとの概要 - tkokamoの日記

(1)ノードAはノードBおよびノードCを指しています。
(2)Cの更新を行いたいタスクは、Cのコピーを作成しそれに対してデータの更新を行います。仮にCを参照中のタスクが他に存在していても、更新を行うタスクはコピー先に対して更新を行うため、参照中のタスクに対して中途半端な状態が見えることがありません。
(3)C'の更新が終わり他のタスクから参照されても問題ない状態になった時、AがもともとCを指していたポインタをC'を指すように更新します。

2 つ以上のタスク(スレッドとか) があり、ともに 1 つのデータ(構造) を参照したり更新する。

  • タスク A はデータを更新する
  • タスク B はデータを参照する

タスク A がデータを更新している間にタスク B がデータを参照すると、タスク B は更新中のデータを参照することとなってしまい、タスク B は正常ではない値を参照する可能性がある。可能性が高い。ありがち。「まれによくある」というやつ。

これを回避するために一般的に排他制御をおこなう。

更新開始時に排他制御開始し、更新終了時に排他制御を終了する。逆も然り。参照開始時に排他制御開始し、参照終了時に排他制御を終了する。

ただ、更新側も参照側も排他制御するとパフォーマンスが高くならない。

そこで RCU です。 RCU では参照側のみ排他制御をおこない、更新側は排他制御をおこなわないようにした。

あってますかね...。

Discussion