Linux 如何知道一个进程使用了​​多少物理内存?

Posted

技术标签:

【中文标题】Linux 如何知道一个进程使用了​​多少物理内存?【英文标题】:How does Linux know how much physical memory is used by a process? 【发布时间】:2016-11-30 10:52:39 【问题描述】:

我正在调查一个示例进程的内存使用情况。首先我分配一些内存,检查虚拟内存和常驻内存(在 RAM 中)的大小。然后我将数据写入分配的内存并再次检查这些值。

int main()

 int pid = getpid();
 std::stringstream s;
 s << "cat /proc/" << pid << "/status | grep \"VmSize\\|VmRSS\"";
 std::string command = s.str();
 std::cout << "Before allocation\n";
 system(command.c_str());
 char* mem = new char[10000000];
 std::cout << "After allocation\n";
 system(command.c_str());
 memset(mem, 0, 10000000);
 std::cout << "After writing\n";
 system(command.c_str());
 return 0; 

输出:

Before allocation
VmSize:     3412 kB
VmRSS:       852 kB
After allocation
VmSize:    13180 kB
VmRSS:       852 kB
After writing
VmSize:    13180 kB
VmRSS:     10568 kB

当 operator new 分配内存时,只有 VmSize 的值会改变。当数据写入内存时,VmRSS 的值会发生变化。 Linux 如何知道进程使用了​​多少物理内存 (VmRSS)?

【问题讨论】:

操作系统知道,因为它负责为每个进程分配和管理内存。你到底在这里问什么?你想解决什么问题? 操作系统如何知道当数据写入某个内存地址时,它会反映在VmRSS值中。例如,在分配内存时,进程可以调用 mmap 系统调用从 OS 获取一些内存,以便 OS 对其进行跟踪。但是当数据刚刚写入这个内存时,就不会调用任何系统调用。当这样的事情完成 *ptr = data 时,不会调用任何系统调用,但不知何故操作系统知道这个数据现在物理上在 RAM 中,它反映在 VmRSS 值中。 我不能确切地说 Linux 是如何工作的(虽然我确信 Google 可以),但是在 Windows 中,reserved 内存和 committed 之间是有区别的 内存。您使用malloc(或mmap 或其他)保留一块内存,但它实际上可能尚未提交。当您访问该内存块时,如果尚未提交,则会生成页面错误异常,系统会处理该异常,提交内存(,将内存映射到物理内存或页面文件)。所以你不需要显式地进行系统调用,因为系统会处理 PF 异常。 【参考方案1】:

Linux 如何知道一个进程使用了​​多少物理内存 (VmRSS)?

当进程试图访问尚未映射到物理内存的虚拟内存时,CPU(假设它有一个硬件内存管理单元)将触发一个由操作系统处理的中断(特别是页面错误) .操作系统将物理内存分配给进程并更新翻译后备缓冲区(MMU 的一部分,用于将虚拟内存映射到物理内存)。

因此,由于是操作系统分配物理内存,它还可以跟踪它为每个进程分配了多少。

【讨论】:

以上是关于Linux 如何知道一个进程使用了​​多少物理内存?的主要内容,如果未能解决你的问题,请参考以下文章

linux 命令ps -aux 查看进程所占内存大小,怀疑一个进程存在内存泄露,每个一段时间,内存大小增加4kB

如何查看虚拟内存使用情况

Linux中关于swap虚拟内存和page的区别

linux 进程占用内存详解

怎么查看进程在内存中的地址?

Linux性能优化 第五章 性能工具:特定进程内存