問題タブ [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.

0 投票する
4 に答える
1115 参照

memory - メモリページが読み取り専用としてマークされているかどうかをどのように判断できますか?

コピーオンライトセマンティクスを使用してプロセス間でメモリを共有する場合、メモリページが書き込み可能かどうか、または読み取り専用としてマークされているかどうかをどのようにテストできますか?これは、特定のアセンブラコードを呼び出すか、メモリ内の特定の場所を読み取るか、OSのAPIを介して実行できますか?

0 投票する
9 に答える
122976 参照

optimization - コピーオンライトとは?

コピー オン ライトとは何か、またその用途について知りたいです。この用語は、Sun JDK チュートリアルで何度か言及されています。

0 投票する
5 に答える
5502 参照

c++ - VC++ 文字列が参照カウントされないのはなぜですか?

STL 標準では、 from std::string を参照カウントする必要はありません。しかし実際には、ほとんどの C++ 実装は参照カウントされたコピー オン ライト文字列を提供し、文字列をプリミティブ型として値で渡すことができます。また、これらの実装 (少なくとも g++) は、アトミック操作を使用して、これらの文字列をロックフリーにし、スレッドセーフにします。

簡単なテストは、コピーオンライトのセマンティクスを示しています。

非定数メンバーが使用された後、2 つのアドレスのみが正確に出力されます。

HP、GCC、Intel コンパイラを使用してこのコードをテストしたところ、同様の結果が得られました。文字列はコピー オン ライト コンテナーとして機能します。

一方、VC++ 2005 では、各文字列が完全にコピーされていることが明確に示されています。

なんで?

私は、VC++6.0 にスレッドセーフではない参照カウントの実装があり、ランダムなプログラム クラッシュを引き起こすバグがあったことを知っています。これが理由ですか?彼らは、それが一般的な慣行であっても、もはや参照カウントを使用することを恐れているだけですか? 問題を修正することよりも、参照カウントをまったく使用しないことを好むのですか?

ありがとう

0 投票する
3 に答える
2031 参照

python - コピーオンライトを備えた純粋に機能的なデータ構造?

機能的なデータ構造 (構造を共有できる複数のバージョンのデータ) の利点を生かしながら、命令型のスタイルで変更できるようにしたい。

私が考えていること (および考えられる用途): ゲーム履歴全体が保存される RPG ゲーム (たとえば、時間をさかのぼることができるようにするため)。コピー オン ライトを使用して、ゲームの状態を保持する構造を単純に複製し、新しいターンを導入することでそれを変更することができました。毎回すべてをコピーしなければならないというペナルティ。


foo地図だとしましょう。

fooの構造 (ツリーなど) はまだコピーされていません。ただし、bar今後はコピーとして扱われ、変更が「foo」に伝播することは許可されません。

  • の変更されたコピーである新しいオブジェクトが作成されますbaz
  • barは新しいマップに置き換えられ、newが保持されbazます (おそらくfooの構造の一部が保持されます)。
  • foo影響を受けません。

しかし、もしそうなら...

...baz最新バージョンがあるため、変更するだけです。bar 変更する必要はありません。

fooこれにはすべて、とに関するいくつかのバージョン情報を保持し、barでそれを増やし、何らかの形で (プロキシ オブジェクトにすることで?) にfoo.clone()渡す必要があります。baz

また、複製された構造の一部は「履歴の一部」になり、それ以上変更することはできず、実行時に強制することができます。


これは JavaScript のプロトタイプに少し似ていますが、変更が上方に伝播できるため、より似ています。バージョン管理システムのようなものになると思います。

  • これは行われましたか、またどの程度行われましたか?
  • これは良い考えですか?そうでない場合、保存する方法はありますか?
  • どのように実装できますか?Python のような高水準の GC 言語の上に構築することを考えていました。
0 投票する
5 に答える
23402 参照

c++ - コピーオンライトを実装するには?

カスタム C++ 文字列クラスにコピー オン ライトを実装したいのですが、どうすれば...

いくつかのオプションを実装しようとしましたが、どれも非常に非効率的でした。

君たちありがとう :-)

