如何find在Linux中分叉进程和写时复制之间共享多less内存?

如果有一个进程读取一个大文件并将其保存在内存中(或者只是一个混合的char *),并且该主进程是分叉的,如果subprocess只从该内存(或char *)读取,则根据写入时复制,保存指针的内存不被复制,并且父节点和子节点共享相同的内存,直到它们中的任何一个尝试写入该内存为止,在这种情况下该进程生成内存的副本并且改变那。

所以我的问题是,如果有一个复制执行写,是否有一种方法来知道孩子使用的内存,而不是与主进程共享的数量? 换句话说,如果一个subprocess实际使用了多less内存,如果它从一些读取调用中使用父内存?

top或ps命令只会给出孩子应该拥有的总内存量。 (即假设内存或指针中的数据由孩子复制)。

有没有办法获得CoW语义实际使用的数据量?

我按照aix和Mat的build议,经过/proc/[pid]/smaps ,但是我发现所有的空白smaps文件都很多。 我试过这个命令来查找哪些文件中有数据: tail -n 5 */smaps | less 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 

那么现在我该怎么做? 我有空白smaps正在运行的进程。 我如何获得这些pid的smaps?

Solutions Collecting From Web of "如何find在Linux中分叉进程和写时复制之间共享多less内存?"

我不知道一个工具,会给你这个信息,但你可以计算这个基于/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. 

有关详细信息,请参阅从/proc/pid/smaps获取有关进程内存使用情况的信息 。