サンプルプロセスのメモリ使用量を調べていました。まず、何らかのメモリを割り当て、仮想メモリと常駐メモリのサイズ(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はどのように知っていますか?
オペレーティングシステムは、プロセスごとにメモリの割り当てと管理を行うためのものであることが分かっています。ここで何を求めているのですか?どのような問題を解決しようとしていますか? –
オペレーティングシステムは、データがあるメモリアドレスに書き込まれると、VmRSS値に反映されることをどのように知っていますか?たとえば、メモリが割り当てられている場合、プロセスはmmapシステムコールを呼び出してOSからメモリを取得できるため、OSはそれを追跡できます。しかし、このメモリにデータが書き込まれるだけで、システムコールは呼び出されません。そのようなものが* ptr = dataされると、システムコールは呼び出されませんが、何らかの形でOSはこのデータが物理的にRAMにあり、VmRSS値に反映されていることを知っています。 – Ciomco
私はLinuxのしくみを正確に言うことはできませんが(私はGoogleができるとは思うが)、Windowsでは* reserved * memoryと* committed * memoryの区別がある。 'malloc'(または' mmap'など)を使用してメモリブロックを予約しますが、実際にコミットされていない可能性があります。そのメモリブロックにアクセスすると、まだコミットされていない場合、システムが処理してメモリをコミットするページフォールト例外が生成されます(物理メモリまたはページファイルにメモリをマッピングします)。したがって、システムがPF例外を処理するため、明示的にシステムコールを行う必要はありません。 –