問題タブ [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 投票する
3 に答える
1336 参照

linux - Linux で mprotect

PROT_NONEをmprotect持つセグメントであり、SIGSEGVによって処理される書き込みが原因で発生したsigaction場合、sa_sigactionを使用して障害が発生したアドレスを見つけることができsiginfo_tますsi_addr。しかし、書き込まれようとしたデータとデータの長さを見つける方法はありますか?

プロジェクトでコピーオンライトメカニズムを試しているため、これを実行しようとしています。

0 投票する
1 に答える
842 参照

kernel - コピーオンライトを無効にして do_fork を呼び出す

新しいシステム コールを追加するオペレーティング システムの割り当てを行っています。「ダムフォーク」と呼ばれるシステム コールは、コピー オン ライト ポリシーを使用せずにプロセスをフォークする必要があります。したがって、基本的にはアドレス空間全体を子プロセスにコピーする必要があります。

システムカーネルをセットアップして再コンパイルすることができました。カスタム システム コールを呼び出すことはできますが、実際にダムフォークを実装して COW 機能を無効にする方法がわかりません。ソース コードの 1 つは、sys_vfork がどのようにdo_forkを呼び出しているかを示しています。Dumbfork は sys_vfork に似ている必要があります。do_fork のパラメータを設定する方法がわかりません。sys_fork の実装方法を真似ようとしたところ、NULL ポインター逆参照エラーが発生しました。誰でもこの問題について教えてもらえますか。

0 投票する
1 に答える
2741 参照

r - R: コピーせずにサブセットを選択

選択したデータのコピーを作成せずに、オブジェクト (データ フレーム、行列、ベクトル) からサブセットを選択する方法はありますか?

私は非常に大きなデータセットを扱っていますが、それらを変更することはありません。ただし、便宜上、操作するデータのサブセットを選択することがよくあります。毎回大規模なサブセットのコピーを作成するのはメモリ効率が非常に悪いですが、通常のインデックス作成とsubset(およびxapply()関数ファミリーの) 両方で、選択したデータのコピーが作成されます。そこで、この問題を克服できる関数またはデータ構造を探しています。

私のニーズに合うかもしれないいくつかの可能なアプローチは、うまくいけばいくつかのRパッケージに実装されています:

  • コピー オン ライトメカニズム。つまり、既存の要素を追加または書き換えるときにのみコピーされるデータ構造。
  • データ構造のインデックス情報のみを再作成する必要があり、その内容を必要としない不変データ構造(長さと同じ char 配列へのポインターを保持する小さなオブジェクトのみを作成することによって、文字列から部分文字列を作成するなど)。
  • xapply()サブセットを作成しない類似体。
0 投票する
1 に答える
839 参照

c++ - fork() とコピー オン ライト メモリ共有をより効率的に使用する

Linux ベースのサーバーを使用してマルチプレイヤー オンライン ゲームを開発しているプログラマーです。私たちは、私たちの世界に「インスタンス化された」アーキテクチャを使用しています。つまり、ワールド エリアに入る各プレイヤーは、そのエリアのコピーを取得して、同じエリアでプレイしている他のすべてのプレイヤーとは関係なく、パーティ メンバーと一緒にプレイできます。

内部的には、インスタンスごとに個別のプロセスを使用します。最初に各インスタンス プロセスが起動し、特定のエリアに必要なリソースのみを読み込み、ランダムな地形を生成してから、プレイヤーからの新しい接続を許可します。インスタンスによって使用されるメモリの量は、通常、リソースとエンティティでランダムに生成されたレベルを含めて約 25 メガでした。

インスタンスのメモリ フットプリントを削減し、スポーン時間を短縮するために、インスタンスが必要とする可能性のあるすべてのリソース (約 150 MB のメモリ) をロードする単一のマスター インスタンスを作成してから、新しいインスタンスが必要な場合は、fork() 関数を使用して新しいインスタンスを生成し、コピー オン ライト メモリ共有を利用して、新しいインスタンスが「一意の」データ セット用のメモリのみを必要とするようにします。各インスタンスの一意のデータを構成するランダムに生成されたレベルとエンティティのフットプリントは、約 3 ~ 4 MB のメモリです。

残念ながら、メモリ共有は私が思うほどうまく機能していません。多くのメモリ ページが非共有になっているようです。

最初は、より多くのデータ セットをプレフォーク インスタンスにロードすると、フォークされた各インスタンスに必要なメモリが減少しますが、最終的には、プレフォークにより多くのアセットをロードすると、フォークされた各インスタンスによって使用されるデータが実際に増加するという変曲点があります。

私たちが得た最良の結果は、フォーク前に約 80 メガバイトのデータ セットをロードし、その後、新しいインスタンス デマンドに残りをロードさせることです。これにより、インスタンスごとに約 7 ~ 10 メガバイトの余分なメモリと、80 メガバイトの固定コストが発生します。確かに良い改善ですが、理論上の最善ではありません。

150 メガのデータセット全体をロードしてからフォークすると、フォークされた各インスタンスはさらに約 50 メガバイトのメモリを使用します! 単に何もしないよりもはるかに悪い。

私の質問は、すべてのデータ セットを prefork インスタンスにロードし、各インスタンスのメモリ フットプリントとして、インスタンスごとに本当に一意のデータの最小セットのみを取得できるようにする方法です。


私はここで何が起こっているのかについて理論を持っており、誰かがこれが事実であることを確認するのを助けることができるかどうか疑問に思っていました.

それはmallocフリーチェーンに関係していると思います。プリフォーク インスタンスの各メモリ ページには、おそらくメモリの空きスポットがいくつか残っています。ランダム レベルの生成中に、たまたまページ内のフリー スポットの 1 つに収まるものが割り当てられた場合、そのページ全体がフォークされたプロセスにコピーされます。

Windows では、代替ヒープを作成し、プロセスで使用される既定のヒープを変更できます。これが可能であれば、問題は解消されます。Linuxでそのようなことを行う方法はありますか? 私の調査では、あなたにはできないことが示されているようです。

もう 1 つの解決策として、既存の malloc フリー チェーンを何らかの方法で破棄し、malloc にオペレーティング システムから新しいメモリを割り当てさせて、後続の呼び出しに使用させることができます。これが簡単にできるかどうか、malloc の実装を調べてみましたが、やや複雑なように思えました。この分野に関するアイデアや、このアプローチをどこから始めるべきかについての提案があれば、ぜひ聞いてみたいと思います。

最後に、ここで何がうまくいかないのかについて他のアイデアを持っている人がいれば、ぜひ聞いてみたい. どうもありがとう!

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

memory-management - 書き込み時のコピーに SIGSEGV シグナルがないのはなぜですか?

ウィキペディアのコピー オン ライトの記事によると、コピー オン ライトは通常、ページへの読み取り専用アクセスを与えることで実装されるため、ページが書き込まれると、ページ フォールト トラップ ハンドラーが一意の物理メモリ ページをマップできます。私の質問は、そのようなページ フォールトが発生したときに、ユーザー レベルのアプリケーションが SIGSEGV シグナルを受信しないのはなぜですか? 結局、SIGSEGV に関するウィキペディアの記事によると、SIGSEGV はプロセスが無効なメモリ参照またはセグメンテーション違反を行ったときにプロセスに送信されるシグナルです。したがって、この場合、それはコピーオンライトのケースであり、なぜSIGSEGVがプロセスに送信されないのですか。

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

php - PHPnullおよびコピーオンライト

2つの変数があり、両方をに等しくしたいとしnullます。(より現実的には、大量のnullsを含む配列について考えていますが、質問には「2つの変数」のシナリオで十分です。)明らかに、これは複数の方法で実行できます。私はこれを行うことができます(方法1):

私の理解では、これの結果は、シンボルテーブルの2つのエントリによって示される1つのzvalがあるということです:'a''b'。しかし、代わりにこれを行うかもしれません(方法2):

素朴なことに、これにより2つの異なるzvalが生成され、それぞれがシンボルテーブルの1つのエントリによってポイントされることが期待されます。

このことから、大きな配列が必要で、配列の多くの要素がである場合は、値を使用して変数を作成し、の要素を書き込むnull方が(zval / memoryの使用に関して)より効率的であるということになりますか? ?を使用して割り当てることによる配列$master_nullnullnull$master_null

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

c - コピーオンライトで共有されなくなったページを見つける

Linux にプロセスがあり、そこからfork()別の同一のプロセスがあるとします。ing の後fork、元のプロセスがメモリへの書き込みを開始すると、Linux のコピー オン ライトメカニズムによって、フォークされたプロセスが使用するものとは異なる一意の物理メモリ ページがプロセスに与えられます。

実行のある時点で、元のプロセスのどのページが書き込み時にコピーされたかを知るにはどうすればよいですか?

SIGSEGV シグナル ハンドラーを使用して、最初からすべてのページへの読み取り専用アクセスを許可したくありません。これは、望ましくないオーバーヘッドを誘発するためです。

0 投票する
1 に答える
798 参照

ruby - Ruby フォークは COW フレンドリーですか? はいの場合、それをテストする方法

そのルビーフォークCOWフレンドリーである場所をいくつか読んだことがあります ここでリンク

しかし、たまたまグーグルで詳細を調べたところ、RubyはCOW(コピーオンライト)をサポートしていないことがわかりました

Rubyが実際にCOW機能をサポートしているかどうかについて、私は実際には少し混乱しています。

また、 REERubiniusにはCOW フレンドリーな GCがあることも認識しており、 REE と Rubinius がCOW機能をサポートしていることも認識しています。

はい、私はそれをテストしたくてたまらないです。RubyがCOW機能をサポートしている場合、RubyでCOWの概念をテストするためのサンプルコードを書く方法を誰かに教えてもらえますか

ありがとう

0 投票する
1 に答える
1511 参照

qt - Qt: QString を例外クラスのメンバーとして使用しても問題ありませんか

QStringメンバーが必要なカスタム例外を開発しています。何かのようなもの:

使用しようとすると:

セグメンテーション違反が発生します。症状は、ここで説明されているものと似ています: Qt QString cloning Segmentation Fault

SIGSEGV は から始まりQBasicAtomicInt::ref、 から来QString::QString(const QString &other)ます。

コピー コンストラクター内で無効な QString をコピーしようとしているように思えます。それへの有効な参照がある限り、QString はそのコンテンツへのポインタを保持することが私の理解です。MyException インスタンスのコピーが作成されている場合、一時的なスタック インスタンスがスコープを離れておらず、コピーが成功するというのは本当ではないでしょうか?

QString メンバーなしで実装MyExceptionすると、すべてがうまく機能します。

0 投票する
1 に答える
2377 参照

c - fork()を使用せずに、fork()のコピーオンライト動作を取得します

私は大きなバッファを持っています:

新しいプロセスをフォークした場合、どちらかが書き込むまで、親のbufとメモリを共有するbufがあります。それでも、カーネルが割り当てる必要があるのは1つの新しい4KiBブロックだけで、残りは引き続き共有されます。

bufのコピーを作成したいのですが、コピーを少し変更するだけです。フォークせずにコピーオンライト動作をしたいのですが。(フォークするときに無料で入手できるように。)

これは可能ですか?