- ベストアンサー
特定のプロセスが使用している物理メモリ量を確認する方法
- 特定のプロセスが使用している物理メモリ量を確認する方法についてご教示ください。
- プロセスが使用している物理メモリ領域は「Working Set」と呼ばれますが、そのうち「Shared Bytes」は他のプロセスと共有されるため、特定のプロセス専用のものではありません。
- 「Working Set」から「Shared Bytes」の使用量を引くことで特定のプロセスが使用している純粋な物理メモリ量を知ることができます。パフォーマンスモニターなどのツールを使用して、「カウンタ」と「インスタンス」を取得し、適切な計算を行うことで求めることができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> しかし、「Shared Bytes」にプロセスBだけが使用するライブラリがあり、 > プロセスAの物理メモリ量を求める際に「Shared Bytes」からプロセスBが使用しているライブラリ分のメモリを引くことができなければ、 > 「Working Set」にはプロセスBのライブラリのメモリも含まれてしまうことになるのではと思っております。 プロセスBだけが使用しているライブラリだったなら そもそもプロセスAには一切関係ない話で プロセスAが使っているメモリとしては最初からどこにも計上されません。 > プロセスAでもプロセスBでも同じライブラリを使用するので > 「Shared Bytes」におきましょうということなら共有してそのメモリは使用されているので理解はできます。 例えば、プロセスAとプロセスBだけが共有しているメモリがある状態で プロセスBを落とすと、その瞬間にそのメモリはプロセスAだけの物になるのでは? という話であれば、 それはその通りです。 その当たりのことを厳密に考えるなら、 ShareableとSharedという言葉を使い分けてください。 ・Shareableは共有可能だけど他のプロセスがたまたま使っていなくて自分だけが使っている分も含まれる ・Sharedは実際に他のプロセスも共有している分だけ (当然ですが、SharedはShareableの一部になります。) 細かい話なので不要かと思って(普通は「WS Shareable」の方を見るので)前の回答では特に触れてませんでしたが、 ProcessExplorerにも「WS Shareable」と「WS Shared」があります。 > Mac Macがメモリ管理機能さえ持っておらず、各プロセスが直接物理メモリにアクセスするようなOSとはとてもじゃないけど思えないのですが……。 (各プロセスが協調してメモリ管理に責任を持たなくてはいけなくなりメモリ管理が破綻してしまいます。) 各プロセスへの仮想アドレス空間の提供などメモリ管理はOSの基本的な役割ですし、Windowsと同じではないにしても管理機能はあると思いますが。
その他の回答 (4)
Windowsのメモリ管理は『仮想メモリ』上で行われます。 純粋な物理メモリサイズは計算出来ないです。 物理メモリへのアクセスはインデックスエリアを経由して、 ページングされた物理メモリ領域にアクセスします。 (これはメモリコントローラの仕事) Macは本当に物理メモリにアクセスしてます。 Windowsだけが特殊。
補足
ありがとうございます。 仕事柄、Macも所有していますが、物理メモリに直接アクセスしているとは知りませんでした。 Windowsのメモリ管理については、他のプロセスによってメモリが上書きされたりしない様に カーネルのメモリーマネージャがメモリの管理をしていると記載されていました。 コンピュータによって搭載されているメモリ容量は異なるため、仮想アドレス空間が使用されているという記載もありました。 Windowsが特殊とのことですが、LinuxもMacと同じ仕組みということでしょうか。 Macの場合、Windowsのようなメモリマネージャを使用せずにプロセスが直接物理メモリにアクセスしているということでしょうか。 Macの場合、プロセス毎の純粋な物理メモリ量を知ることが出来るということでしょうか。
- Gotthold
- ベストアンサー率47% (396/832)
> 「Workng Set」の値と比較をしてみると、「WS Shareable Bytes」+「WS Private Bytes」が「Working Set」になっているように見えます。 WSはWorking Setの略なのでそうなります。 (回答No.2ではパフォーマンスモニターに合わせて略さずに書いてます) > 「Private Bytes」から「WS Private」を引いたものが恐らく、ページアウトされたものではないかと推察しています。 それで正しいです。 回答No.2で等式を2つ並べて書いたので伝わるかなと思っていたのですが、 「Virtual Bytes」のうち物理メモリ上にあるのが「Working Set」 「Private Bytes」のうち物理メモリ上にあるのが「Working Set - Private」 「Shared Bytes」のうち物理メモリ上にあるのが「Working Set - Shareable」 という関係です。 > なので、そのプロセスで使用されている物理メモリ量はと聞かれた場合、 > 「Working Set」の値がそうですということでいいのではないかと思うようになりました。 プロセスで使用されている物理メモリ量としては、 「Working Set」または「Working Set - Private」のどちらかを使うことになるでしょうね。 (どっちを使うかは、共有分を含めたいかどうかによるので、目的に応じて好きな方を使えば良いと思います。 Vista以降のタスクマネージャーがプロセスの物理メモリ使用量としてデフォルトで表示するのは「Working Set - Private」の方。)
補足
ありがとうございます。 「WS」が「Working Set」の略であることは分かっているのでその点は大丈夫です。 ProcessExplorerのデフォルト設定では、「WS Privates Bytes」「WS Shareable Bytes」のチェックはついていないので、取得はしていませんでしたが、ご教示頂いたことを自分でも確認するために「WS Privates Bytes」「WS Shareable Bytes」を有効にして取得してみました。 一転気になる点がありますが、「Shared Bytes」は他のプロセスと共有されるメモリ領域で、ライブラリ(.DLL、.lib)などがおかれるという情報が記載されているサイトがありますが、「Shared Bytes」に他のプロセスと共有されないライブラリが存在するのでしょうか。 ライブラリ(.DLL、.lib)は、他のプロセスと共有されないものも「Shared Bytes」におかれるとしたら、「Shared Bytes」というのはおかしいのではと思っております。 プロセスAでもプロセスBでも同じライブラリを使用するので「Shared Bytes」におきましょうということなら共有してそのメモリは使用されているので理解はできます。 しかし、「Shared Bytes」にプロセスBだけが使用するライブラリがあり、プロセスAの物理メモリ量を求める際に「Shared Bytes」からプロセスBが使用しているライブラリ分のメモリを引くことができなければ、「Working Set」にはプロセスBのライブラリのメモリも含まれてしまうことになるのではと思っております。 ライブラリ(.DLL、.lib)については、共有されないものは「Working Set - Private」に存在するのでしょうか。
- Gotthold
- ベストアンサー率47% (396/832)
> 以下のサイトの情報からでしょうか。 いえ、タスクマネージャーやパフォーマンスモニター、ProcessExplorerで各項目の数値を眺めてみて 言葉の意味からしてもこれかなと。 > このサイトの情報の場合、以下の点が気になっています。 私の認識は以下の通り。 【仮想メモリ(物理メモリとページアウト分の和)】 「Virtual Bytes」 = 「Private Bytes」 + 「Shared Bytes(※1)」 【物理メモリ(ワーキングセット)】 「Working Set」 = 「Working Set - Private」 + 「Working Set - Shareable(※2)」 ※1:各ツール上でShared Bytesという項目は見当たらなかったのでPrivate Bytesに対応させてここに置いた ※2:ProcessExplorerの呼称に倣った
補足
ありがとうございます。 Process Explorerの場合、「Selecet Colums」-「Process Memory」タブに「WS Shareable Bytes」「WS Privates Bytes」のチェックボックスがあり、「Workng Set」の値と比較をしてみると、「WS Shareable Bytes」+「WS Private Bytes」が「Working Set」になっているように見えます。 以下は、プロセス「Skype」のメモリ使用量をProcess Explorerとタスクマネージャで取得したものです。 「Private Bytes」から「WS Private」を引いたものが恐らく、ページアウトされたものではないかと推察しています。 「Private Bytes」は84,808Kで、物理メモリ上にあるのが56,196K、ページアウトされたものが28,012Kと解釈しています。 ----------------------------------------------------------------------------------------------------- 1.Process Explorer プロセス:Skype.exe Private Bytes: 84,808K Working Set:98,524K WS Private:56,196K WS Shareble:42,328K 2.タスクマネージャー プロセスSkype.exe メモリ(プライベートワーキングセット):56,196K ------------------------------------------------------------------------------------------------------ 「Shareable Bytes」は、ライブラリ(.dll、.lib)が置かれるので、プロセスA、プロセスBでも使用される共通ライブラリ「1234.dll」がある場合、プロセスA専用ではないがプロセスAで使用されていることは事実なので、 「Shareable Bytes」の中でプロセスA専用で使用されている物理メモリを調べること自体が間違っているのではないかと今考えるようになりました。 Process Explorerではプロセスによって使用されているDLL、レジストリ、ファイルを確認することができ、その中にファイル「C:\Windows」も使用されており、他のプロセスでもファイル「C:\Windows」が使用されていることが確認できます。 なので、そのプロセスで使用されている物理メモリ量はと聞かれた場合、「Working Set」の値がそうですということでいいのではないかと思うようになりました。
- Gotthold
- ベストアンサー率47% (396/832)
Working Set - Private (プライベートワーキングセット) を参照すれば良いかな。
補足
ありがとうございます。 以下のサイトの情報からでしょうか。 --------------------------------------- メモリ使用量の調査。用語メモ書き… http://jehupc.exblog.jp/8104558/ Working Set -Private-(Vistaのみ) 上記にて説明済みですが、ワーキングセット - 共有オブジェクト の値となります。実メモリ上のそのプロセスonlyな確保している空間です。 Vistaのタスクマネージャのデフォルトです。 --------------------------------------- このサイトの情報の場合、以下の点が気になっています。 「ワーキングセット - 共有オブジェクト」とありますが、「共有オブジェクト」は「Shared Bytes」ということであっておりますでしょうか。 「Working Set - Private」は「Shared Bytes」の中で他のプロセスと共有されない物理メモリということでしょうか。 その認識であっている場合、「Working Set」、「Private Bytes」、「Working Set - Private」を使用して他のプロセスと共有されない物理メモリを求めることはできますでしょうか。 「Private Bytes」は他のプロセスと共有されないメモリ領域で、「物理メモリにあるもの」と「ページアウトされたもの」になります。 「Working Set」は「Private Bytes」と「Shared Bytes」の総和で「ページアウトされたもの」は含まないのでそれはいいのですが、他のプロセスと共有される物理メモリが含まれます。 「Working Set - Private」が「Shared Bytes」の中で他のプロセスと共有されない物理メモリであっている場合、「Working Set」から「Working Set - Private」を引くと、「Private Bytes」と 「Shared Bytes」の中で他のプロセスと共有されない物理メモリが足された値となりますが、その場合、「Private Bytes」と「Shared Bytes」の中で他のプロセスと共有されない物理メモリを分けることができなくなります。 Microsoft等出典元がはっきりしているサイトで今回質問した純粋なプロセス専用の物理メモリを取得するための情報がありましたらお教えいただけますでしょうか。 探し方が悪かったのか、上手く情報にたどり着けていません。
お礼
ありがとうございます。 メーカーが算出したメモリ使用量(Private Bytes)と同様にこちら側でパフォーマンスモニターを使用して取得したメモリ使用量についてもPrivate Bytesでのバージョンアップ前後の結果をユーザーに報告しましたが特段、Working SetとPrivate Bytesの違いの説明については求められず、無事、報告は完了しました。 ※ 報告書には、Working SetとPrivate Bytesの説明とWorking Setで取得した結果も掲載しています。
補足
ありがとうございます。 日経BP社のMicrosoft公式解説書「Windows Sysinternals徹底解説」2012年7月1日 電子書籍版に以下の記載がありました。 WS Shareable Bytes -ファイルマッピングによって現在使用中のワーキングセット(物理メモリ)のうち、他のプロセスと共有することができるバイト数を示します。 WS Sghared Bytes - ファイルマッピングによって現在使用中のワーキングセット(物理メモリ)のうち、1つ以上の他のプロセスのアドレス領域にもマップされている領域のバイト数を示します。 当初、あるメーカーにメモリ使用量の参考値を出してもらう際、てっきり、「Working Set」で取得されていると思っていたのですが、「Private Bytes」を取得をしており、こちらの検証でもメーカに合わせて「Shared Bytes」で報告するので気にになくてよくなりました。 kiyomac様からMacOSは物理メモリにアクセスしているという話をされていたのでkiyomac様からその出典元を明らかにした上で説明して頂こうとしました。その情報が裏付けできるような出典元があるか確認するためでした。 現在のMacOSの最新版はEl Captainですが、漢字Talk7の頃から仮想メモリを使用しているようです。MacOSであろうが、Linuxであろうが仮想アドレス空間がないということは今では考えられないと思っています。 しかし、昔のMacOSではアプリケーションが自由にメモリを書き換えしていたようです。 -------------------------------------------------------------------------- 仮想記憶 https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6#Mac_OS Mac OS Mac OSはSystem 7から「仮想メモリ」として実装される。 --------------------------------------------------------------------------- --------------------------------------------------------------------------- 猪木のように爆弾をかかえたシステム http://www7b.biglobe.ne.jp/~macintosh/mac/bom/bom.html ---------------------------------------------------------------------------