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 如何知道一个进程使用了多少物理内存?的主要内容,如果未能解决你的问题,请参考以下文章