메인 메모리와 메모리 관리 (Main Memory)

한눈에 보기

CPU가 직접 읽고 쓰는 메인 메모리와 이를 여러 프로세스에 나누는 메모리 관리를 다룬다. 논리 주소와 물리 주소, MMU, 연속 할당과 단편화, 스와핑과 가상 메모리, 버디 시스템까지 정리한다.

최종 업데이트 2026.09.17

메인 메모리(Main Memory)는 CPU가 명령어와 데이터를 직접 읽고 쓸 수 있는 실행의 무대이며, 메모리 관리는 이 한정된 공간을 여러 프로세스에 안전하고 효율적으로 나누어 주는 운영체제의 핵심 기능이다. 프로그램은 디스크에 있는 동안에는 실행될 수 없고 메모리에 적재되어야 CPU가 실행할 수 있다. 운영체제는 주소 변환, 보호, 할당 정책을 통해 각 프로세스가 서로 침범하지 않고 메모리를 쓰도록 관리한다.

메모리 계층에서 메인 메모리의 위치

저장 장치는 속도와 용량이 반비례하는 계층 구조를 이룬다. 레지스터와 CPU 캐시(cache)는 매우 빠르지만 작고, 메인 메모리(DRAM)는 그보다 크지만 느리며, SSD와 디스크는 크지만 훨씬 느리다. CPU가 직접 접근하는 것은 레지스터, 캐시, 메인 메모리까지이고, 디스크의 내용은 반드시 메모리를 거쳐야 한다. 메모리 접근도 CPU 연산에 비하면 수백 배 느리기 때문에 캐시 적중률이 성능을 좌우하며, 운영체제와 하드웨어는 이 계층 사이의 데이터 이동을 최대한 숨기려고 노력한다. 대표적인 장치가 페이지 캐시(page cache)다. 커널은 디스크에서 읽은 파일 데이터를 남는 메모리에 캐싱해 두어 같은 파일을 다시 읽을 때 디스크 접근을 생략하고, 쓰기도 일단 메모리에 반영한 뒤 나중에 모아서 디스크로 내리는 지연 쓰기(write-back)를 한다. 리눅스에서 free 명령의 가용 메모리가 생각보다 적어 보이는 이유가 이 캐시 때문이며, 캐시는 응용이 메모리를 요구하면 즉시 회수되므로 낭비가 아니다.

논리 주소와 물리 주소, MMU

CPU가 실행 중에 생성하는 주소는 논리 주소(logical address, 가상 주소)이고, 실제 메모리 하드웨어의 위치는 물리 주소(physical address)다. 둘 사이의 변환은 메모리 관리 장치(MMU, Memory Management Unit)라는 하드웨어가 실행 시간에 수행한다. 이 분리 덕분에 프로그램은 자신이 메모리 어디에 적재될지 몰라도 되고, 운영체제는 프로세스를 메모리의 아무 곳에나 배치하거나 옮길 수 있다. 가장 단순한 형태는 기준 레지스터(base register)와 한계 레지스터(limit register)를 쓰는 방식이다. 논리 주소에 기준 값을 더해 물리 주소를 만들고, 한계를 넘는 접근은 트랩을 발생시켜 차단한다. 이것이 메모리 보호의 원형이며, 현대 시스템은 이를 페이징(paging)으로 일반화했다.

연속 할당과 단편화

초기 방식은 프로세스마다 연속된 메모리 구간을 통째로 주는 연속 할당(contiguous allocation)이었다. 빈 구간(hole)이 여러 개일 때 어디에 넣을지에 따라 최초 적합(first fit), 최적 적합(best fit), 최악 적합(worst fit) 전략이 있다. 이 방식의 근본 문제가 단편화(fragmentation)다.

구분외부 단편화(External)내부 단편화(Internal)
정의빈 공간 총합은 충분한데 조각나 있어 할당하지 못하는 현상할당 단위보다 요청이 작아 할당된 블록 내부가 남는 현상
발생 상황가변 크기 연속 할당, 세그먼테이션고정 크기 분할, 페이징
완화 방법압축(compaction) 또는 페이징 도입할당 단위(페이지 크기)를 작게 조정

외부 단편화를 없애려고 프로세스들을 한쪽으로 몰아 붙이는 압축은 비용이 크므로, 현대 운영체제는 메모리를 고정 크기 페이지로 쪼개 아무 프레임에나 배치하는 페이징으로 문제를 우회한다. 대신 페이지 단위 할당에 따른 소량의 내부 단편화는 감수한다.

스와핑과 가상 메모리로의 확장

메모리가 부족하면 운영체제는 당장 실행하지 않는 프로세스의 메모리를 디스크의 스왑(swap) 영역으로 내보내고 필요할 때 다시 들여온다. 고전적 스와핑은 프로세스 전체를 통째로 오가게 했지만, 현대 시스템은 페이지 단위로 내보내는 요구 페이징(demand paging)과 결합해 훨씬 세밀하게 동작한다. 이렇게 하면 프로세스는 물리 메모리보다 큰 주소 공간을 가질 수 있는데, 이것이 가상 메모리(virtual memory)다. 자주 쓰는 페이지만 메모리에 두고 나머지는 디스크에 두므로 더 많은 프로세스를 동시에 올릴 수 있다. 다만 페이지가 디스크에 있을 때 발생하는 페이지 폴트(page fault) 처리는 메모리 접근보다 수만 배 느리므로, 폴트가 잦아지면 시스템이 페이지 교체에만 매달리는 스래싱(thrashing)에 빠질 수 있다.

운영체제 안의 메모리 할당자

커널 내부와 사용자 라이브러리 수준에서도 메모리 할당 정책이 있다. 커널은 페이지 프레임을 2의 거듭제곱 단위로 묶어 관리하는 버디 시스템(buddy system)으로 외부 단편화를 억제하고, 자주 쓰는 작은 객체는 슬랩 할당자(slab allocator)로 캐싱해 할당 비용을 줄인다. 사용자 공간에서는 malloc 계열 할당자가 힙(heap)을 관리하며, 요청 크기별 빈(bin) 관리와 스레드별 캐시로 속도와 단편화 사이에서 균형을 잡는다. 면접에서 메모리 관리라고 하면 이 여러 층이 함께 동작한다는 그림을 그릴 수 있어야 한다.

면접에서 이렇게 물어본다

  • 논리 주소와 물리 주소의 차이, 그리고 MMU가 하는 일을 설명해 보라.
  • 내부 단편화와 외부 단편화를 구분하고 페이징이 어느 쪽을 어떻게 해결하는지 말해 보라.
  • 최초 적합, 최적 적합, 최악 적합 전략의 차이와 각각의 문제점은 무엇인가.
  • 스와핑과 요구 페이징의 관계를 설명하고 스래싱이 왜 발생하는지 말해 보라.
  • 메모리 계층 구조가 존재하는 이유와 캐시가 성능에 미치는 영향을 설명해 보라.
운영체제 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기