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

如何解决实际操作中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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?