問題タブ [memory-access]

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 投票する
6 に答える
169256 参照

c++ - GDB の「メモリ アクセス」にブレークポイントを設定できますか?

gdb を介してアプリケーションを実行していますが、特定の変数がアクセスまたは変更されるたびにブレークポイントを設定したいと考えています。これを行うための良い方法はありますか?C/C++ で変数を監視して、変数がいつ変更されるかを確認する他の方法にも興味があります。

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

windows - Windowsでの共有メモリアクセス許可

プロセス間通信に共有メモリ---つまり---メモリマップトファイルを使用するWindowsアプリケーションを開発しました。いくつかの処理を実行し、メモリマップトファイルに定期的にデータを書き込むWindowsサービスがあります。メモリマップトファイルから読み取り、情報を表示する別のWindowsアプリケーションがあります。このアプリケーションは、Windows XP、XP Pro、およびServer 2003で期待どおりに動作しますが、Vistaでは動作しません。

テキストエディタでファイルを開いて保存されたメッセージを確認できるため、メモリマップトファイルに書き込まれているデータがWindowsサービスによって正しく行われていることがわかりますが、「消費者」アプリケーションはファイルから読み取ることができません。ここで注意すべき興味深い点の1つは、コンシューマーアプリケーションを閉じて再起動すると、以前にメモリマップトファイルに書き込まれたメッセージが消費されることです。

また、別の奇妙なことは、リモートデスクトップを使用してWindowsホストに接続し、リモートデスクトップを介してコンシューマーアプリケーションを呼び出し/使用したときに同じ動作が発生することです。ただし、リモートデスクトップを呼び出し、次のコマンドを使用してターゲットホストのコンソールセッションに接続するとmstsc -v:servername /F -console、すべてが完全に機能します。

そのため、問題は権限に関連していると思います。誰かがこれについてコメントできますか?

編集:

メモリマップトファイルとアクセスを同期するMutexオブジェクトを作成するために使用しているACLは次のとおりです。

これは問題の一部かもしれないと思います。

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

variables - スタック上の変数はどのようにアクセスされますか?

次のローカル変数があるとします。

私の知る限り、これらは次のようにシステムスタックに割り当てられます。

これは、aの値を取得するために、d、c、およびbの値を最初にスタックからポップアウトする必要があることを意味しますか?もしそうなら、これらの値はどこに行きますか?これは、最近宣言された変数へのアクセスが高速になることを意味しますか?それとも私は何かが足りないのでしょうか(私はそうだと思います)、そしてすべてが他の方法で機能しますか?

編集:ありがとう、みんな!

0 投票する
8 に答える
35501 参照

c - L1 キャッシュ ミスのコストは?

編集: 参照目的で (誰かがこの質問に出くわした場合)、Igor Ostrovsky がキャッシュ ミスに関する素晴らしい投稿を書きました。いくつかの異なる問題について説明し、例の数値を示します。 編集を終了

いくつかのテスト<long story goes here>を行いましたが、パフォーマンスの違いがメモリ キャッシュ ミスによるものかどうか疑問に思っています。次のコードは、問題を示し、重要なタイミング部分に要約します。次のコードには、メモリをランダムな順序でアクセスした後、アドレスの昇順でアクセスするループがいくつか含まれています。

XP マシン (VS2005 でコンパイル: cl /O2) と Linux ボックス (gcc –Os) で実行しました。どちらも同様の時間を生み出しました。これらの時間はミリ秒単位です。すべてのループが実行されており、最適化されていないと思います (そうでなければ、「即座に」実行されます)。

