리눅스의 메모리는 커널의 메모리, 비어 있는 메모리, 프로세스용 메모리로 이루어졌다.
OOM Killer는 시스템 메모리가 부족할 때 활성화되는 메커니즘이다. OOM Killer의 주된 목적은 시스템의 안정성을 유지하는 것으로, 메모리가 고갈될 위험이 있을 때 특정 프로세스를 강제로 종료함으로써 나머지 시스템이 계속 작동할 수 있게 한다.
가상 메모리는 컴퓨터 시스템의 메모리 관리 기법 중 하나로, 물리적 메모리(RAM)의 크기를 초과하는 프로그램을 실행할 수 있게 해준다. 가상 메모리 시스템은 물리적 메모리와 보조 저장 장치(주로 하드 드라이브 또는 SSD의 일부 영역)를 사용하여, 운영 체제가 메모리를 효율적으로 관리하고, 프로세스마다 독립적인 메모리 공간을 제공하며, 메모리 보호를 구현하는 데 도움을 준다.
가상 주소 공간: 가상 메모리 시스템에서, 각 프로세스는 실제 물리적 메모리 주소가 아닌 가상 주소를 사용하여 메모리에 접근한다. 운영 체제는 가상 주소와 물리적 주소 사이의 매핑을 관리한다.
페이지: 가상 메모리는 페이지라고 불리는 고정된 크기의 블록으로 나누어진다. 운영 체제는 이 페이지들을 물리적 메모리와 스왑 공간 사이에서 이동시키며 관리한다.
페이지 테이블: 가상 주소를 물리적 주소로 매핑하는 데 사용되는 데이터 구조이다. 프로세스마다 각각의 페이지 테이블을 가지며, CPU는 이 테이블을 사용하여 메모리 접근 시 가상 주소를 물리적 주소로 변환한다.
스왑 공간: 시스템의 메인 메모리가 부족할 때, 일부 데이터를 보조 저장 장치에 임시로 저장하는 공간이다. 스왑 아웃(메모리에서 스왑 공간으로 이동)된 페이지는 필요시 다시 스왑 인(스왑 공간에서 메모리로 이동)될 수 있다.
메모리 오버커밋: 프로세스가 사용할 수 있는 메모리 양을 물리적 메모리의 크기를 넘어서 확장할 수 있다. 이를 통해 시스템의 메모리 사용 효율성을 높일 수 있다.
프로세스 격리: 각 프로세스가 독립된 가상 주소 공간을 가지므로, 한 프로세스의 메모리 오류가 다른 프로세스에 영향을 미치지 않는다.
메모리 보호: 운영 체제는 페이지 테이블을 통해 특정 메모리 영역에 대한 접근 권한(읽기, 쓰기, 실행)을 제어할 수 있다. 이를 통해 안전한 메모리 접근을 보장한다.
페이지 폴트(Page Fault)는 프로세스가 접근하려는 데이터가 물리적 메모리(RAM)에 없을 때 발생하는 이벤트이다. 프로세스는 가상 메모리를 통해 메모리에 접근한다. 가상 메모리 시스템은 이 가상 주소 공간을 물리적 메모리와 보조 저장 장치(스왑 공간 또는 디스크)에 저장된 페이지로 나누어 관리한다. 프로세스가 특정 페이지에 접근하려고 할 때, 해당 페이지가 물리적 메모리에 없으면, 운영 체제는 페이지 폴트를 발생시키고 필요한 조치를 취한다.
페이지 폴트 감지: CPU는 페이지 테이블을 참조하여 가상 주소를 물리적 주소로 변환하려고 시도한다. 페이지 테이블에서 해당 페이지가 물리적 메모리에 존재하지 않는다고 표시되어 있으면 페이지 폴트가 발생한다.
인터럽트 발생: 페이지 폴트가 감지되면, CPU는 운영 체제에 인터럽트를 발생시켜 제어를 넘긴다.
스왑 공간 또는 디스크에서 페이지 로드: 운영 체제는 필요한 페이지를 스왑 공간이나 디스크에서 찾아 물리적 메모리로 로드한다. 만약 물리적 메모리가 가득 차 있으면, 운영 체제는 다른 페이지를 스왑 아웃하여 공간을 확보할 수 있다.
페이지 테이블 업데이트: 새로 로드된 페이지의 주소를 페이지 테이블에 업데이트하고, 이 페이지가 이제 물리적 메모리에 존재한다고 표시한다.
프로세스 재개: 모든 처리가 완료되면, 운영 체제는 프로세스의 실행을 재개한다. 프로세스는 마치 아무 일도 일어나지 않은 것처럼 해당 데이터에 접근할 수 있다.
마이너 페이지 폴트(Minor Page Fault): 요청된 페이지가 물리적 메모리 내에는 있지만, 페이지 테이블에는 아직 매핑되지 않은 경우 발생한다. 이 경우, 디스크 I/O 없이 페이지 테이블만 업데이트하면 된다.
메이저 페이지 폴트(Major Page Fault): 요청된 페이지가 물리적 메모리에 존재하지 않고, 디스크나 스왑 공간에서 물리적 메모리로 로드해야 할 때 발생한다. 이 과정에서 디스크 I/O가 발생하므로 처리 시간이 더 길어진다.
요구 페이징은 가상 메모리 시스템에서 사용되는 메모리 관리 기법 중 하나로, 프로그램 실행 과정에서 실제로 필요할 때까지 페이지를 메모리에 로드하지 않는 방식이다. 즉, 프로세스가 특정 메모리 페이지에 접근하려고 시도할 때 해당 페이지가 물리적 메모리에 없으면, 그제서야 운영 체제가 해당 페이지를 디스크에서 찾아 물리적 메모리로 가져오는 방식을 말한다. 이를 통해 메모리 사용의 효율성을 극대화하고, 시스템의 전반적인 성능을 향상시킬 수 있다.
Copy-On-Write (COW)는 메모리 관리에서 사용되는 기법 중 하나이다. 이 기법은 데이터의 복사본을 생성할 때, 실제 복사 동작을 데이터가 수정될 때까지 지연시키는 방식을 말한다. 즉, 데이터를 공유하는 여러 프로세스가 있을 때, 해당 데이터가 읽기 전용으로만 사용되고 있다면, 실제 데이터의 복사본을 만들지 않고 원본 데이터를 공유한다. 데이터에 쓰기 작업이 발생하는 순간에만 해당 부분의 데이터를 복사하여 새로운 공간에 저장한다.
메모리 사용 최적화: COW 기법을 사용하면, 불필요한 데이터 복사를 피할 수 있어 메모리 사용량을 크게 줄일 수 있다. 데이터의 변경이 필요한 시점에만 복사가 발생하기 때문이다.
프로세스 생성 성능 향상: Unix와 같은 운영 체제에서는 프로세스를 생성할 때 fork 시스템 호출을 사용하는데, COW 기법을 활용하면 fork된 새 프로세스가 부모 프로세스의 메모리 페이지를 공유할 수 있다. 실제로 데이터를 수정할 필요가 있을 때만 페이지를 복사하기 때문에, 프로세스 생성 시간과 메모리 사용량이 절약된다.
데이터 접근 및 수정의 효율성: 공유되는 데이터에 대한 읽기 접근이 많고 쓰기 접근이 적은 경우, COW는 데이터 접근 및 수정을 보다 효율적으로 만든다.
초기 상태: 두 프로세스가 동일한 메모리 페이지(예: 데이터)를 공유하고 있으며, 이 페이지는 읽기 전용으로 표시된다.
쓰기 시도: 하나의 프로세스가 공유된 데이터를 수정하려고 시도할 때, 운영 체제는 페이지 폴트를 발생시킨다.
데이터 복사 및 수정: 운영 체제는 쓰기를 시도한 프로세스를 위해 데이터의 복사본을 새로운 메모리 페이지에 생성하고, 이 페이지에 대한 쓰기 작업을 수행한 후, 해당 프로세스의 페이지 테이블을 업데이트하여 새로운 페이지를 가리키도록 한다.
독립적 수정: 이후에는 각 프로세스가 자신만의 데이터 복사본을 가지고 독립적으로 데이터를 수정할 수 있다.
스왑(Swap)은 컴퓨터 시스템에서 사용되는 메모리 관리 기법 중 하나로, 물리적 메모리(RAM)의 용량을 초과하는 데이터를 저장하기 위해 하드 드라이브나 SSD와 같은 보조 저장 장치의 일부 공간을 사용하는 것을 말한다. 이 기법은 운영 체제가 더 많은 프로그램과 데이터를 동시에 처리할 수 있도록 해주며, 시스템의 전반적인 성능과 효율성을 개선하는 데 도움을 준다.
스왑 공간(Swap Space): 보조 저장 장치에 할당된, 가상 메모리의 일부로 사용되는 공간이다. 이 공간은 물리적 메모리를 확장하는 역할을 하며, 메모리가 부족할 때 사용된다.
스왑 인(Swap In)과 스왑 아웃(Swap Out): 운영 체제는 필요한 데이터를 메모리 페이지 단위로 물리적 메모리와 스왑 공간 사이에서 이동시킨다. 이 과정에서 메모리에 없는 데이터를 요청하는 경우(페이지 폴트), 해당 데이터를 스왑 공간에서 물리적 메모리로 가져오는 것을 '스왑 인'이라고 한다. 반대로, 메모리를 확보하기 위해 사용 중인 페이지를 스왑 공간으로 이동시키는 것을 '스왑 아웃'이라고 한다.
메모리 용량 확장: 스왑을 사용함으로써 물리적 메모리보다 큰 용량의 데이터와 프로그램을 처리할 수 있게 된다.
시스템 안정성 개선: 메모리가 부족할 때 스왑 공간을 사용함으로써 시스템의 안정성을 유지할 수 있다.
멀티태스킹 향상: 다수의 프로그램을 동시에 실행할 때 스왑 공간이 활용되어, 멀티태스킹 성능이 개선된다.
스왑 공간 크기 조정: 시스템의 메모리 사용 패턴과 요구 사항에 따라 스왑 공간의 크기를 조정할 수 있다.
스왑 우선순위 설정: 다중 스왑 공간을 사용하는 경우, 각 스왑 공간에 우선순위를 설정하여 효율적인 스와핑을 관리할 수 있다.
스왑 활동 모니터링: 시스템의 스왑 활동을 모니터링하여 과도한 스와핑이 발생하는지 확인하고, 필요한 조치를 취할 수 있다.
스래싱(Thrashing)은 시스템이 너무 많은 시간을 메모리 페이지의 스왑 인(Swap In)과 스왑 아웃(Swap Out) 작업에 소비하면서 실제 유용한 작업을 수행하는 데 필요한 CPU 시간이 상대적으로 매우 적어지는 상황을 가리킨다. 결과적으로, 시스템의 전반적인 성능이 급격히 저하되며, 사용자와 응용 프로그램은 시스템이 멈춘 것처럼 느끼게 된다.
계층형 페이지 테이블(Hierarchical Page Tables)은 컴퓨터 시스템의 메모리 관리를 위한 가상 메모리 시스템에서 사용되는 데이터 구조이다. 이 구조는 가상 주소를 물리적 주소로 매핑하는 과정을 효율적으로 관리하기 위해 설계되었다. 크게 성장하는 메모리 요구와 더불어, 모든 가상 주소와 물리적 주소 매핑을 단일 테이블에 저장하는 것은 비효율적이다. 계층형 페이지 테이블은 이러한 문제를 해결하기 위해 도입되었다.
계층형 페이지 테이블은 여러 레벨로 구성되며, 각 레벨은 가상 주소를 구분하는 데 사용되는 페이지 디렉토리와 페이지 테이블을 포함한다. 가장 일반적인 구조는 2단계 페이지 테이블이지만, 시스템의 구조와 요구에 따라 3단계 또는 4단계로 확장될 수 있다.
가상 주소 분해: 가상 주소는 여러 부분으로 나뉜다. 각 부분은 페이지 테이블의 다른 레벨을 인덱싱하는 데 사용된다. 예를 들어, 2단계 페이지 테이블에서 첫 번째 부분은 페이지 디렉토리를 인덱싱하고, 두 번째 부분은 실제 페이지 테이블을 인덱싱한다.
레벨별 탐색: CPU는 가상 주소의 첫 번째 부분을 사용하여 페이지 디렉토리를 탐색한다. 이 디렉토리는 실제 페이지 테이블의 위치를 가리키는 엔트리를 포함한다. 그 다음, 가상 주소의 두 번째 부분을 사용하여 해당 페이지 테이블 내에서 실제 물리적 주소를 찾는다.
물리적 메모리 접근: 최종적으로 찾아진 물리적 주소는 실제 메모리에 접근하는 데 사용된다.
Huge Page는 컴퓨터 시스템의 메모리 관리에서 사용되는 특별한 페이지 기법이다. 전통적인 메모리 페이지 크기(예: 4KB)보다 훨씬 큰 메모리 페이지를 사용하여, 큰 메모리 영역을 관리하는 데 드는 오버헤드를 줄이고 성능을 개선하는 데 도움이 된다.
TLB 효율성 증가: TLB(Translation Lookaside Buffer)는 가상 주소를 물리적 주소로 매핑하는 정보를 캐시하는 하드웨어이다. Huge Page를 사용하면, 더 큰 메모리 영역을 하나의 TLB 엔트리로 커버할 수 있어서 TLB 히트율이 향상되고, 메모리 접근 시간이 줄어든다.
페이지 테이블 오버헤드 감소: 전통적인 작은 페이지 크기를 사용할 때에 비해, Huge Page는 전체 메모리를 매핑하기 위한 페이지 테이블의 크기를 줄여준다. 이는 메모리 관리에 필요한 데이터 구조의 오버헤드를 감소시키고, 메모리 사용 효율을 높인다.
성능 개선: 특히 대용량 데이터를 처리하는 응용 프로그램이나 데이터베이스 시스템에서 Huge Page를 사용하면 메모리 접근 패턴이 개선되어 전체 시스템의 성능이 증가할 수 있다.