프로그램을 실행하는 동안 가상 메모리 사용량이나 상주 집합 크기(RSS, Resident Set Size) 같은 메모리 사용 정보를 실시간으로 확인할 수 있습니다. 이러한 정보를 얻으려면 운영체제에서 제공하는 시스템 라이브러리를 활용해야 하며, 구체적인 방법은 운영체제에 따라 달라집니다. 이 글에서는 Linux 환경을 기준으로 설명합니다.
Linux에서는 /proc/self/stat 파일을 통해 현재 프로세스의 상세한 메모리 통계 정보를 얻을 수 있습니다. 여기서는 가상 메모리 크기(vsize)와 상주 집합 크기(rss) 두 가지 값을 가져오는 방법을 살펴보겠습니다.
예제 코드
#include <unistd.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void mem_usage(double& vm_usage, double& resident_set) {
vm_usage = 0.0;
resident_set = 0.0;
// proc 디렉터리에서 프로세스 정보 가져오기
ifstream stat_stream("/proc/self/stat", ios_base::in);
// 정보를 담을 변수들 선언
string pid, comm, state, ppid, pgrp, session, tty_nr;
string tpgid, flags, minflt, cminflt, majflt, cmajflt;
string utime, stime, cutime, cstime, priority, nice;
string O, itrealvalue, starttime;
unsigned long vsize;
long rss;
// 필요한 값(vsize, rss)이 나올 때까지 순서대로 읽고, 나머지는 무시
stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
>> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
>> utime >> stime >> cutime >> cstime >> priority >> nice
>> O >> itrealvalue >> starttime >> vsize >> rss;
stat_stream.close();
// 페이지 크기를 KB 단위로 계산 (x86-64에서는 2MB 페이지로 설정되기도 함)
long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024;
vm_usage = vsize / 1024.0;
resident_set = rss * page_size_kb;
}
int main() {
double vm, rss;
mem_usage(vm, rss);
cout << "Virtual Memory: " << vm << "\nResident set size: " << rss << endl;
}실행 결과
Virtual Memory: 13272 Resident set size: 1548
코드 설명
/proc/self/stat 파일은 공백으로 구분된 여러 필드를 포함하고 있으며, 각 필드는 프로세스의 다양한 상태 정보를 나타냅니다. 이 코드에서는 스트림 추출 연산자(>>)를 사용해 필요한 위치까지 필드를 순서대로 읽어 들인 후, 실제로 필요한 vsize(가상 메모리 크기, 바이트 단위)와 rss(상주 집합 크기, 페이지 수 단위) 값을 추출합니다.
가상 메모리 사용량은 바이트 값을 1024로 나누어 KB 단위로 변환하고, 상주 집합 크기는 페이지 수에 시스템 페이지 크기(sysconf(_SC_PAGE_SIZE))를 곱해 실제 물리 메모리 사용량을 KB 단위로 계산합니다.
이 방법은 Linux 전용이며, Windows나 macOS에서는 각각 GetProcessMemoryInfo()나 mach_task_info 같은 플랫폼별 API를 사용해야 한다는 점을 참고하시기 바랍니다.