实际操作中fork的写复制示例

问题描述

在Linux中,系统调用fork被称为使用写时复制(COW)机制,因此避免了在不需要的情况下实际复制内存。

但是,我从未见过COW实际发挥作用的明确证据。我以为自己建立了自己的。

为此,我运行了一个程序,该程序计算具有40,000行和列的矩阵的平方,每个条目都是双精度(8字节)。该程序分为8个进程以进行平方。实际值是随机填充的。初始矩阵和结果都使用系统调用mmap分配为rw和可共享。

我希望我可以使用top来跟踪COW的运行情况,以跟踪内存使用情况。我得到的是下面的视图。这充其量只是一个“矛盾”的例子:fork在调用时实际上不可能克隆和复制初始矩阵的内存,因为系统没有95GiB的RAM,而只有16GiB。

enter image description here

(顺便说一句,这表明在top的任何内存列中添加不同进程的值没有多大意义。我没有意识到这一点,我担心部分原因就是我未能做到这一点清楚地看到写时复制是如何进行的

似乎没有什么令人信服的证据表明COW的行动。从教育的角度来看,这是一个较弱的示例,因为所有进程都“显示”了11.9GiB的使用。这不是人们所希望的引人注目的明确例子。取而代之的是,您需要按照“忽略这一点,忽略其他值,然后再想像……您就得到了我们想要的东西”的观点进行争论。最好使用一些工具来显示每个进程正在使用的独立物理内存的实际部分

这里独立的意思是:如果添加每个进程看到的内存使用量,您将获得整个程序正在使用的实际总物理内存。

作为top错误工具,一个人能用什么呢?

编辑:例如,这些工具有帮助吗?如果是这样,如何使用它们获取该信息? valgrind,smem,/ proc / pid / smap ...

EDIT2:按照提示here进行进一步挖掘,到目前为止,我发现最好的机会是通过smaps(或也许是pmap

(echo“ Parent:”; pid = 266694; cat / proc / $ pid / smaps | grep -A9“ / dev / zero”; echo“”;对于cat /proc/$pid/task/$pid/children中的ch;执行echo -e “ \ n ### \ nChild:$ ch”; cat / proc / $ ch / smaps | grep -A9“ / dev / zero”;完成)> out

其中父进程的ID为266694。该输出在此处可能有用的部分似乎如下

Parent: 7fa5d9963000-7fa8d486b000 rw-s 00000000 00:01 18271562 /dev/zero (deleted)  
Size:           12500000 kB  
KernelPageSize:      4 kB  
MMUPageSize:           4 kB  
RSS:               35512 kB  
Pss:               35512 kB  
Shared_Clean:          0 kB  
Shared_Dirty:          0 kB 
Private_Clean:         0 kB  
Private_Dirty:     35512 kB
-- 7fa8d486b000-7fabcf773000 rw-s 00000000 00:01 18271561  /dev/zero (deleted)  
Size:           12500000 kB  
KernelPageSize:        4 kB  
MMUPageSize:           4 kB  
RSS:            12500000 kB  
Pss:             1562500 kB  
Shared_Clean:          0 kB  
Shared_Dirty:   12500000 kB 
Private_Clean:         0 kB  
Private_Dirty:         0 kB
    

\### Child: 266706 7fa5d9963000-7fa8d486b000 rw-s 00000000 00:01 18271562                   /dev/zero (deleted)  
Size:           12500000 kB  
KernelPageSize:        4 kB  
MMUPageSize:           4 kB 
RSS:               35872 kB  
Pss:               35872 kB  
Shared_Clean:          0 kB  
Shared_Dirty:          0 kB  
Private_Clean:         0 kB  
Private_Dirty:     35872 kB  
-- 7fa8d486b000-7fabcf773000 rw-s 00000000 00:01 18271561                   /dev/zero (deleted)  
Size:           12500000 kB  
KernelPageSize:        4 kB  
MMUPageSize:           4 kB  
RSS:            12500000 kB  
Pss:             1562500 kB  
Shared_Clean:          0 kB  
Shared_Dirty:   12500000 kB 
Private_Clean:         0 kB  
Private_Dirty:         0 kB

,其余孩子显示出大致相同的值。我不确定如何正确解释这一点。

但是,恐怕我的第一个问题与(* nix)内存管理以及可用于检查内存的工具有关-topps在这里显然毫无用处({{3} })。这是我知道的完全不同的主题,但是eps> 0。也许我会更改标题或完全删除问题...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)