問題タブ [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 - fork() のコピーオンライトは複数のフォークをどのように処理しますか?
ウィキペディアによると(間違っている可能性があります)
fork() システム コールが発行されると、親プロセスに対応するすべてのページのコピーが作成され、OS によって子プロセス用の別のメモリ ロケーションにロードされます。ただし、これは場合によっては必要ありません。子が「exec」システム コール (C プログラム内から実行可能ファイルを実行するために使用される) を実行する場合、または fork() の直後に終了する場合を考えてみましょう。親プロセスのコマンドを実行するためだけに子プロセスが必要な場合、親プロセスのページをコピーする必要はありません。これは、exec がそれを呼び出したプロセスのアドレス空間を実行するコマンドに置き換えるためです。
このような場合、コピーオンライト (COW) と呼ばれる手法が使用されます。この手法では、フォークが発生したときに、親プロセスのページは子プロセスにコピーされません。代わりに、ページは子プロセスと親プロセスの間で共有されます。プロセス (親または子) がページを変更するたびに、変更を実行したそのプロセス (親または子) に対して、その特定のページだけの別のコピーが作成されます。このプロセスでは、今後のすべての参照で共有ページではなく、新しくコピーされたページが使用されます。もう一方のプロセス (共有ページを変更しなかったプロセス) は、ページの元のコピー (現在は共有されていません) を引き続き使用します。この手法は、何らかのプロセスがページに書き込むときにページがコピーされるため、コピーオンライトと呼ばれます。
いずれかのプロセスがページに書き込もうとしたときのようです。ページの新しいコピーが割り当てられ、ページ フォールトを生成したプロセスに割り当てられます。元のページは後で書き込み可能としてマークされます。
私の質問は次のとおりです。プロセスのいずれかが共有ページへの書き込みを試みる前に、フォークが複数回呼び出された場合はどうなりますか?
java - CopyOnWriteArraySetの変更中にUnsupportedOperationExceptionが発生しました
モーリス・ナフタリン、フィリップ・ワドラーによるJava Generics and Collectionの本を勉強して、私はCopyOnWriteArraySetセクションで中断し、それを私の心に固執させるために勉強しながら練習しようとしました、しかし私は問題に直面しました、私の些細なコードを明らかにさせてください:
私の脳がこれまでに理解したことは、変更が発生するたびにCopyOnWriteArraySet
、新しい変更で作成された新しいバッキングアレイ、問題は、バッキングアレイまたはフロントアレイでCopyOnWriteArraySet
通過iterator()
が行われるかどうかです。フロントアレイと言うのが便利な場合は、私には合理的に聞こえますがCopyOnWriteArraySet.remove()
、フロントアレイでCopyOnWriteArraySet.iterator().remove()
動作し、バッキングアレイで動作します。
これまでに入れられたフラッシュはありがたいです、ありがとうございました。
php - (string) は文字列を「ハードコピー」しますか?
PHP はコピー オン モディフィケーション システムを使用します。
$a = (string) $a;
($a は既に文字列です) 何かを変更してコピーしますか?
特に、これは私の問題です:
パラメータ 1 はmixed
/ 非文字列を渡して文字列に変換できるようにしたいです。
しかし、これらの文字列が非常に大きい場合があります。したがって、すでに文字列であるパラメーターのコピーを省略したいと思います。
version を使用できますFoo
か、またはversion を使用する必要がありBar
ますか?
php - 参照による受け渡し(変数は変更できるが、変更する必要がない場合)
コピーオンライトは基本的にパフォーマンスを同等にするため、PHPで参照を渡すのは、技術的な理由がある場合にのみ行うことを十分に説明しています。私が理解していることから、それが変更されない場合、オブジェクトをコピーすることはありません。
しかし、関数が変数を変更しても、コードがそれを二度と使用しない/変更された部分を使用しない場合はどうなりますか?オリジナルが変更されているかどうかはコードに関係ありません。はい、PHPオプティマイザーがこの状況を考慮に入れている可能性はありますが、私はそれを信じる理由はありません。
また、単一の参照を渡すことは、巨大な配列やオブジェクトをコピーするよりもはるかに高速になるはずです。
それで、これは参照で渡すのに良い状況ですか?
たとえば、DomCrawlerを渡すとします(この特定の場合に暗黙的に参照によって渡されることを除いて、大きな[html形式の]文字列を超えない)。少しクロールして、いくつかの情報を抽出します。多くの場合、クローラーを再び使用しないため、クローラーを元の位置にリセットする必要はありません。また、後者でDOMCrawlerを使用していると想像してください。そこから、URIを読み取ります。関数はこれを変更しなかったので、参照または値による受け渡しは依然として同等ですが、参照による受け渡しは大幅に最適ではありませんか?この状況は、オプティマイザーが見つけるのは非常に難しいと思います。
c++ - ポインタ取得によってchar*とcharconst*を装飾する:良い習慣ですか?
std::string
こんにちは私は、クライアントによって提供されたバッファで動作できる機能を備えた文字列クラス(のような)を実行するという私のアイデアについて一般の人々に投票したいと思いました。
あなたが予見する危険は何ですか?古典的な匂いですか?etcaetera
私はそう意味します:
だから私は2つの戦略を予見します:acquire_RW
そしてacquire_RO
それは文字の変更を許可するext
かどうかです。また、RO
非constメソッドのRW
場合、およびバッファを拡張する必要があるメソッドの場合。現時点でのみ割り当ててコピーします。
ある意味で、my::string
タイプはタイプのデコレータになりchar*
ます。
もちろん、デコレータがクライアントの要件として残される前に、外部バッファを解放しないように注意してください。
あなたの懸念を共有してくれてありがとう
perl - Perl の終了時に読み取り専用の forked() RAM 割り当てを避ける
Perl では、巨大な読み取り専用データ構造を一度生成すると、fork()
.
これは、フォーク時に RSS ページで COW を利用するためです。これは非常にうまく機能しますが、子プロセスが終了すると、終了する直前に itelf からすべての RAM が割り当てられます。
この無駄な割り当てを回避する方法はありますか?
この問題を示すサンプル Perl コードを次に示します。
サンプルvmstat
出力では、最初に 100MiB のみを割り当て、次に 1 回目のスリープ後に短時間全体を割り当て、その後すべてを解放することがわかります。
注: Perl のバージョン固有の問題ではないようです。5.8.8、5.10.1、および 5.14.2 をテストしたところ、すべてこの動作を示しました。
アップデート:
@choroba がコメントで尋ねたようにundef
、データ構造も試してみましたが、RAM が割り当てられるとメモリタッチがトリガーされるようです。
最初のスクリプトの最後に次のスニペットを追加できます。
c++ - 共有メモリとコピーオン書き込みまたは右辺値参照と移動セマンティクス?
一般的なコンテナ (Qt のコンテナに見られるものなど) の共有メモリ/コピーオンライト実装は、C++11 の移動セマンティクスと右辺値参照に取って代わられていますか?
一方が失敗し、他方が成功するのはどこですか? それとも代替ではなく補完的なものですか?
c++ - C++ のコピー オン ライト ポインター オブジェクト
この記事http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-on-writeに従って 、C++ でコピー オン ライト ポインターを実装する方法を試してみました。問題は、それがうまくいかないことです。
オブジェクトの核心は、逆参照演算子 (*) をオーバーロードして、非 const 参照を返す必要がある場合にバックグラウンド コピーを行うことです。
残念ながら、これまでに実行されたのは 2 番目のバージョンだけのようです。指し示したオブジェクトをCアウトすると、次のようなことをしてもコピーが作成されます
detach()
関数を実行させます 。
宣伝どおりに機能しない理由について何か考えはありますか?
performance - PAGE_WRITECOPY ウィンドウの内部メモリのパフォーマンス
アプリケーションに元に戻す/やり直し機能を実装する必要があります。この機能は、プロジェクト ファイルを読み取り、プロジェクトのコンテンツを変更する一連の個別のトランザクションを作成します。プロジェクトのサイズは数百 MB になる場合があります。
私の考えは、コピー オン ライト (PAGE_WRITECOPY) メモリ メカニズムに基づいて、取り消しとやり直しを実装することです。トランザクションの終了後、アプリケーションは変更されたページと変更されていないページの両方にアクセスし、それらを比較し、変更されたレコードを識別し、元のレコードの状態を専用の取り消しスタックに保存し、作成された変更されていないページを解放し、書き込みを復元できると想定しています。 -変更されたページのコピー保護。2 つの質問があります。
元の (変更されていない) ページのアドレスを見つける方法と場所。
そのような実装の待望のパフォーマンス?. プロジェクトのレコードの中間サイズは cira 100 バイトです。トランザクションが 100 以上の 4K 物理ページの変更を伴う可能性がある 3000 レコードを変更した場合。ライト オン コピー メモリは、各ステップでの数百の物理ページの定期的な変更をサポートするのに十分なパフォーマンスを備えていますか?