2016-11-30 16 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; 
} 

出力:

メモリがオペレータによってVmSizeの変化の新しい、値のみが割り当てられている
Before allocation 
VmSize:  3412 kB 
VmRSS:  852 kB 
After allocation 
VmSize: 13180 kB 
VmRSS:  852 kB 
After writing 
VmSize: 13180 kB 
VmRSS:  10568 kB 

。データがメモリに書き込まれると、VmRSSの値が変化します。どのようにして、物理メモリ(VmRSS)がプロセスによってどれくらい使われているかをLinuxはどのように知っていますか?

+7

オペレーティングシステムは、プロセスごとにメモリの割り当てと管理を行うためのものであることが分かっています。ここで何を求めているのですか?どのような問題を解決しようとしていますか? –

+0

オペレーティングシステムは、データがあるメモリアドレスに書き込まれると、VmRSS値に反映されることをどのように知っていますか?たとえば、メモリが割り当てられている場合、プロセスはmmapシステムコールを呼び出してOSからメモリを取得できるため、OSはそれを追跡できます。しかし、このメモリにデータが書き込まれるだけで、システムコールは呼び出されません。そのようなものが* ptr = dataされると、システムコールは呼び出されませんが、何らかの形でOSはこのデータが物理的にRAMにあり、VmRSS値に反映されていることを知っています。 – Ciomco

+0

私はLinuxのしくみを正確に言うことはできませんが(私はGoogleができるとは思うが)、Windowsでは* reserved * memoryと* committed * memoryの区別がある。 'malloc'(または' mmap'など)を使用してメモリブロックを予約しますが、実際にコミットされていない可能性があります。そのメモリブロックにアクセスすると、まだコミットされていない場合、システムが処理してメモリをコミットするページフォールト例外が生成されます(物理メモリまたはページファイルにメモリをマッピングします)。したがって、システムがPF例外を処理するため、明示的にシステムコールを行う必要はありません。 –

答えて

2

Linuxは、プロセスで使用されている物理メモリ(VmRSS)の量をどのように知っていますか?

プロセスが物理メモリにマップされていない仮想メモリにアクセスしようとすると、CPUは(ハードウェアメモリ管理ユニットを備えていると仮定して)割り込み(具体的にはページフォルト)をトリガします。オペレーティングシステム。オペレーティングシステムは物理メモリをプロセスに割り当て、変換ルックアサイドバッファ(仮想メモリを物理メモリにマッピングするために使用されるMMUの一部)を更新します。

したがって、物理メモリを割り当てるオペレーティングシステムであるため、各プロセスにどれだけ割り当てられているかを追跡することもできます。

関連する問題