プロセスのメモリ使用量は、以下を実行することで表示できます。
$ ps -C processname -o size
SIZE
3808
ps
実行(または外部プログラム)や読み取りを行わずにこの情報を取得する方法はあります/proc
か?
プロセスのメモリ使用量は、以下を実行することで表示できます。
$ ps -C processname -o size
SIZE
3808
ps
実行(または外部プログラム)や読み取りを行わずにこの情報を取得する方法はあります/proc
か?
Linux システムでは、プロセスのメモリ使用量は を読み取ることで照会できます/proc/[pid]/statm
。[pid]
プロセスの PID はどこにありますか。プロセスが自身のデータを照会したい場合は、代わりに読み取ることで実行できます/proc/self/statm
。man 5 proc
言います:
/proc/[pid]/statm
Provides information about memory usage, measured in pages. The columns are: size total program size (same as VmSize in /proc/[pid]/status) resident resident set size (same as VmRSS in /proc/[pid]/status) share shared pages (from shared mappings) text text (code) lib library (unused in Linux 2.6) data data + stack dt dirty pages (unused in Linux 2.6)
でファイルを開きfopen("/proc/self/statm", "r")
、内容を読むことができます。
ファイルは「ページ」で結果を返すため、ページ サイズも確認する必要があります。getpagesize ()
ページのサイズをバイト単位で返します。
プログラムのメモリ使用量を見つけるには、いくつかのオプションがあります。
ps
、top
、またはpmap
コマンド ラインから行うようにps
をアプリにバンドルして直接使用します (もちろんオープンソースです!)/proc
これですべてです...)ps
/proc
ビューにすぎないため、これは実際には既に行われています。前者はすべてシステム管理の観点から教育的であり、実際の状況では最良の選択肢ですが、最後の箇条書きはおそらく最も興味深いものです。おそらく、Valgrind または memprof のソースを読んで動作を確認したいと思うでしょうが、基本的に必要なことは、アプリとカーネルの間にメカニズムを挿入し、メモリ割り当ての要求をインターセプトすることです。さらに、プロセスの開始時に、そのメモリ空間を 0xDEADBEEF などのプリセット値で初期化する必要があります。次に、プロセスが終了した後、メモリ空間を読み込んで、事前に設定した値以外の単語の出現回数を数えることで、メモリ使用量の見積もりを得ることができます。
もちろん、物事は常に見かけよりも複雑です。共有ライブラリが使用するメモリはどうですか? パイプ?プロセスと別のプロセスの間でメモリを共有していますか? システムコール?割り当てられたが使用されていない仮想メモリ? ディスクにバッファリングされたデータ? あなたの質問「プロセスの記憶」を超えて、多くの呼び出しが行われます。その他の懸念事項については、この投稿を参照してください。