これらの数字は理にかなっていますか? 違いは主に L1 キャッシュ ミスによるものですか、それとも他の何かが起こっているのでしょうか? 20,000^2 のメモリ アクセスがあり、すべてがキャッシュ ミスである場合、ミスあたり約 3.2 ナノ秒になります。私がテストした XP (P4) マシンは 3.2GHz で、32KB の L1 キャッシュと 512KB の L2 を持っていると思われます (しかしわかりません)。20,000 エントリ (80KB) があるので、L2 ミスはそれほど多くないと思います。したがって、これは になります(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss。それは私には高く思えます。そうではないかもしれませんし、私の数学が悪いのかもしれません。VTune でキャッシュ ミスを測定しようとしましたが、BSOD が発生しました。そして今、ライセンス サーバー (grrrr) に接続できません。

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

pointers - メモリ(sbrk)ポインタアクセスでの16バイト整列シフト

私はsbrkを使用してかなり基本的なメモリアロケータを作成しました。私はメモリのチャンク、たとえば65kを要求し、動的メモリを要求する変数の必要に応じてそれを切り分けます。65kブロックに追加してメモリを解放します。65kブロックは、ユニオンsizeof(16バイト)から派生します。次に、ブロックを16バイトの境界に沿って整列させます。しかし、私は異常な行動をとっています。

データ構造を割り当ててデータ構造にデータを入力し始めると、メモリへのアクセスは正常に表示されます。関数呼び出しの1つで、グローバル構造のメンバー変数へのポインターを渡しますが、ポインター引数のアドレスは直接マップされません。そのメンバーのアドレス。

たとえば、この特定のメンバーの実際のアドレスはたまたま0x100313d50ですが、特定の機能(特別なことは何もありません)を実行すると、メンバーのアドレスは0x100313d70として表されます。デバッガー内で実際のアドレスを照会できますが、これが現れる関数内では正しく表示されます。これも最初にアクセスされるメンバーではなく、3番目であるため、2回前のメモリアクセスで問題ありませんが、3回目のアクセス中に、この異常なシフトが見られます。

ずれたブロックを介してこのメ​​モリにアクセスしている可能性はありますか?可能ですが、SIGBUS例外がスローされることを期待しています(SPARCチップ)。-memalign = 16sを使用してコンパイルしているので、ミスアライメントをトラップして修正するのではなく、SIGBUSを使用する必要があります。

私のすべての構造体は16バイトの倍数で埋められています:sizeof(structure)%16 =0。このタイプの動作を経験した人はいますか?一般的に言って、どんな種類のもの/もの/など。ポインタがメモリアドレスを誤って表現する可能性がありますか?

乾杯、トレーシー。

Solaris 10、SunStudio-12、最新のSPARCプロセッサ上のC言語(これが役立つ場合)。

0 投票する
14 に答える
49529 参照

c - 効率:配列とポインター

ポインタを介したメモリアクセスは、配列を介したメモリアクセスよりも効率的であると言われています。私はCを学んでおり、上記はK&Rに記載されています。具体的に彼らは言う

配列の添え字によって実行できる操作はすべて、ポインターを使用して実行することもできます。ポインタバージョンは一般的に高速になります

Visual C ++を使用して次のコードを分解しました(私のものは686プロセッサです。すべての最適化を無効にしました)。

驚いたことに、ポインタを介したメモリアクセスは、配列を介したメモリアクセスによって取得された2つの命令に対して3つの命令を取得します。以下は対応するコードです。

私が理解するのを手伝ってください。私はここで何が欠けていますか?


多くの回答やコメントで指摘されているように、私はコンパイル時定数を配列インデックスとして使用していたため、配列を介したアクセスがほぼ間違いなく簡単になりました。以下は、変数をインデックスとするアセンブリコードです。これで、ポインタと配列を介してアクセスするための同じ数の命令ができました。私のより広い質問はまだ有効です。ポインタを介したメモリアクセスは、より効率的であるとは言えません。

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

concurrency - 2つのスレッドが同じメモリを読み書きするとどうなりますか

2つのスレッドが同じメモリから読み取りを行っていて、そのメモリに書き込みを行っているスレッドがない場合、操作は安全であると理解しています。ただし、一方のスレッドが読み取りを行っており、もう一方のスレッドが書き込みを行っている場合はどうなるかわかりません。どうなるでしょうか?結果は未定義ですか?それとも、読み取りが古くなっているだけでしょうか?失効した読み取りが問題にならない場合は、変数への非同期の読み取り/書き込みを行っても問題ありませんか?または、データが破損している可能性があり、読み取りも書き込みも正しくないため、この場合は常に同期する必要がありますか?

後者の場合、メモリアクセスの競合によって状態が未定義のままになることを学びました...しかし、どこでそれを学んだのか思い出せず、見つけるのに苦労していますグーグルで答える。私の直感では、変数はレジスターで操作され、真の(ハードウェアの場合のように)並行性は不可能(またはそうである)であるため、発生する可能性のある最悪の事態は古いデータ、つまり次のとおりです。

その時点で、読み取りスレッドには古いデータがあります。

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

latency - リモート ネットワーク メモリ マップ ファイルまたはデバイス ブロックからの読み取りは、ローカル 7200rpm HDD からの読み取りよりも高速ですか?

というか、リモート RAM はローカル ディスク アクセスと比較してどうですか? 答えが「場合による」の場合、条件は何ですか? データ アクセス パターン、読み取りと書き込みの比率、距離など

最後に、ローカル ディスクが NetApp ファイラーの場合はどうなるでしょうか。

ありがとう。

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

performance - シングルコアでCPUのメモリIO帯域幅を飽和させることはできますか?

理想的な状況を想定すると、何もページアウトされない、すべてのコードが非常によく記述されてキャッシュに収まる、スケジューラーが中断することはありませんなど:マルチコアCPUのシングルコアは、IOバスを飽和させるのに十分な書き込みトラフィックを生成できますDIMM?

より具体的な形式:1つのスレッドで16GBを実行するプログラムを起動した場合memset、重複しない8GBのペアよりも実行速度が遅くなりmemsetますか?(サイズは、定常状態に達するのに十分な大きさになるように選択されます。)

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

arm - ARM Cortex-A8: 1 回のメモリ読み取りでフェッチされるバイト数は?

ARM cortex-a8 プロセッサで実行されている画像処理プロジェクトを改善しようとしています。

メモリから 8 ビットのグレースケール イメージ データにアクセスしていました。私の関数では、現在、個々のピクセル値にバイト単位でアクセスしています。

NEONを利用することで、メモリから128/8 = 16バイトにワンショットでアクセスし、関数でそれらを利用することでこれを改善できると考えました。しかし、変更されたバージョンを実行すると、実際にはバイト単位のアクセスよりも時間がかかっていることがわかります。NEON を使用したフェッチがボトルネックになり、計算時間よりも時間がかかっていると思います。

ARM Cortex-A8 のデータ バス サイズは? 1 回のメモリ フェッチでメモリからアクセスされるバイト数は?