【问题标题】:How does Linux know how much physical memory is used by a process?Linux 如何知道一个进程使用了​​多少物理内存?
【发布时间】: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 异常。

标签: c++ c linux memory


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2021-02-04
    • 2011-07-31
    相关资源
    最近更新 更多