Shared_dirty 与共享内存中的 Private_dirty

Shared_dirty vs Private_dirty in shared memory

我有一个使用共享内存的多进程应用程序。我正在尝试检测我的应用程序中的内存泄漏。我在 /proc/$pid/smap

中找到了这个
 2b51cd2b2000-2b53b8aa4000 rw-s 00000000 00:09 17151225                   /dev/zero (deleted)
  Size:           8052680 kB
  Rss:              31608 kB
  Shared_Clean:      1524 kB
  Shared_Dirty:     25736 kB
  Private_Clean:        0 kB
  Private_Dirty:     4348 kB
  Swap:                 0 kB
  Pss:               6945 kB

这是我分配的共享内存。(大小告诉我这是我用mmap分配的)

我试图理解 Shared/Private 在内存本身共享的上下文中的区别。参见 's' 标志。

如果有人能解释 Shared_Clean 与 Private_Clean 之间的区别 Shared_Dirty vs Private_Dirty 在共享内存的上下文中。

Clean和Dirty的区别是指页面写入内存后是否已经写出到backing store。对于 /dev/zero 的映射,显然 永远不会 写出页面,因此只读取干净页面,而写入脏页。

对于共享映射,私有和共享之间的区别在于页面是否仅被您正在检查的进程引用,或者它们是否被多个进程引用。

总而言之:

  • Shared_Clean 是映射中已被该进程和至少一个其他进程引用但未被任何进程写入的页面;
  • Shared_Dirty 是映射中已被此进程和至少一个其他进程引用的页面,并且至少被其中一个进程写入;
  • Private_Clean 是映射中已被该进程读取和未写入但未被任何其他进程引用的页面;
  • Private_Dirty 是映射中已由该进程写入但未被任何其他进程引用的页面。

页面在被写入时可以从 Clean 移动到 Dirty,当另一个进程引用它们时可以从 Private 移动到 Shared。

如果您映射一个真实的磁盘文件,那么当页面被内核写出时,页面也可以从 Dirty 移动到 Clean。