승코딩당당당

[리눅스] 리눅스 커널: 메모리 본문

개발/임베디드

[리눅스] 리눅스 커널: 메모리

승코딩당당당 2026. 2. 12. 17:27

 

운영체제에서 메모리와 주소(Address)는 프로세스 실행과 자원 관리의 핵심 개념이다.

 

프로그램은 메모리에 저장되고, CPU는 주소(Address)를 통해 해당 메모리 위치에 접근한다.
리눅스에서는 논리 주소, 선형 주소(가상 주소), 물리 주소의 개념을 구분하며,
가상 메모리 시스템을 통해 프로세스마다 독립적인 주소 공간을 제공한다.

 

또한 리눅스는

  • 가상 주소 공간(Virtual Address Space)
  • 메모리 보호(Memory Protection)
  • 메모리 매핑(mmap)
  • Demand Paging
  • Copy On Write(COW)
  • Swapping

과 같은 메모리 관리 기법을 통해 제한된 물리 메모리를 효율적으로 사용하도록 설계되어 있다.

 

본 글에서는 메모리와 주소의 기본 개념부터 리눅스의 가상 메모리 구조, 주소 변환 과정, Demand Paging과 COW, 그리고 스와핑과 LRU 정책까지 운영체제 메모리 관리의 전반적인 흐름을 정리한다.

 


 

메모리와 주소(Address)

  • 메모리
    • 프로그램과 데이터를 저장하는 공간
    • 메모리의 위치를 지정하기 위해서는 주소(Address) 사용
  • 메모리 주소
    • 메모리 셀(Cell)의 내용에 대한 접근 위치 지정
    • 일반적으로 물리 주소를 칭하는 경우가 많음

 

리눅스의 주소(Address)

  • 논리 주소(Logical Address)
    • 실제 CPU가 기계어 상에서 사용하는 주소
  • 선형 주소(Linear Address)
    • CPU가 사용하는 4GB 영역까지의 액세스 가능한 주소
    • 가상(Virtual)적으로 할당하여 프로그램에서 사용하는 주소
  • 물리 주소(Physical Address)
    • 메모리 칩의 메모리 셀의 위치를 지정
    • 주소 버스로 전달되는 전기적 신호

 

프로세스의 메모리 사용

  • 프로세스별 개별적인 주소 공간 사용
    • 개별적으로 코드, 데이터 및 스택 영역을 할당하여 사용
    • 메모리 디스크립터
      • 프로세스 디스크립터(task_struct)의 mm 필드에 저장되어 프로세스에서 사용하는 메모리 정보를 표시한다.
      • start_code, end_code, start_data, end_data, arg_start, …
  • 함수 malloc()
    • 프로세스는 동적 영역(heap)을 확장하여 메모리를 할당하여 사용 가능
  • 프로세스 간 공유 메모리 사용 가능
  • 시스템 콜 mmap() 지원
    • 파일의 일부나 장치의 메모리를 프로세스의 주소 공간의 일부로 매핑하여 사용

 

리눅스의 메모리 관리

  • 가상 주소 공간 사용(Virtual Address Space)
    • 실제 가지고 있는 메모리보다 큰 메모리 공간을 가지고 있는 것처럼 사용할 수 있게 해 준다.
  • 메모리 보호(Memory Protection)
    • 각 프로세스는 각각의 가상 메모리를 가지고 사용된다.
    • 가상 메모리를 사용하는 경우에는 자신 이외의 다른 프로세스는 동일한 메모리 공간을 참조할 수 없어 메모리가 완전히 독립되어 보호된다.
  • 메모리 매핑(Memory Mapping)
    • text와 데이터 파일을 프로세스의 가상 주소 공간으로 주소를 매핑하여 사용
  • 물리 메모리의 공정한 할당
    • 공유 메모리를 여러 프로세스가 공정하게 사용할 수 있도록 한다.
  • 공유(Shared) Virtual 메모리
    • 프로세스 간에 메모리 공유를 위한 방법을 제공

 

물리 주소 공간의 조각화

  • 세그멘테이션과 페이지는 물리 주소 공간을 쪼갠다
  • 세그멘테이션
    • 각각의 프로세스에 다른 선형 주소 공간 할당
    • 프로그램을 코드, 전역 데이터, 지역 데이터 영역 같은 논리적인 부분으로 쪼갠다
  • 페이지
    • 똑같은 선형 주소 공간을 일정한 크기로 쪼개고, 다른 물리 주소 공간에 매핑하여 사용
    • 페이지 프레임(page frame) 또는 물리적 페이지(physical page)
      • 고정된 길이의 메모리
      • 각 페이지 프레임에 페이지가 하나씩 할당
      • 각 페이지는 고유한 번호를 부여받는다

 

주소 변환

  • 가상 주소를 물리 주소로 쉽고 빠르게 하기 위하여 캐시와 유사한 구조의 고속 메모리 장치 사용
    • ex. ARM의 TLB

 

프로세스와 메모리 접근

  1. 프로세스에서 메모리 접근
  2. 페이지 프레임 번호를 가지고 페이지 테이블에서 정보를 가져온다
  3. 물리 메모리의 해당 페이지에서 offset 위치를 접근한다

 

Demand Paging

  • Demand Paging
    • 프로세스가 시작하면서 모든 페이지 프레임을 할당하여 사용하지 않고, 일부 페이지 프레임만 할당하여 사용하다가 새로운 프레임의 요구가 있을 때 새로운 페이지 프레임을 할당하여 사용
  • Demand Paging의 원리
    • 프로세스가 처음부터 자신의 메모리 공간에 있는 모든 영역에 접근하지 않는다
    • 지역성 원리(Locality Principle)
      • 프로그램은 실행되는 각 단계에서 프로세스 페이지의 일부만 사용
  • 장점
    • 동일한 메모리의 양으로 더 많은 작업을 처리할 수 있다

 

Copy On Write (COW)

  • Copy On Write
    • 자식 프로세스를 생성할 때 모든 페이지 프레임을 복사하지 않고 부모 프로세스와 자식 프로세스 간에 페이지 프레임을 공유하고 있다가 부모나 자식 프로세스가 공유된 페이지 프레임에 쓸(Write) 때 페이지 프레임을 복사(Copy)하여 새로운 페이지 프레임을 만드는 방식
  • COW의 장점
    • 메모리 접근을 줄이고 CPU의 사용량을 줄일 수 있다

 

스와핑 (Swapping)

  • 디스크의 일부 공간을 RAM의 확장으로 사용
  • 스와핑을 사용하는 목적
    • 프로세스가 실제로 사용할 수 있는 주소 공간 확장
    • 프로세스를 적재할 동적 RAM 공간 확장
  • 스왑 아웃과 스왑 인
    • 스왑 아웃(Swap Out)
      • 커널이 빈 메모리를 계속 감시하다가 고정된 값보다 적어지면 프로세스 주소 공간을 디스크에 복사한다
    • 스왑 인(Swap In)
      • 스케줄링에서 스왑 아웃된 프로세스를 선택하면 프로세스를 디스크로부터 읽어 온다
  • 스와핑 단위
    • 프로세스 단위가 아닌 작은 페이지 단위로 스와핑

 

스왑 아웃

  • 커널 스레드 kswapd
    • 빈 페이지 프레임이 미리 정의한 기준치보다 작아질 때마다 1초 간격으로 스왑 아웃 수행
  • 스왑 아웃되는 페이지
    • 가장 많은 페이지를 소유한 프로세스의 페이지를 회수
    • LRU(Least Recently Used)
      • 가장 오랜 시간 동안 사용하지 않는 페이지를 스왑 아웃
  •