메모리 관리 전략을 이해하는 건 백엔드 개발자에게 꼭 필요하다.
효율적인 메모리 관리는 애플리케이션 성능을 높이고,
자원을 아끼는 데 큰 도움이 되기 때문이다.
서버는 동시에 많은 사용자 요청을 처리해야 하기 때문에,
메모리 할당과 회수를 잘 관리하는 게 성능과 안정성에 직접적인 영향을 준다.
메모리 관리를 통해 메모리 누수 같은 문제를 예방해
시스템의 장기적인 안정성을 보장할 수 있다
그럼 메모리 관리 전략에 대해서 알아보자.
메모리 관리의 중요성
컴퓨터 시스템에서 메모리 관리는 핵심적인 역할을 수행한다. 모든 컴퓨터 응용 프로그램은 실행을 위해 메모리를 필요로 하며, 이를 효율적으로 관리하는 것이 시스템의 성능과 안정성을 결정짓는 중요한 요소다. 메모리 관리는 사용 가능한 메모리 리소스를 할당하고, 불필요하게 되거나 사용이 끝난 메모리를 회수하는 과정을 포함한다. 효율적인 메모리 관리 없이는 시스템이 느려질 뿐만 아니라, 프로그램 충돌이나 시스템 실패와 같은 심각한 문제를 경험할 수 있다.
연속 메모리 할당
연속 메모리 할당은 프로세스 전체가 메모리의 연속적인 블록에 할당되어야 하는 메모리 관리 기법이다. 이 방법은 초기의 간단한 운영체제에서 주로 사용되었으며, 구현이 쉬운 편이다. 연속 메모리 할당의 가장 큰 단점은 외부 단편화다. 외부 단편화는 할당되지 않은 메모리 공간이 작은 블록으로 분산되어 있어 사용할 수 없게 되는 현상을 말하며, 연속 할당의 대표적인 방법으로는 최초적합, 최적적합, 최악적합, 다음적합이 있다.
최초,최적,최악,다음 적합 알고리즘
연속 메모리 할당 방법 중에 일반적으로 언급되는 네 가지 fit 알고리즘은 최초적합(first fit), 최적적합(best fit), 최악적합(worst fit) 다음 적합(next fit) 이라는 방법이 있다.
- 최초적합 (First Fit): 메모리의 시작 부분부터 탐색하여 처음 발견한 충분히 큰 빈 공간에 프로세스를 할당한다. 이 방법은 상대적으로 빠르지만, 메모리 앞부분에 자주 프로세스를 할당하게 되어 결국에는 그 지역에 작은 빈 공간들이 많이 생기는 외부 단편화를 초래할 수 있다.
- 최적적합 (Best Fit): 전체 메모리를 검색하여 요구하는 메모리 크기와 가장 잘 맞는 가장 작은 공간에 프로세스를 할당한다. 이 이론적으로는 메모리를 가장 효율적으로 사용할 수 있게 하지만, 매번 가장 작은 빈 공간을 찾기 위해 더 많은 검색 시간이 필요하고, 매우 작은 메모리 조각들이 많이 발생할 수 있다.
- 최악적합 (Worst Fit): 전체 메모리를 검색하여 요구하는 크기보다 큰 가장 큰 빈 공간에 프로세스를 할당한다. 이 방법은 이론적으로 더 큰 빈 공간을 남기기 때문에 더 큰 프로세스를 위한 공간을 보장할 수 있다고 여겨지지만, 실제로는 큰 빈 공간을 불필요하게 소모하고 외부 단편화를 가속화할 수 있다.
- 다음 적합 (Next Fit): 최초적합과 유사하게 작동하지만, 메모리의 시작 부분에서부터 탐색하는 대신, 마지막으로 메모리를 할당한 위치부터 다음 할당을 위해 탐색을 시작한다. 이 방법은 최초적합보다 탐색 시간을 줄일 수 있으며, 메모리 사용을 더 균등하게 분포시킬 수 있다.
페이징
페이징은 메모리를 효율적으로 관리하기 위해 가상 메모리와 물리적 메모리를 고정된 크기의 블록(페이지와 페이지 프레임)으로 나누는 메모리 관리 기법이다. 이 기법의 핵심은 가상 메모리 주소를 물리적 메모리 주소로 변환하는 과정에서 페이지 테이블을 이용한다는 점이다.
페이징의 가장 큰 장점은 외부 단편화 문제를 완전히 해결할수 있다는 것이다. 페이지는 크기가 일정하기 때문에, 남는 공간이 작은 조각으로 나뉘는 외부 단편화가 발생하지 않는다. 또 다른 장점은 다중 프로세스 환경에서 각 프로세스의 메모리 영역을 안전하게 격리할 수 있다는 거다. 이런 특징 덕분에 메모리를 유연하게 활용하면서도 안정적인 시스템 구성이 가능하다.
스와핑
스와핑은 프로세스 전체를 물리적 메모리에서 디스크의 스왑 공간으로 이동시키거나, 다시 메모리로 가져오는 과정이다. 이는 시스템이 메모리 부족 상황에 처했을 때, 실행 중인 프로세스가 물리적 메모리를 사용할 수 있도록 공간을 확보하기 위해 사용된다.
작동 방식
- 프로세스가 메모리에 적재될 필요가 없어지면, 프로세스 전체를 디스크의 스왑 영역으로 이동(스왑 아웃)시킴.
- 스왑된 프로세스는 더 이상 실행 상태가 아니며, 대기 상태(blocked)로 전환.
- 실행할 차례가 되면 디스크에서 메모리로 다시 적재(스왑 인)해야 프로세스가 재개될 수 있음.
특징
- 프로세스 단위로 작업함.
- 스와핑 과정은 상대적으로 크고 비용이 많이 드는 작업(전체 프로세스 이동)이라, 오래 걸릴 수 있음.
- 현대 운영체제에서는 스와핑이 덜 일반적이고, 페이징 같은 더 세분화된 메모리 관리 기법이 주로 사용됨.
페이징에서의 스와핑
페이징에서의 스와핑은 프로세스의 일부 페이지(작은 단위)를 디스크로 내보내거나 다시 불러오는 작업이다. 이는 프로세스 전체를 이동시키는 스와핑과 달리, 필요한 페이지들만 물리적 메모리에 적재하여 메모리 효율을 극대화하기 위한 기법이다.
작동 방식
- 페이지 아웃: 물리적 메모리가 부족하거나, 사용되지 않는 페이지(참조되지 않은 페이지)를 디스크의 스왑 영역으로 이동.
- 페이지 인: 해당 페이지가 다시 필요해질 때, 디스크에서 물리적 메모리로 가져옴.
특징
- 페이지 단위로 작업함.
- 페이징에서의 스와핑은 작은 단위로 작업하므로, 프로세스 전체를 디스크로 내보내지 않고도 실행을 이어갈 수 있음.
- 페이지 교체 알고리즘(예: FIFO, LRU, LFU)을 통해 어떤 페이지를 페이지 아웃할지 결정함.
- 현대 운영체제의 가상 메모리 관리에서 중요한 역할을 함.
페이지 테이블
페이징 시스템에서 페이지 테이블은 가상 메모리와 물리적 메모리 간의 매핑 정보를 저장하는 핵심 데이터 구조다. 프로세스가 실행될 때, CPU는 가상 주소를 물리 주소로 변환해야 하고, 이 변환 작업을 페이지 테이블이 담당한다. 페이지 테이블 없이는 가상 메모리와 물리적 메모리 간의 매핑을 효율적으로 관리할 수 없다.
설명 하자면 페이징은 프로세스를 일정하게 페이지단위로 쪼갠다. 그러나 모든 페이지를 실행시키는 것이 아닌 필요한 페이지는 메모리에 남겨두고 필요없는 페이지는 페이지 아웃한다. 그러나 지금 필요없는 페이지가 꾸준히 필요없는것이 아니기 때문에 필요없던 페이지가 필요해졌을때 빠르게 물리메모리에 올려 실행하기 위해 그 필요없던 페이지가 가상 메모리의 어느부분에 있었는지의 주소가적힌 페이지 테이블이 필요해지는 것이다.
페이지 테이블이 없다면 모든 디스크와 메모리를 뒤져가며 페이지들과 데이터들 사이를 누비며 모래사장에서 바늘찾기를 해야하는것이다.
페이지 테이블 엔트리에 포함된 주요 정보
페이지 테이블의 각 항목은 페이지 테이블 엔트리(Page Table Entry, PTE) 라고 불리고, 가상 주소와 물리 주소 간의 매핑 정보뿐만 아니라 다양한 관리 정보를 담고 있다. 주요 구성 요소는 다음과 같다.
페이지 번호(Page Number)
- 가상 주소의 상위 비트를 사용해 가상 페이지 번호를 나타냄.
- CPU가 요청한 가상 주소에서 어떤 페이지인지 식별하기 위해 사용.
프레임 번호(Frame Number)
- 페이지가 실제로 저장된 물리적 메모리의 프레임 번호를 나타냄.
- 페이지 번호를 통해 특정 페이지가 물리 메모리의 어느 위치에 저장되었는지 확인 가능.
유효 비트(Valid Bit)
- 해당 페이지가 현재 물리 메모리에 존재하는지 나타냄.
- 1: 페이지가 메모리에 있음.
- 0: 페이지가 디스크(스왑 영역)에 있음.
수정 비트(Dirty Bit)
- 페이지가 물리 메모리에 로드된 이후 수정되었는지를 나타냄.
- 1: 페이지가 수정되었음. 스왑 아웃 시 디스크에 저장해야 함.
- 0: 수정되지 않음.
참조 비트(Reference Bit)
- 페이지가 최근에 참조되었는지를 나타냄.
- 페이지 교체 알고리즘에서 참조 비트를 활용해 교체 대상을 선정함.
보호 비트(Protection Bit)
- 페이지에 대한 접근 권한(읽기, 쓰기, 실행 가능 여부)을 제어함.
- 잘못된 접근(예: 읽기 전용 페이지에 쓰기 시도)을 방지하고, 메모리 안전성을 강화.
TLB: 메모리접근 최적화
페이지 테이블은 메모리 관리에서 필수적이지만, 매번 페이지 테이블을 조회하려면 속도 저하가 발생할 수 있다. CPU가 물리주소를 찾으러 메모리에 한번 다녀오고, 또 데이터를 가져오기위해서 메모리에 접근해야 하기때문에 총 2번 메모리에 접근하는 과정이 속도저하를 일으킨다. 이를 해결하기 위해 변환 색인 버퍼(TLB, Translation Lookaside Buffer)가 사용된다.
TLB의 역할
- TLB는 페이지 테이블의 일부를 캐싱하여 가상 주소를 물리 주소로 빠르게 변환하도록 도와주는 고속 메모리 캐시야.
- CPU가 가상 주소를 요청하면, TLB에서 먼저 해당 페이지의 매핑 정보를 조회해.
- TLB 히트: 필요한 정보가 TLB에 있을 경우, 페이지 테이블에 접근하지 않고 바로 물리 메모리에 접근 가능.
- TLB 미스: 필요한 정보가 TLB에 없으면 페이지 테이블을 조회한 후, 정보를 TLB에 저장.
TLB와 페이지 테이블의 상호작용
- CPU가 가상 주소를 요청 → TLB 조회.
- TLB에서 매핑 정보를 찾으면(TLB 히트) 곧바로 물리 메모리에 접근.
- TLB에 정보가 없으면(TLB 미스), 페이지 테이블에서 매핑 정보를 조회한 후, TLB에 추가.
- 만약 페이지 테이블에도 정보가 없으면, 페이지 폴트가 발생하여 디스크에서 페이지를 로드.
'CS > 운영체제' 카테고리의 다른 글
멀티 스레드 VS 멀티 프로세스 (1) | 2025.02.03 |
---|---|
PCB? (0) | 2025.01.21 |
리눅스 vs 윈도우 (0) | 2025.01.21 |
시스템 호출? (0) | 2025.01.17 |
인터럽트? (0) | 2025.01.15 |