프로그래밍공부(Programming Study)/운영체제(OS)

메모리 구조와 관리의 모든 것: 힙, 스택, 세그먼트와 할당자 및 가상 메모리까지

Chann._.y 2024. 12. 7.
728x90

1. 메모리 구조 개요

컴퓨터의 메모리는 프로그램의 실행과 데이터 관리를 위해 다양한 영역으로 나뉘어 운영됩니다. 각 영역은 특정 역할을 담당하며, 다음과 같은 주요 구성 요소로 나뉩니다:

  • 코드(Code) 세그먼트
  • 데이터(Data) 세그먼트
  • 힙(Heap)
  • 스택(Stack)

이러한 구조는 프로세스와 운영체제가 효율적으로 협력해 시스템 리소스를 관리하는 데 필수적입니다.


2. 힙(Heap)과 스택(Stack)의 차이

특징 스택(Stack) 힙(Heap)
메모리 위치 고정된 크기, 선형적으로 증가/감소 유동적 크기, 할당/해제에 따라 확장
할당 방식 LIFO (Last-In-First-Out) 동적 할당 (Dynamic Allocation)
속도 빠름 느림
사용 목적 함수 호출 시 변수 저장 객체 및 데이터 저장
오류 발생 가능성 스택 오버플로우 메모리 누수

3. 코드 세그먼트(Code Segment)

코드 세그먼트는 프로그램의 실행 코드(명령어)를 저장하는 메모리 공간입니다.

  • 특징:
    • 읽기 전용으로 설정되며, 명령어가 수정되지 않도록 보호.
    • CPU가 실행할 기계 코드가 이 영역에서 로드됩니다.
  • 사용 예시: 정적 실행 파일의 함수 및 루틴.

4. 데이터 세그먼트(Data Segment)

  • 초기화된 데이터: 초기값이 있는 전역 변수 및 정적 변수를 저장합니다.
  • 초기화되지 않은 데이터(BSS): 초기값이 없는 전역 변수 및 정적 변수 저장.

5. 스택 세그먼트(Stack Segment)

스택은 함수 호출지역 변수 저장에 사용됩니다.

  • 동작 원리: 함수가 호출될 때 스택 프레임이 생성되고, 반환 시 제거됩니다.
  • 오버플로우 문제: 너무 많은 재귀 호출 또는 큰 데이터 할당으로 인해 발생.

6. 메모리 할당 방식

6.1 슬랩 할당자(Slab Allocator)
  • 작은 메모리 블록 관리에 최적화된 방법입니다.
  • 캐시를 이용해 효율적으로 재사용하며, 커널 수준에서 주로 사용됩니다.
6.2 페이지 할당자(Page Allocator)
  • 운영체제는 메모리를 페이지 단위(보통 4KB)로 관리합니다.
  • 페이지 테이블을 통해 가상 주소를 실제 물리적 메모리로 매핑합니다.

7. RSS(Resident Set Size)

  • 정의: 프로그램이 물리 메모리에서 점유하고 있는 크기를 나타냅니다.
  • 중요 지표로 사용되며, 운영체제의 ps 명령어를 통해 확인 가능합니다.

8. 가상 메모리(Virtual Memory)

가상 메모리는 물리적 메모리 한계를 극복하기 위해 운영체제가 제공하는 기술입니다.

  • 페이지 교환: 메모리가 부족할 경우 디스크를 활용해 데이터를 저장합니다.
  • 이점: 프로세스 격리, 큰 메모리 공간 제공.
  • 단점: 빈번한 페이지 교환으로 성능 저하 가능.

9. 사례: 메모리 관련 파이썬 코드 예제

import tracemalloc

# 현재 메모리 사용 추적 시작
tracemalloc.start()

def allocate_memory():
    data = [i for i in range(100000)]  # 큰 메모리 할당
    print("메모리 할당 완료")
    return data

# 메모리 할당 전 스냅샷
snapshot1 = tracemalloc.take_snapshot()

# 메모리 할당
allocate_memory()

# 메모리 할당 후 스냅샷
snapshot2 = tracemalloc.take_snapshot()

# 메모리 사용량 비교
stats = snapshot2.compare_to(snapshot1, 'lineno')
print("[ 메모리 사용량 변화 ]")
for stat in stats[:5]:
    print(stat)

10. 결론

메모리는 프로그램 실행의 핵심 요소입니다. 힙과 스택은 동적 및 정적 메모리 할당을 관리하며, 가상 메모리와 다양한 할당 기술은 효율성을 높입니다. 개발자는 메모리 구조와 활용법을 이해하여 최적화된 프로그램을 설계할 수 있습니다.

728x90

댓글