가상메모리가 무엇일까요?
1. 리눅스와 DRAM 메모리
오늘은 가상 메모리에 대해 이야기해보겠습니다. 리눅스를 다루면서 가상 메모리에 대한 내용을 많이 접하셨을 것이라고 생각합니다. 이 부분을 명확하게 설명해보겠습니다. 임베디드 시스템들, 예를 들어 세탁기, 냉장고뿐만 아니라 차량용 시스템에서도 리눅스가 자주 사용됩니다. 특히 자율주행 시스템에서도 리눅스는 중요한 역할을 합니다. 안드로이드 시스템 역시 리눅스 기반이기 때문에, 리눅스는 스마트 공장과 인공지능 스피커 같은 곳에서도 널리 사용됩니다.
오늘은 메모리에 대한 얘기를 서버 중심으로 다루겠습니다. 리눅스 환경에서 메모리 카드가 몇 개인지, 보드가 어떤지 같은 스펙 차이는 있지만, 모든 리눅스 환경에서 공통적으로 적용되는 이야기입니다. 특히 카카오나 네이버 서버 같은 클라우드 시스템에서 리눅스를 많이 사용합니다. 이런 물리 서버를 열어보면, 우리가 사용하는 메모리 카드가 어떻게 쓰이고 있는지, 그리고 가상 메모리 메커니즘을 어떻게 활용하는지에 대해 자세히 설명할 것입니다.
데이터 센터든 회사 내의 서버든, 심지어 모바일이나 노트북을 열어보면 비슷한 구성을 갖게 됩니다. 메모리 카드, 보드, 메모리 디스크, 네트워크 부분은 일반적으로 탑재될 수 있는 하드웨어입니다. 이 메모리 카드를 RAM이라고 부르며, 물리 메모리를 조각 단위인 페이지 프레임으로 관리하게 됩니다. 이 페이지는 킬로바이트 단위로 조각으로 나누어 관리됩니다. 하드웨어 자체는 실제로 제한된 용량밖에 없지만, 우리는 논리적으로 페이지 단위로 메모리를 관리합니다. 실제로 이 페이지들을 직접 사용하는 것이 아니라 가상 메모리를 통해 관리하는 것입니다.
2.물리 메모리 간접사용
다양한 프로그램들, 예를 들어 카카오톡, 게임, 크롬 등은 메모리의 페이지를 직접적으로 사용하지 않습니다. 이 말은, 프로그램들이 리눅스 시스템 상에서 간접적으로 메모리 자원을 활용한다는 것을 의미합니다. 서버 프로그램들, 예를 들어 아파치나 엔진엑스 같은 웹 서버 소프트웨어도 마찬가지로 간접적으로 메모리를 사용합니다.
이런 간접적 사용은 리눅스 운영 시스템이 사용자 프로그램들이 하드웨어 자원을 활용할 수 있도록 중간에서 지원하는 역할을 함으로써 가능해집니다. 프로그램들은 각각의 페이지 테이블을 통해 간접적으로 메모리에 접근합니다. 페이지 테이블은 각 프로세스마다 존재하며, 이를 통해 가상 주소에서 물리 주소로의 변환, 즉 트랜스레이션을 수행합니다.
예를 들어, 엔진엑스 프로그램이 구동 중일 때, 이 프로그램이 메모리를 사용하는 것은 다양한 데이터 타입(정수, 문자, 실수, 배열)이나 전역 변수, 동적 할당 등을 통해 메모리를 활용한다는 것을 의미합니다. 이런 메모리 접근은 간접적으로 이루어지며, 페이지 테이블을 통해 실제 메모리 페이지로의 연결이 설정됩니다.
이러한 메커니즘은 가상 메모리 시스템의 핵심 부분입니다. 실제로 이 중계 메커니즘이 우리의 일상생활에서도 비슷한 역할을 하는 서비스들, 예를 들어 배달의 민족과 같은 앱을 통해 우리가 직접 가게에 가지 않고도 주문할 수 있는 것과 유사합니다. 이 모든 것은 시스템 내에서 간접적 사용을 통해 이루어집니다.
이해가 되신 후에, 리눅스 시스템 내에서 배운 내용을 직접 증명해 보는 것이 중요합니다. 'free'라는 명령어를 사용하면 메모리 사용량을 확인할 수 있습니다. 이를 통해 가상 메모리 메커니즘이 어떤 장점을 가지고 있는지 최종적으로 정리할 수 있습니다.
3.물리 메모리 사용량: free 명령어
리눅스에서 `free` 명령어를 사용하면 현재 시스템의 물리 메모리 사용량을 확인할 수 있습니다. `free` 명령어는 다음과 같은 정보를 제공합니다:
1. Total: 시스템에 설치된 총 메모리 용량.
2. Used: 현재 사용 중인 메모리 양.
3. Free: 사용되지 않고 남아 있는 메모리 양.
4. Shared: 다수의 프로세스에 의해 공유되고 있는 메모리 양.
5. Buff/cache: 버퍼와 캐시로 사용되고 있는 메모리 양.
6. Available: 애플리케이션 사용 가능한 근사치 메모리 양.
`free` 명령어를 실행할 때 다양한 옵션을 사용할 수 있습니다. 몇 가지 예는 다음과 같습니다:
- `-h`: 메모리 용량을 쉽게 읽을 수 있도록 KB, MB, GB 단위로 출력합니다.
- `-t`: 전체 메모리 사용량을 포함한 합계 행을 추가합니다.
- `-m`: 결과를 메가바이트(MB) 단위로 출력합니다.
- `-g`: 결과를 기가바이트(GB) 단위로 출력합니다.
예를 들어, 시스템의 메모리 사용량을 메가바이트 단위로 확인하고 싶다면 다음 명령을 사용할 수 있습니다
free -m
이 정보를 통해 시스템의 메모리가 얼마나 효율적으로 사용되고 있는지, 혹은 추가 메모리가 필요한지 등을 판단할 수 있습니다.
4. 가상 메모리 사용량: /proc/PID/maps 와 ps 명령어
리눅스에서 프로세스의 가상 메모리 사용량을 파악하는 데는 여러 방법이 있으며, /proc/PID/maps 파일과 ps 명령어를 활용하는 것이 일반적입니다. 이 두 가지 방법을 조합하여 프로세스의 메모리 사용 현황을 자세히 살펴볼 수 있습니다.
/proc/PID/maps 파일은 특정 프로세스의 메모리 맵을 나타냅니다. 여기서 PID는 프로세스 ID를 의미합니다. 이 파일은 해당 프로세스가 사용하는 가상 주소 공간의 모든 세그먼트를 나열하며, 각 세그먼트의 주소 범위, 권한, 사용 중인 메모리 영역의 유형(예: 코드, 데이터, 스택 등)에 대한 정보를 제공합니다.
예를 들어, 특정 프로세스의 메모리 맵을 확인하고 싶다면 다음 명령을 사용할 수 있습니다
cat /proc/[PID]/maps
리눅스 시스템에서 ps 명령어는 실행 중인 프로세스의 상태를 모니터링하는 데 널리 사용됩니다. 특정 정보를 보려면 다양한 옵션과 출력 포맷을 지정할 수 있습니다. 명령어 ps -eo pid,comm,vsz,rss를 사용하여 프로세스에 대한 구체적인 메모리 관련 정보를 확인할 수 있습니다. 이 명령어에 사용된 각 옵션의 의미는 다음과 같습니다:
pid: 프로세스 ID를 나타냅니다.
comm: 실행 중인 명령의 이름을 나타냅니다.
vsz: 가상 메모리 크기를 킬로바이트 단위로 나타냅니다. 이는 프로세스가 사용하고 있는 총 가상 메모리 양을 의미합니다.
rss: 레지던트 세트 크기를 킬로바이트 단위로 나타냅니다. 이는 실제 메모리에 존재하는 프로세스의 부분을 의미하며, 이 부분은 스왑되지 않는 메모리 양을 나타냅니다.
예를 들어, 시스템에서 실행 중인 모든 프로세스의 PID, 명령 이름, 가상 메모리 크기, 레지던트 세트 크기를 확인하려면 다음과 같이 입력합니다
ps -eo pid,comm,vsz,rss
이 명령은 시스템의 모든 프로세스에 대한 메모리 사용 정보를 제공하며, 리소스 사용량을 파악하거나 특정 프로세스의 메모리 요구 사항을 분석하는 데 유용합니다. 이러한 정보를 통해 시스템 관리자는 리소스 할당을 조정하거나 성능 문제를 해결하는 데 필요한 조치를 취할 수 있습니다.
관련내용의 리얼리눅스 추천 강의는 시스템 핵심정리입니다.
https://reallinux.co.kr/course/se_system