2012-05-16 9 views
9

大きなファイルを読み込んでメモリ(または単にmallocされたchar *)に保存し、そのメインプロセスがforkされるプロセスがある場合、子プロセスがそのメモリ(またはchar * copy-on-writeによれば、ポインタが保存されているメモリはコピーされず、どちらか一方がそのメモリに書き込もうとするまで、親と子の両方が同じメモリを共有する。その場合、プロセスはメモリのコピーを作るそれを変更します。Linuxでコピーオンライトでフォークされたプロセス間でどのくらいのメモリが共有されているかを調べる方法はありますか?

私の質問は、コピーオン書き込みが実装されている場合、メインプロセスと共有されていない子供が使用するメモリの量を知る方法があるかどうかです。 つまり、いくつかの読み込み呼び出しで親メモリを使用する場合、子プロセスは実際にどれだけのメモリを使用しますか?

top、またはpsコマンドは、子が持つと想定されるメモリの総量のみを返します。 (すなわち、メモリまたはポインタ内のデータが子によってコピーされていると仮定して)

実際にCoWセマンティクスで使用されるデータの量を取得する方法はありますか?

私はをaixとMatが示唆しているように調べましたが、見つかったのはたくさんの空白のファイルでした。 tail -n 5 */smaps | less と私が得たO/Pは

==> 1012/smaps <== 

==> 1074/smaps <== 

==> 10/smaps <== 

==> 1148/smaps <== 

==> 11862/smaps <== 

==> 11/smaps <== 

==> 1355/smaps <== 

==> 1356/smaps <== 

==> 1357/smaps <== 

==> 1358/smaps <== 

==> 1361/smaps <== 

==> 13/smaps <== 

==> 14900/smaps <== 

==> 14/smaps <== 

==> 1501/smaps <== 

==> 15/smaps <== 

==> 1684/smaps <== 

==> 1685/smaps <== 

==> 16/smaps <== 

==> 17772/smaps <== 

==> 17827/smaps <== 

==> 17/smaps <== 

==> 18490/smaps <== 

==> 18/smaps <== 

==> 1932/smaps <== 

==> 1934/smaps <== 

==> 19863/smaps <== 

==> 19/smaps <== 

==> 1/smaps <== 

==> 20125/smaps <== 

==> 20126/smaps <== 

==> 20127/smaps <== 

==> 20128/smaps <== 

==> 20129/smaps <== 

==> 20134/smaps <== 

==> 20135/smaps <== 

==> 20811/smaps <== 

==> 20868/smaps <== 

==> 20/smaps <== 

==> 21116/smaps <== 

==> 21774/smaps <== 

==> 21/smaps <== 

==> 22393/smaps <== 

==> 22394/smaps <== 

==> 22395/smaps <== 

==> 22398/smaps <== 

==> 22639/smaps <== 

==> 22824/smaps <== 

==> 22/smaps <== 

==> 23009/smaps <== 

==> 23058/smaps <== 

==> 23059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 23835/smaps <== 

==> 23961/smaps <== 

==> 23962/smaps <== 

==> 23963/smaps <== 

==> 23964/smaps <== 

==> 23/smaps <== 

==> 24180/smaps <== 

==> 24268/smaps <== 

==> 24467/smaps <== 

==> 24/smaps <== 

==> 252/smaps <== 

==> 25352/smaps <== 

==> 25435/smaps <== 

==> 25/smaps <== 

==> 26465/smaps <== 

==> 26/smaps <== 

==> 27884/smaps <== 

==> 27/smaps <== 

==> 28/smaps <== 

==> 29/smaps <== 

==> 2/smaps <== 

==> 303/smaps <== 

==> 30/smaps <== 

==> 316/smaps <== 

==> 31/smaps <== 

==> 32074/smaps <== 

==> 32076/smaps <== 

==> 32112/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 32116/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 322/smaps <== 

==> 32466/smaps <== 

==> 32467/smaps <== 

==> 32/smaps <== 

==> 33/smaps <== 

==> 34/smaps <== 

==> 37/smaps <== 

==> 38/smaps <== 

==> 3991/smaps <== 

==> 3992/smaps <== 

==> 39/smaps <== 

==> 3/smaps <== 

==> 4005/smaps <== 

==> 4006/smaps <== 

==> 4007/smaps <== 

==> 4008/smaps <== 

==> 4009/smaps <== 

==> 4010/smaps <== 

==> 4018/smaps <== 

==> 4029/smaps <== 

==> 4038/smaps <== 

==> 4044/smaps <== 

==> 4045/smaps <== 

==> 4046/smaps <== 

==> 4053/smaps <== 

==> 4054/smaps <== 

==> 4055/smaps <== 

==> 40/smaps <== 

==> 41/smaps <== 

==> 42/smaps <== 

==> 4339/smaps <== 

==> 435/smaps <== 

==> 436/smaps <== 

==> 43/smaps <== 

==> 44/smaps <== 

==> 45/smaps <== 

==> 46/smaps <== 

==> 47/smaps <== 

==> 48/smaps <== 

==> 49/smaps <== 

==> 4/smaps <== 

==> 50/smaps <== 

==> 51/smaps <== 

==> 52/smaps <== 

==> 53/smaps <== 

==> 54/smaps <== 

==> 55/smaps <== 

==> 56/smaps <== 

==> 57/smaps <== 

==> 58/smaps <== 

==> 5988/smaps <== 

==> 59/smaps <== 

==> 5/smaps <== 

==> 6058/smaps <== 

==> 6059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 60/smaps <== 

==> 61/smaps <== 

==> 62/smaps <== 

==> 63/smaps <== 

==> 64/smaps <== 

==> 65/smaps <== 

==> 66/smaps <== 

==> 67/smaps <== 

==> 68/smaps <== 

==> 69/smaps <== 

==> 6/smaps <== 

==> 70/smaps <== 

==> 71/smaps <== 

==> 72/smaps <== 

==> 73/smaps <== 

==> 74/smaps <== 

==> 771/smaps <== 

==> 77/smaps <== 

==> 782/smaps <== 

==> 78/smaps <== 

==> 79/smaps <== 

==> 7/smaps <== 

==> 80/smaps <== 

==> 814/smaps <== 

==> 819/smaps <== 

==> 81/smaps <== 

==> 82/smaps <== 

==> 83/smaps <== 

==> 84/smaps <== 

==> 8654/smaps <== 

==> 8655/smaps <== 

==> 8656/smaps <== 

==> 892/smaps <== 

==> 8/smaps <== 

==> 949/smaps <== 

==> 950/smaps <== 

==> 9/smaps <== 

==> self/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

それでは、私は今行うことになっていた:私はそれらのデータを持つファイルを見つけるために、このコマンドを試してみましたか?私は空白のスワップが実行されているプロセスがあります。どのように私はそれらのpidのスワップを取得するのですか?

+1

オペレーティングシステムによって異なります。 Linux? – Mat

+0

はいosはlinuxです。 –

+4

http://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smapsが参考になる場合があります – Mat

答えて

5

私はあなたにこの情報を与えるツールを知りませんが、あなたはおそらくこれが/proc/[pid]/smapsに基づいて計算することができます:

/proc/[pid]/smaps (since Linux 2.6.14) 
      This file shows memory consumption for each of the process’s mappings. 
      For each of mappings there is a series of lines such as the following: 

       08048000-080bc000 r-xp 00000000 03:02 13130  /bin/bash 
       Size:    464 kB 
       Rss:    424 kB 
       Shared_Clean:  424 kB 
       Shared_Dirty:   0 kB 
       Private_Clean:  0 kB 
       Private_Dirty:  0 kB 

      The first of these lines shows the same information as is displayed for 
      the mapping in /proc/[pid]/maps. The remaining lines show the size of 
      the mapping, the amount of the mapping that is currently resident in RAM, 
      the number of clean and dirty shared pages in the mapping, and the number 
      of clean and dirty private pages in the mapping. 

詳細については、Getting information about a process' memory usage from /proc/pid/smapsを参照してください。

+0

両方のファイルが空であるため、/ proc/pid/mapsやsmaps以外の別の方法を教えてください。 –

+0

@PrasanthMadhavan:自分のプロセスでも空ですか? – NPE

+0

はい。すべて空です。私の質問を参照してください。それはスワップを示すが、マップも同じです.. –

関連する問題