0 投票する
3 に答える
2111 参照

c++ - boost::copy_on_write_ptr がないのはなぜですか?

この素敵なコピー オン ライト ポインターの実装を見たところです。それは非常に一般的で便利に見えるので、私の質問は次のとおりです。そのようなクラスは C++ ツールキット (boost、loki など) のいずれかに含まれていますか? そうでない場合、それは本当に便利なイディオムであり、明らかに一般的な実装が実行可能であるように見えるため、その理由を本当に知りたいです(私がリンクしたもののように)。

0 投票する
2 に答える
1043 参照

c++ - Qt の文書化されていないメソッド setSharable

QList、、QQueueのようQHashなすべてのデータオブジェクトに存在するように見えるメソッドについてつまずいた

これまでに調べたところ、ソースコードを見ることができます。

qlist.h 内( 117 行目)。

QListしかし、それは、QQueueQHash...にどのような影響を与えるのでしょうか? そして、それは何らかの形でスレッド化に関連していますか (これは合理的に聞こえます)?

回答ありがとうございます。実際の知識がある場合にのみ回答してください。

0 投票する
3 に答える
2473 参照

linux - ブロックがスパースファイルに存在するかどうかを確認するにはどうすればよいですか(単純なコピーオンライトの場合)?

Linuxのreiserfs/ext3で、スパースブロックサイズを取得し、データがスパースファイルの指定されたオフセットに存在するかどうかを確認するにはどうすればよいですか?

これを使用して、FUSEを使用した単純なコピーオンライトブロックデバイスを実装したいと思います。

または、ビットマップを別のファイルに保存する方がよいでしょうか。

0 投票する
2 に答える
2875 参照

linux-kernel - 4GBを超える(スパース)ファイルでENOMEMを使用するとCOW mmapが失敗するのはなぜですか?

これは、2.6.26-2-amd64 Linuxカーネルで、コピーオンライトセマンティクス(PROT_READ | PROT_WRITEおよびMAP_PRIVATE)を使用して5GBファイルをmmapしようとしたときに発生します。4GB未満のファイルのマッピング、またはPROT_READのみを使用したファイルは正常に機能します。この質問で報告されているように、これはソフトリソース制限の問題ではありません。仮想制限サイズは無制限です。

これが問題を再現するコードです(実際のコードはBoost.Interprocessの一部です)。

そしてここに何が起こるかです:

これは、nosによって尋ねられた、関連するstrace(新しくコンパイルされた4.5.20)の出力です。

0 投票する
5 に答える
2097 参照

.net - ToStringを呼び出した後、StringBuilderは不変になりますか?

.NET の初期の頃から、StringBuilder で ToString を呼び出すと、StringBuilder が使用する内部 char バッファーを使用して (返される) 新しい文字列オブジェクトを提供していたことをはっきりと覚えています。このように、StringBuilder を使用して巨大な文字列を構築した場合、ToString を呼び出してコピーする必要はありません。

その際、StringBuilder はバッファーへの追加の変更を防止する必要がありました。これは、バッファーが不変の文字列によって使用されるようになったためです。その結果、StringBuilder は「copy-on-change」に切り替わり、変更を試みると最初に新しいバッファーが作成され、古いバッファーの内容がコピーされてから変更されます。

StringBuilder を使用して文字列を作成し、通常の文字列に変換して破棄するという前提があったと思います。私には合理的な仮定のように思えます。

これが問題です。ドキュメントでこれについての言及が見つかりません。しかし、それが文書化されたことがあるかどうかはわかりません。

そこで、Reflector (.NET 4.0) を使用して ToString の実装を調べたところ、バッファを共有するだけでなく、実際に文字列をコピーしているように思えます。

さて、前に述べたように、.NET. 私はこの本で の言及さえ見つけました。

私の質問は、この動作は削除されましたか? もしそうなら、誰かが理由を知っていますか?それは私にとって完全に理にかなっていました...