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
'프로그래밍공부(Programming Study) > 운영체제(OS)' 카테고리의 다른 글
벨라디의 이상현상 (Belady's Anomaly) (0) | 2024.12.08 |
---|---|
페이지 교체 알고리즘 정리 (1) | 2024.12.08 |
CPU 핵심 개념 총정리: 커널 함수, 시스템 콜, 인터럽트와 CPU 이벤트 이해하기 (2) | 2024.12.06 |
커널의 내부 동작 완전 정복: 시스템 콜, 모드 전환, 태스크/스레드, 가상 메모리, VFS의 이해 (0) | 2024.12.06 |
Linux `free` 명령어와 Dentry Cache, Slab 메모리 개념 완벽 정리 (1) | 2024.11.25 |
댓글