RCU の紹介
- オペレーティングシステムは、日々動作するプログラムの中でも最も性能に敏感なものの一つである。
- オペレーティングシステムは常にさらに高速化でき、カーネルやドライバの開発者はコード最適化に取り組んでいる。
- オペレーティングシステムには大規模な並行性が必要であり、ユーザー空間のプロセスやスレッドをスケジューリングし、自身のスレッドやハードウェアと相互作用する割り込みハンドラを持つ。
RCU の動作原理
- 頻繁に読まれるがめったに書き換えられないデータ(例: 現在接続されている USB デバイス)を原子的に変更する必要があるとき、RCU(Read, Copy, Update)戦略を使用する。
- データを読み取り、コピーして変更した後、ポインタを新しいバージョンへ原子的に更新する。
- この方法は使いやすく待ち時間もないが、メモリリークが発生する可能性がある。
メモリリーク問題の解決
- メモリリークを防ぐため、更新関数内で古いデータを削除する代わりに、現在それを読んでいるリーダーがいなくなったときに削除するよう遅延させることができる。
- リーダーがデータを読んでいる間、ライターはデータ削除を待つことで安全にメモリを管理する。
RCU の実際の利用
- RCU は Linux で何万回も使われており、Facebook の Folly C++ ライブラリや Rust の
crossbeam-epoch でも使われている。
- RCU は性能とレイテンシ要件によって採用されており、ガベージコレクションに似たメモリ管理方式を提供する。
ガベージコレクションに関する誤解
- ガベージコレクションが手動メモリ管理より遅いという通念は、細部を見るとすぐに崩れる。
free() 関数は無料ではなく、メモリアロケータは内部的に多くの状態を維持しなければならない。
- 現代のガベージコレクションは移動および世代別最適化を提供し、高いスループットとキャッシュ性能を実現する。
制御の幻想
- 開発者はときにリアルタイムシステムを構築しようとするが、実際にはメモリ管理を完全に制御できているわけではない。
- オペレーティングシステムはメモリ割り当てに対する開発者の意図を推測するだけであり、単純なポインタアクセスがディスク I/O に変わることさえある。
結論
- すべてのソフトウェアがガベージコレクションの恩恵を受けるわけではないが、ガベージコレクションは有用なツールであり、システムプログラマの間でももはや恐れる必要はない。
GN⁺の見解
- RCU は、マルチスレッド環境でデータ整合性を保ちながら並行性を高める効果的な手法である。これは高性能計算やリアルタイムシステムで非常に重要な要素である。
- ガベージコレクションに関する通念を打ち破る RCU の例は、開発者にメモリ管理への新たな視点を提供する。これは特に、メモリ管理が重要なシステムプログラミング分野でよりいっそう当てはまる。
- RCU と似た機能を提供する他のプロジェクトとして、Java の ConcurrentLinkedQueue や .NET の ConcurrentBag などがあり、これらもロックフリー(lock-free)なデータ構造を提供する。
- RCU 技術を導入する際には、システムの要件と性能目標を考慮し、この技術を使うことで得られる利点と潜在的なコストを理解する必要がある。
- この記事は、開発者がメモリ管理と並行性についてより深く理解し、既存の前提を見直し、新しい解決策を探る助けとなりうる。
1件のコメント
Hacker Newsの意見
MPLとMaPLeに関する革新的な並列ガベージコレクション(GC)技術をチェックするべきという提案
disentanglementRCUをガベージコレクションの同期機構として使うのは興味深い
メモリ管理に関する一般的な誤解
RCUのユースケースには説得力があるが、他の状況でのガベージコレクションの経験は良くない
free()呼び出しがメモリをOSに返すという誤解についての議論ガベージコレクションを使うと、新しい割り当てがキャッシュではなくRAMから行われる
優れたトレーシングガベージコレクタは、スループットの面ではかなり前から手動メモリ管理を上回っている
ガベージコレクションと相性が良いものの1つがasync/await
RCUの動機付けの後に、一般的なガベージコレクションの議論へ移るのはやや意外
ソフトウェア開発では2つのケースを考える
RCUから一般的なトレーシングガベージコレクションへの移行は巧妙な戦略に見える
システムプログラマーにとって、いつガベージコレクト可能かを識別するのは難しい
RustとC++のライフタイム管理ツールはメモリ解放の自動化には役立つが、複雑さ自体を単純化はしない