問題タブ [page-fault]
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# - C#.NETアプリによって生成される膨大な数のソフトページフォールトを回避するにはどうすればよいですか?
私はC#.NET WinFormsアプリケーションのプロファイリングを行っていますが、それが何百万ものソフトページフォールトを生成し、作業中に増加し続けることに気づきました...
.NETでは、アプリケーションが生成するページフォールトの数は通常多いことを知っていますが、数百万のページフォールトが多すぎるようです...アプリケーションがGCで競合状態を引き起こしたようですが、それは可能ですか?
この状況につながる可能性のある、不適切に設計された既知のコードはありますか?コードにない場合、ページフォールトの数を減らすことができる.NETフレームワークのいくつかの隠された設定がありますか?
ますます多くのソフトページフォールトの生成を回避できますか?
porting - newlib 関数でのページ フォールト
私は非常に小さなカーネルに newlib を移植してきましたが、困惑しています。システム コールを参照する関数を含めると、私のプログラムは実行時にページ フォールトを起こします。のように、システム コールを参照しない関数を呼び出してもrand()
、何も問題はありません。
printf()
注: 含めるとは、 or などの関数が、fopen()
を介して呼び出されなくても、プログラム内のどこかにある限り意味しmain()
ます。
私はかなり長い間この問題を抱えていましたが、何が原因なのかわかりません:
- 私は何度もnewlibを再構築しました
- プログラム ヘッダーの代わりにセクション ヘッダーからコードをロードするように ELF ローダーを変更しました。
- newlib/libgloss を個別にビルドしようとしました (失敗しました)
GROUP
、gcc、およびldを使用してldスクリプトを介してライブラリ(libc、libnosys)をリンクしました
他にどのような情報を含めるべきかはよくわかりませんが、できる限り含めていただければ幸いです。
編集:確認するために、発生しているページ フォールトは、失敗した関数のアドレスではありません。それらはプログラムの他の場所にあります。たとえば、fopen()
0x08048170 にある を呼び出すと、0xA00A316C でページ フォールトが発生します。
編集 2: ELF をロードするための関連コード:
編集 3: などのシステム コールを呼び出してから2 回以上呼び出すと、不明なオペコード割り込みが発生することにwrite()
気付きました。printf()
奇数。
paging - ページフォールト後の命令の再開
私はCでオペレーティングシステムを開発していて、ページングに苦労しています。メモリを割り当て、物理ページと仮想ページの割り当てを処理する低レベルのメモリ割り当て出力を出力することで、カーネルヒープをループでテストしています。
の場合PDE 0
、すべてがページに対して正常に機能します0-1023
が、割り当てがに移動するとすぐにPDE 1
、現在のフラグが設定された状態でページフォールトが発生しrw
、別の物理アドレスから割り当てを開始するとフラグも発生することがあります。
障害のあるアドレスを取得して、それが属するページにcr2
マップし直してから、アドレスを3に設定する必要がありますか?PDE
その後、命令を再開する必要がありますが、どうすればよいですか?助言がありますか?
memory-management - 書き込み時のコピーに SIGSEGV シグナルがないのはなぜですか?
ウィキペディアのコピー オン ライトの記事によると、コピー オン ライトは通常、ページへの読み取り専用アクセスを与えることで実装されるため、ページが書き込まれると、ページ フォールト トラップ ハンドラーが一意の物理メモリ ページをマップできます。私の質問は、そのようなページ フォールトが発生したときに、ユーザー レベルのアプリケーションが SIGSEGV シグナルを受信しないのはなぜですか? 結局、SIGSEGV に関するウィキペディアの記事によると、SIGSEGV はプロセスが無効なメモリ参照またはセグメンテーション違反を行ったときにプロセスに送信されるシグナルです。したがって、この場合、それはコピーオンライトのケースであり、なぜSIGSEGVがプロセスに送信されないのですか。
linux-kernel - Linux上のプログラムで発生したページフォールトの数を測定する
私は、ページフォールトの数を最小限に抑えようとするLinuxスケジューラーでプロジェクトを行っています。
アルゴリズムの実装が完了したので、効果を測定する必要があります。Linuxが、実行プロセス全体で発生したページフォールトの記録的な数に対応するツールを提供しているかどうか疑問に思っていますか?
基本的には
そのようなツールはありますか?自分で書くことを決める前に確認したいのですが、大変な作業になります...
linux - Linuxカーネルのメジャーページフォールトハンドラー
メジャーページフォールトハンドラーはどこにあるのでしょうか。
カーネルのページフォールトを最小限に抑えるアルゴリズムを作成しました。したがって、ページフォールトが発生するたびに何かを記録する必要があります。現在、arch / x86 / mm / fault_32.cのdo_page_fault(...)で発生したページフォールトを記録しています
ただし、マイナーページフォールトとメジャーページフォールトの両方がdo_page_fault(...)に移動するようです...そしてマイナーページフォールトは常に発生し、アルゴリズムを台無しにします。
メジャーなpage_faultが発生したときにのみ記録したいと思います。それで、カーネルハッカー、コードをどこに置くべきか教えていただけませんか?どのファイルとどの機能。
ちなみに、私はカーネル2.6.24をハッキングしています
どうもありがとうございます!アルフレッド
mips - 仮想メモリ、LRU、およびページ フォールト - 宿題
私は次のプログラムに取り組んでいますが、情報が不足しているように感じます.a)とb)はちょっとしたトリックです:
ループは、4KB ページを使用する仮想メモリ システム上のプログラムの一部として実行されます。必要に応じてメモリ内で置換するページを選択するために LRU 置換アルゴリズムが使用されると仮定します。「Start」というラベルの付いた命令はページ境界で始まり、ループの本体には 4601 組のシフト命令 (sll と srl) が含まれています。
a) メモリに 8 つの 4KB フレームが含まれている場合、ループの実行中にページ フォールトはいくつ発生しますか?
b) メモリに 9 つの 4KB フレームが含まれている場合、ループの実行中にページ フォールトはいくつ発生しますか?
a) と b) はどちらも 5 ページ フォールトではないでしょうか? ループするたびに 4602 の命令があり、MIPS 命令は 4B、ページ サイズは 4KB です。4KB/4B = 1 ページあたり 1024 命令なので、最初のループは次のようになります。
命令 0 - 1023 フレーム 0 ページフォルト あり
指示 1024 - 2047 フレーム 1 ページ フォルトあり
指示 2048 - 3071 フレーム 2 ページ フォルトあり
指示 3072 - 4096 フレーム 3 ページ フォルトあり
指示 4096 - 4602 フレーム 4 ページ フォルトあり
そのため、2 回目の反復でループに戻ったとき、ページはまだ LRU ポリシーによって置き換えられていないため、それらを再度参照できます。32 回のループ反復で 8 フレームか 9 フレームかによって、なぜこれが変わるのでしょうか?
driver - WorkItem (IoQueueWorkItem) がエラー「PAGE_FAULT_IN_NONPAGED_AREA」で BSOD を返す
Windows7 64ビットを使用しています。WorkItem (IoQueueWorkItem) がエラー「PAGE_FAULT_IN_NONPAGED_AREA」で BSOD を返す 割り当てられたメモリも解放しています...何が問題なのかわかりません :(
これは私のドライバーコードです:
これは私のテストコードです:
このコードはラップトップをクラッシュさせます...どこが間違っているのかわかりません...メモリも解放しています。コメントすると、IoQueueWorkItem がなくても問題ありません。
////////////////// EDIT 1
解決しました!ここの DeviceObject が原因で、work->pio = IoAllocateWorkItem(pDeviceObject);
これpDeviceObject
は私のドライバーインスタンスではありません...したがって、失敗していました!
c - mmap() のコピーオンライトとオンデマンドでゼロ埋めを無効にする方法
mmap() を使用して cp(ファイル コピー) コマンドを実装しています。そのために、ソースファイルをMAP_PRIVATE(読みたいだけ)モードでマップし、宛先ファイルをMAP_SHAREDモードでマップしました(宛先ファイルの変更されたコンテンツを書き戻す必要があるため)。
これを行っている間、2 つの理由で発生する多くのマイナー ページ フォールトによるパフォーマンスの低下を観察しました。1) ソース ファイルの mmap(MAP_PRIVATE) を呼び出している間、オンデマンドでゼロ フィルが行われます。2) 宛先ファイルの mmap(MAP_SHARED) を呼び出しながら書き込み時にコピーします。
Zero-fill-on-demand と Copy-on-write を無効にする方法はありますか?
ありがとう、ハリッシュ
linux - Linux、最初の読み取りまたは最初の書き込みでページフォールトをゼロにしますか?
私の質問はLinux固有であり、カーネル、仮想メモリ、mmap、ページ障害について理解する必要があります。私は大きな静的配列を持つCプログラムを持っています。これはbssセクション(メモリ、ゼロに初期化されます)に入ります。プログラムが起動すると、このメモリは物理的に割り当てられず、仮想メモリのみが存在し、仮想メモリのすべてのページが特別なゼロページ(すべてゼロのページ)にマップされます。アプリケーションがこのページにアクセスすると、ページフォールトが生成され、物理ページが割り当てられます。
問題は、そのようなページフォールトは、bssセクションからのページへの最初の読み取りアクセスまたは最初の書き込みアクセスで生成されますか?