問題タブ [copy-on-write]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - コピーオンライトページが実際のコピーかどうかを知る方法は?
mmap を使用してコピー オン ライト マッピング (MAP_PRIVATE) を作成すると、特定のアドレスに書き込むとすぐに、このマッピングの一部のページがコピーされます。プログラムのある時点で、どのページが実際にコピーされたかを把握したいと考えています。「mincore」と呼ばれる呼び出しがありますが、それはページがメモリ内にあるかどうかのみを報告します。これは、コピーされているページとは異なります。
どのページがコピーされたかを知る方法はありますか?
c++ - std::string がコピー オン ライト (COW) メカニズムを使用しているかどうかをプログラムで判断する
この質問からの議論をフォローアップして、ネイティブ C++ を使用している場合、使用している std::string 実装がコピー オン ライト (COW)を利用しているかどうかをプログラムでどのように判断するのか疑問に思っていました。
私は次の機能を持っています:
問題は、true を返す C++ ツール チェーンが見つからないように見えることです。COW が std::string にどのように実装されているかについての私の仮定に欠陥はありますか?
更新: kotlinski のコメントに基づいて、関数内の data() への writeble 参照の使用を変更しました。一部の実装では「true」を返すようになりました。
注: N2668: "Concurrency Modifications to Basic String"によると、今後の C++0x 標準では、basic_string から COW オプションが削除されます。それを提起してくれた James と Beldaz に感謝します。
c++ - 暗黙の共有とは何ですか?
私はC++でゲームエンジンライブラリを構築しています。少し前に、私はQtを使用してアプリケーションを構築していましたが、暗黙の共有の使用にかなり魅了されていました。誰かがこのテクニックをより詳細に説明できるのか、それとも実際のこの簡単な例を提供できるのだろうかと思います。
c++ - C ++で使用する文字列クラスはどれですか?
C ++(MFC)のマルチスレッドデスクトップアプリケーションがあります。現在、開発者は、おそらく気分に応じて、CStringまたはstd::stringのいずれかを使用しています。したがって、単一の実装(おそらく、これら2つ以外のもの)を選択したいと思います。
MFCのCStringは、コピーオンライト(COW)イディオムに基づいており、マルチスレッド環境では受け入れられないと主張する人もいます(おそらくこの記事を参照してください)。アトミックカウンターは非常に高速であるように思われるため、このような主張には納得できません。また、このオーバーヘッドは、メモリの再割り当ての削減によって何らかの形で補われます。
std :: stringの実装はコンパイラに依存することを学びました。これは、MSVCではCOWではありませんが、gccであるか、そうでした。私が理解している限り、新しいC ++ 0x標準は、COW以外の実装を要求することでこれを修正し、連続したバッファー要件などの他の問題を解決します。したがって、実際にはstd::stringはこの時点では明確に定義されていないように見えます...
std :: stringについて私が気に入らないことの簡単な例:過度の再割り当てなしに関数から文字列を返す方法はありません(値で返す場合はコンストラクターをコピーし、それを最適化するための内部バッファーへのアクセスがないため、「return参照による」例えばstd::string& Result
、役に立たない)。これは、CStringを使用して、値で返す(COWによるコピーなし)か、参照で渡してバッファーに直接アクセスすることで実行できます。繰り返しになりますが、C ++ 0xはその右辺値参照で救助されますが、最も近い機能にC++0xを含めることはありません。
どの文字列クラスを使用する必要がありますか?COWは本当に問題になることができますか?他に一般的に使用される文字列の効率的な実装はありますか?ありがとう。
編集:現時点ではUnicodeを使用しておらず、必要になる可能性はほとんどありません。ただし、Unicodeを簡単にサポートできるものがある場合(ICUを犠牲にすることなく...)、それはプラスになります。
c - fork() を実行するときに一部のメモリ ページでコピー オン ライト (COW) を無効にする
親プロセスが子プロセスを fork するとき (Linux で)、最初に親プロセスのメモリ ページの一部を子プロセスのアドレス空間にコピーしたい。つまり、コピーオンを待つ必要がない。書き込み (COW)。これをサポートするメカニズムはありますか?ありがとう:-)
perl - コピー オン ライトとしてフラグが付けられたすべてのメモリは、1 つのデータに 1 回変更を加えるとコピーされますか?
私の質問は、おそらく言葉遣いが不十分なものであり、メモリ管理に関する私の素人的な理解に由来しています。
私の懸念は次のとおりです。何回もフォークする Perl スクリプトがあります。perldoc の fork ページからわかるように、copy-on-write が実装されています。次に、それぞれの子が を呼び出しsystem()
、再度 fork して、外部プログラムを呼び出します。外部プログラムからのデータは子プログラムに読み戻され、保存可能なファイルとしてダンプされます。すべての子プログラムが終了すると、親プログラムによって取得および処理されます。
私が懸念しているのは、この状況のボラティリティの認識です。私が考えている最悪のシナリオを考えてみましょう。それぞれの子について、新しいデータが到着するとすぐに、コピー オン ライト メモリ全体がコピーされます。この場合、いくつかのフォークを作成した後、すぐにメモリの問題が発生します。
しかし、代わりに、コピー オン ライトは、必要なデータを含むメモリの最小のチャンクのみをコピーするのでしょうか? では、このメモリの量は何ですか? サイズはどのように設定されていますか?
私が尋ねていることの詳細が言語に依存しているのか、それとも下位レベルのプロセスに依存しているのかはわかりません。
python - Python でのオブジェクトのロールバック、コピー オン ライト、バージョン管理されたプロキシなど
前提: Python object が与えられた場合obj
、それをランダムな関数に渡したいと思います。関数が完了したら、obj
元の状態にリセットするオプションが必要です。obj
さらに、他のコードが元の状態にアクセスする可能性があるため、実際の変更を行うことはできません。
最適なソリューションは、大規模なobj
ものがわずかに変更された一般的なケースでは迅速に行われる必要があります。obj
をロールバックする必要があるまれなケースのパフォーマンスはそれほど重要ではありません。
これらの要件は、単純にオブジェクトをコピーするというブルート フォース ソリューションとは直交しています。一般的なケースでは途方もなく遅く、まれなロールバックでは非常に高速です。
通常、このソリューションでは、オブジェクトを処理するコードがオブジェクトを通常のオブジェクトとして処理できるようにする必要があります。これには、カスタム クラスを含むあらゆる種類の属性の割り当てが含まれます。明らかに、ソリューションではオブジェクト ツリー全体を考慮する必要があります。いくつかの譲歩が必要な場合があります。これまでのソリューションで検討した制限の例には、非基本型がすべて特別な基本クラスから継承することを要求すること、タプルとカスタム dict クラスと引き換えに dict とリストを許可しないことが含まれます。大アルカナは許容される場合があります。
私はこれにしばらく取り組んできましたが、経験豊富な Python ウィザードがどのようなアイデアや提案を持っているかを知りたいと思っています。
編集:フレッドの答えにより、要件が欠落していることに気付きました:
obj
元の状態も価値があるため、元に変更を加えることはできません。
c++ - std::string コピー オン ライト実装のスレッド セーフ
重複の可能性:
C++: マルチスレッド プログラムの
std::string std::string は gcc 4.3 で安全ですか?
皆さんこんにちは、
オブジェクトへの参照をスレッド プロシージャに渡し、後でそのオブジェクトを変更するとします。ここではデータ競合があるため、それを回避するには、オブジェクトを値で渡す方がよいでしょう。今は安全に見えますが、本当に安全ですか?オブジェクトのタイプがstd::string
. std::string
コピー オン ライト セマンティクスを実装するコンパイラがあるため、実際のデータはコピーされず、両方が同じデータを参照します。オブジェクトの 1 つで修飾子関数が呼び出されると、実際のコピーが行われます。既存の C++ 標準ではこのような実装が許可されていますが、既存の標準ではマルチスレッドについては何も述べられていないため、この実装はスレッド セーフではありません。そうですか?
この種のソリューションについてどう思いますか?
std::string x = "blablabla; std::strinc copy_of_x = x.c_str();
ありがとう。
java - CopyOnWriteArrayList から要素を削除する
イテレータを使用して CopyOnWriteArrayList から要素を削除しようとすると、例外が発生します。文書化されていることに気づきました
イテレータ自体に対する要素変更操作 (削除、設定、および追加) はサポートされていません。これらのメソッドは UnsupportedOperationException をスローします。
( http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.htmlから)
さて、驚くべきことに、foreach で反復して remove() 関数を使用できます。しかし、その後、有名なバグが発生します。for ループを使用してリストから項目を削除しようとすると、削除された要素の次の要素がスキップされます。提案はありますか?
process - アドレス空間の共有とページ テーブル エントリの複製
以前
copy on write (COW)
、親プロセスと子プロセスが同じアドレス空間を共有しているというのは、同じコード セグメント、データ セグメント、ヒープ、スタックを共有しているということですよね?親プロセスと子プロセスが COW の前に同じアドレス空間を共有している場合、どういう
the page table entries are copied from parent process to child process
意味ですか?ページ テーブル エントリを複製することは、アドレス空間を複製することを意味しますか?