RCUメカニズムLinuxデバイスドライバ

読む - コピー - 更新は(リード・コピー・アップデート、RCU)を適切な条件の下で、高い性能を達成することができ、高レベルの相互排他メカニズムです。

RCUで保護されたデータ構造には、いくつかの限られたを行っているが、それはほとんど読み書きのためのケースではありません頻繁に最適化された発生し、保護されたリソースは、ポインタを介してアクセスする必要があり、そしてコードへの参照は、これらのリソースの原子で構成されている必要があります、他の参照が存在しない場合、カーネルの古いバージョンを確認、書き込みスレッド最初のコピーをデータ構造を変更し、コピーを変更し、新しいバージョンに関連するポインタを交換する際に、コード範囲RCUで保護してスリープ状態に入ることができませんあなたは、古いバージョンをリリースすることができます。

<linux / rcupdate.h>ヘッダ・ファイルが含まれている必要がありRCUコードを使用します。

RCUは、RCUがロック外で使用されない間接参照ポインタに注意し、次の読み出し動作を使用します。

1  rcu_read_lock()。
2  
3 P = rcu_dereference(PTR)。
4  もし(!p = NULL){
 5      / * 读取操作* / 
6  }
 7  
8 rcu_read_unlock()。

 

次のようにRCUの書き込み動作の使用が必要な場合は、その後リードポインタがコードを置き換え、古いコピーデータ構造から、新しい構造を割り当てるための最初の必要性を見ることができる、です。

1  構造体 some_struct * new_ptr = kmallocの(...);
2  
3 new_prt-> XXX = XX。
4  
5 rcu_assign_pointer(PTR、new_ptr)。

書き込み終了の完了後、それが残っているすべては、古いデータ構造を解放することです。もちろん、コードは他のプロセッサ上で実行されているこの時間は、古いデータへの参照を投げることができ、したがって、すぐに古い構造を解放することはできません。まで待たなければならないコードを書きます私たちは、このような基準が存在しないことを確信することができます。

彼らは、コードのデータ構造への参照はアトミックでなければならない持っているので、私たちが知っている可能性があるため、少なくとも一度、すべての参照が消えてしまいますと呼ばれるシステムに一度、各プロセッサであるため、RCUは何が設定されていますコールバックとすべてのプロセッサを待つにはコールバック関数によってクリーンアップ作業の完了後に予定されています。

RCUは、2つの機能は、すべての古い構造の読み取りが終了した後にリソースを解放するために待機を読んで終わりのための同期および非同期の待ち時間です提供します。

同期:読み取りが参照、関数が戻った後にリリースされる、古いリソースを引用した後synchronize_rcuは()、この関数は、すべての変更の終了を待つために呼び出されます。

1  空隙 synchronize_rcu(ボイド)。

非同期:call_rcu()、、、すべての読み取りアクセスが完了した後、この関数を使用して古いリソースを解放するためにリリース古いリソースを登録したコールバック関数をコールバック関数を登録します。

1  ボイド call_rcu(構造体 rcu_head *ヘッド、rcu_callback_tのFUNC)。

 

おすすめ

転載: www.cnblogs.com/wanpengcoder/p/11760776.html