3
我正在调查一个示例过程的内存使用情况。首先我分配一些内存,检查虚拟内存和驻留内存的大小(在RAM中)。然后我将数据写入分配的内存并再次检查这些值。Linux如何知道进程使用了多少物理内存?
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
当存储器由操作者分配新,只的VmSize变化值。当数据写入存储器时,VmRSS的值会改变。 Linux如何知道进程使用了多少物理内存(VmRSS)?
操作系统知道,因为它是处理分配和管理每个进程的内存。你到底在问什么?你想解决什么问题? –
操作系统如何知道数据写入某个内存地址时,它会反映在VmRSS值中。例如,当分配内存时,进程可以调用mmap系统调用来从操作系统获取一些内存,以便操作系统可以跟踪它。但是当数据刚刚写入此内存时,则不会调用任何系统调用。当这样的事情完成时* ptr = data,则不会调用任何系统调用,但不知何故,OS知道这些数据现在物理地位于RAM中,并且反映在VmRSS值中。 – Ciomco
我不能确切地说Linux如何工作(尽管我敢肯定Google可以),但在Windows中,* reserved *内存和* committed *内存之间存在区别。您使用'malloc'(或'mmap'或其他)预留了一块内存,但它可能实际上并未提交。当你访问这块内存时,如果它还没有被提交,这会产生一个页面错误异常,系统处理它,提交内存(*即*,将内存映射到物理内存或页面文件)。因此,您不需要明确地进行系统调用,因为系统处理PF异常。 –