Linux中父子进程的内存消耗计算疑问
Linux父子进程内存占用计算问题
这个问题的答案取决于父子进程内存的共享程度,核心是Linux的写时复制(Copy-On-Write, COW)机制:
若父子进程刚完成fork、还未大量修改内存内容:
实际物理内存总占用接近400MB。因为fork操作不会直接复制父进程的全部物理内存页,而是让父子进程共享所有可共享的内存页(比如代码段、未修改的数据段)。此时父进程的390MB和子进程的350MB中,绝大部分是重叠的共享内存,物理内存只需存储一份共享内容,总占用仅比父进程的内存略多(多出来的是子进程独有的少量内核数据结构)。若父子进程已经修改了大部分各自的内存页:
实际物理内存总占用接近750MB。当任意一方修改共享页的内容时,Linux内核会为修改方复制一份新的物理页,原来的共享页继续保留给另一方。如果大部分页都被修改过,父子进程的内存页基本完全独立,总占用就是两者内存大小的总和。
如何确认实际占用?
可以用smem工具查看,它会明确区分共享内存(Shared)和私有内存(Private),计算总物理内存时会自动去重共享部分;也可以查看top或htop中的RES列,但注意RES包含共享内存,直接相加会重复计算共享部分,不能直接作为总物理内存占用。
内容的提问来源于stack exchange,提问作者deepu reddy
相关产品推荐
相关产品推荐

