大きなファイルを読み取ってそのメモリ (または単に malloced char*) に保存するプロセスがあり、そのメイン プロセスがフォークされている場合、子プロセスがそのメモリ (または char*) からのみ読み取る場合、コピーオンライト、ポインターが保存されているメモリはコピーされず、どちらか一方がそのメモリに書き込もうとするまで、親と子の両方が同じメモリを共有します。その場合、プロセスはメモリのコピーを作成して変更しますそれ。
だから私の質問は、コピーオン書き込みが実装されている場合、メインプロセスと共有されていない子が使用するメモリの量を知る方法はありますか? 言い換えれば、子プロセスが実際に使用するメモリの量は、いくつかの読み取り呼び出しから親メモリを使用する場合ですか?
top、または ps コマンドは、子が持つはずのメモリの合計量のみを提供します。(つまり、メモリまたはポインタ内のデータが子によってコピーされたと仮定します。)
CoWセマンティクスで実際に使用されているデータ量を取得する方法はありますか?
私は/proc/[pid]/smaps
aix と Mat が提案したように調べましたが、見つかったのは空の smaps ファイルがたくさんありました。このコマンドを試して、どのファイルにデータが含まれているかを見つけました: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
それで、私は今何をすべきですか?実行中の空白の smap を持つプロセスがあります。それらのpidのsmapを取得するにはどうすればよいですか?