問題タブ [virtual-memory]
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.
c - 専門家 - GCC および ld リンカー: .data セクションに含まれる変数の再初期化?
C プログラムでは、テスト目的でプログラムを開始するときに、すべてのグローバル変数を再初期化する必要があります。
GCCライブラリで行われるロードメモリアドレス、LMAからVMA(ランタイムアドレス)へのデータコピーを再初期化機能で再現したい。たとえば、foo 変数がグローバルとして宣言され、初期化されているとします。そして、再初期化関数が re_init() の場合:
次に、出力として持ちたい:
これを行う正しい方法は、デフォルトのリンカ ファイルと、初期値を RAM にコピーするスタートアップ コードを使用することだと思います。では、GCC (cygwin) では、これを達成するにはどうすればよいでしょうか?
編集: このページはより正確に表示されているようです: http://sources.redhat.com/binutils/docs-2.12/ld.info/Output-Section-LMA.html#Output%20Section%20LMA
c++ - C++ アプリはメモリを超えていますが、仮想メモリを使用していません
コードの一部で「new」でメモリを割り当て、「delete」でメモリを解放するアプリケーションがあります。問題は、システムのメモリ制限 (2GB としましょう) を超えるたびに、Windows がプロセスに Kill シグナルを送信することです。スワップ領域(Windowsでは仮想メモリと呼ばれていると思います)を使用する必要があるため、通常ではないと思いますよね?私のアプリケーションは C++/Visual Studio で書かれています。
windows - カーネルメモリにはWindowsOSに何が含まれていますか?
広く知られているように、32ビットのWindows OSで実行されているプログラムでは、2GBの仮想メモリしか使用できません。また、他の2GBはカーネルスペースとして予約されていることが知られています。しかし、実際にはそのカーネル空間には何がありますか?
カーネル自体に必要な予約は理解できましたが、プロセスのVASにカーネルスペースがあるのはなぜですか?ありがとう。
linux-kernel - Mel Gorman の「Understanding the Linux Virtual Memory Manager」は古すぎますか?
Linux の仮想メモリ マネージャーをより深く理解しようとしています。Mel Gorman によって書かれた "Understanding the Linux Virtual Memory Manager[1]" という本を見つけた場合、かなり精巧に見えます。残念ながら、これは 2.4 カーネル シリーズに基づいているため、古いものです。
誰か本を読んだことがありますか?それはまだ関係がありますか?代替案?
memory-management - 12 ビットのオフセットを持つ 16 ビットのアドレスで 4KB のページ サイズになるのはなぜですか?
「Modern Operating System」という本を読んでいます。そして、「ページサイズ」について混乱しています。
本の中で、著者は次のように述べています。
受信した 16 ビットの仮想アドレスは、4 ビットのページ番号と 12 ビットのオフセットに分割されます。ページ番号に 4 ビットを使用すると、16 ページを持つことができ、オフセットに 12 ビットを使用すると、ページ内の 4096バイトすべてをアドレス指定できます。
なぜ 4096 バイトなのですか? 12 ビットで、ページ内の4096エントリをアドレス指定できます。ただし、1 エントリはアドレスです (この場合、アドレス サイズ = 16 ビット)。したがって、4096(エントリ) * 16(ビット) = 4096(エントリ) * 2(バイト) = 8KB をアドレス指定できると思いますが、なぜ本は 4096 (バイト) をアドレス指定できると言っているのですか?
前もって感謝します!:)
c++ - キャッシュにページファイルを使用していますか?
通常はメインメモリに収まらない大量のデータを処理する必要があります。このデータにアクセスする方法は局所性が高いため、データの一部をメモリにキャッシュすることは良いオプションのように見えます。巨大な配列をmalloc()するだけで、オペレーティングシステムに、ページアウトするビットと保持するビットを認識させることは可能ですか?
c# - メモリ管理 - ラージ オブジェクトをディスクに書き込む方法とタイミング
大きなメモリ負荷 (> 5 GB) の可能性があるアプリケーションに取り組んでいますが、顧客の展開環境のために 32 ビットおよび .NET 2 ベースのデスクトップで実行する必要があります。これまでの私の解決策は、これらの大量のオブジェクトに対してアプリ全体のデータ ストアを使用することでした。オブジェクトがストアに割り当てられると、ストアはアプリによる合計メモリ使用量をチェックし、制限に近づいている場合はそれをチェックします。ストア内の古いオブジェクトの一部をユーザーの一時フォルダーにシリアル化し、必要に応じてそれらをメモリに取得し始めます。アプリ内の他のオブジェクトがメモリを使用し始めた場合、ストアには空き容量を確保するためのプロンプトが表示されないため、これは明らかに信頼できないことが証明されています。インメモリ データ オブジェクトを保持するためにウィーク ポインターを使用する方法を確認しました。これらのオブジェクトは、解放時にディスクにシリアル化されます。
これを処理するために使用すべき有用なパターン/パラダイムはありますか? 私は広範囲にグーグルで検索しましたが、まだ有用なものは見つかりませんでした.
memory - 仮想メモリのページテーブルサイズを決定する
38ビットの仮想バイトアドレス、1KBのページ、512MBの物理メモリを備えた仮想メモリシステムについて考えてみます。有効、保護、ダーティ、および使用ビットが合計4ビットであり、すべての仮想ページが使用されていると仮定した場合、このマシンの各プロセスのページテーブルの合計サイズはどれくらいですか?(ディスクアドレスがページテーブルに保存されていないと仮定します。)
linux-kernel - カーネルにマッピングされたフォークとユーザースペースメモリの相互作用
呼び出しプロセスからページをマップするためにget_user_pages
(または)を使用するLinuxドライバーについて考えてみます。get_page
次に、ページの物理アドレスがハードウェアデバイスに渡されます。当事者が通信を終了することを決定するまで、プロセスとデバイスの両方がページの読み取りと書き込みを行うことができます。特に、呼び出し元のシステムコールがget_user_pages
戻った後も、通信はページを使用し続ける場合があります。システムコールは、事実上、プロセスとハードウェアデバイスの間に共有メモリゾーンを設定しています。
プロセスが呼び出した場合に何が起こるかについて心配していますfork
(別のスレッドからのものである可能性があり、呼び出しを行うシステムコールget_user_pages
の進行中またはそれ以降に発生する可能性があります)。特に、親がフォークの後に共有メモリ領域に書き込む場合、基になる物理アドレス(おそらくコピーオンライトのために変更された)について何を知っていますか?理解したい:
- 潜在的に誤動作するプロセスから防御するためにカーネルが行う必要があること(セキュリティホールを作成したくない!)。
ドライバの機能が正しく機能するためにプロセスが従う必要のある制限(つまり、物理メモリが親プロセスの同じアドレスにマップされたままになる)。
- 理想的には、子プロセスがドライバーをまったく使用しない(おそらく
exec
ほとんどすぐに呼び出される)一般的なケースを機能させたいと思います。 - 理想的には、スタック割り当てバッファをドライバに渡す既存のコードがあるため、メモリを割り当てるときに親プロセスが特別な手順を実行する必要はありません。
- 私はを知っ
madvise
てMADV_DONTFORK
います。子プロセスのスペースからメモリを消してもかまいませんが、スタックに割り当てられたバッファには適用できません。 - 「ドライバーとの接続がアクティブな間はフォークを使用しないでください」というのは煩わしいことですが、ポイント1が満たされれば、最後の手段として受け入れられます。
- 理想的には、子プロセスがドライバーをまったく使用しない(おそらく
ドキュメントやソースコードを紹介したいと思います。特にLinuxデバイスドライバーを調べましたが、この問題が解決されていませんでした。カーネルソースの関連部分だけに適用されるRTFSは、少し圧倒されます。
カーネルバージョンは完全には修正されていませんが、最近のものです(たとえば≥2.6.26)。重要な場合は、Armプラットフォーム(これまではシングルプロセッサですが、マルチコアはもうすぐです)のみを対象としています。
windows - 関数のパフォーマンスを測定するときにキャッシュを空にする方法
CPU キャッシュは、いくつかのコードのパフォーマンスをテストするものを常に中断します。
コードのパフォーマンスを測定するとき、キャッシュの影響をどのように取り除きますか。
Windowsでこれを行うための機能または方法をいくつか見つけています。
素敵なヒントを教えてください。ありがとう。