2016-11-30 101 views
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)?

+7

操作系统知道,因为它是处理分配和管理每个进程的内存。你到底在问什么?你想解决什么问题? –

+0

操作系统如何知道数据写入某个内存地址时,它会反映在VmRSS值中。例如,当分配内存时,进程可以调用mmap系统调用来从操作系统获取一些内存,以便操作系统可以跟踪它。但是当数据刚刚写入此内存时,则不会调用任何系统调用。当这样的事情完成时* ptr = data,则不会调用任何系统调用,但不知何故,OS知道这些数据现在物理地位于RAM中,并且反映在VmRSS值中。 – Ciomco

+0

我不能确切地说Linux如何工作(尽管我敢肯定Google可以),但在Windows中,* reserved *内存和* committed *内存之间存在区别。您使用'malloc'(或'mmap'或其他)预留了一块内存,但它可能实际上并未提交。当你访问这块内存时,如果它还没有被提交,这会产生一个页面错误异常,系统处理它,提交内存(*即*,将内存映射到物理内存或页面文件)。因此,您不需要明确地进行系统调用,因为系统处理PF异常。 –

回答

2

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

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

因此,由于它是分配物理内存的操作系统,因此它也可以跟踪分配给每个进程的分配量。

相关问题