프로세스의 메모리 영역

2025. 1. 11. 15:32·운영체제

프로세스의 메모리 영역

운영체제에서 프로세스가 생성되면 커널 영역에 프로세스 제어 블록(PCB)이 생성됩니다. 사용자 메모리 공간에는 프로세스가 어떻게 배치될까요? 일반적으로 하나의 프로세스는 네 가지 주요 메모리 영역으로 나뉘어 저장됩니다: 코드 영역, 데이터 영역, 힙 영역, 스택 영역. 이 글에서는 각 메모리 영역의 역할, 특성, 작동 원리와 함께 관련 개념을 탐구합니다.


프로세스 메모리 구조 개요

프로세스는 실행을 위해 다음과 같은 메모리 영역으로 나뉩니다:

  1. 코드 영역 (Code Segment): 프로그램의 실행 명령어가 저장.
  2. 데이터 영역 (Data Segment): 프로그램 실행 중 유지되는 데이터 저장.
  3. 힙 영역 (Heap Segment): 동적으로 할당되는 메모리 저장.
  4. 스택 영역 (Stack Segment): 함수 호출 및 지역 변수 저장.

이러한 구조는 운영체제가 프로세스를 관리하고, 효율적으로 메모리를 활용하는 데 필수적입니다.


1. 코드 영역 (Code Segment)

코드 영역, 또는 텍스트 영역(Text Segment)은 실행 가능한 명령어(기계어 코드)가 저장되는 공간입니다.

특징:

  • 읽기 전용(Read-Only): 코드의 무결성을 유지하기 위해 쓰기가 금지됩니다.
  • 불변: 프로그램이 실행되는 동안 코드 영역의 크기는 고정됩니다.
  • 공유 가능: 동일한 프로그램을 실행하는 여러 프로세스는 코드 영역을 공유할 수 있습니다(예: 다중 사용자 환경에서).

예제:

다음은 코드 영역에 저장되는 코드의 예입니다:

#include <stdio.h>

void printMessage() {
    printf("Hello, World!\n");
}

위 코드에서 printMessage 함수의 명령어는 코드 영역에 저장됩니다.


2. 데이터 영역 (Data Segment)

데이터 영역에는 프로그램 실행 중 유지되어야 하는 데이터가 저장됩니다. 전역 변수와 정적 변수(static variable)가 이 영역에 포함됩니다.

특징:

  • 전역 변수와 정적 변수 저장: 프로그램 전체에서 접근 가능한 변수들이 포함됩니다.
  • 가변 크기: 실행 중에 데이터의 양에 따라 크기가 변화할 수 있습니다.

예제:

int globalVar = 10;      // 전역 변수
static int staticVar = 20; // 정적 변수

위 코드에서 globalVar와 staticVar는 데이터 영역에 저장됩니다.


3. 힙 영역 (Heap Segment)

힙 영역은 동적으로 메모리를 할당하고 해제할 수 있는 공간입니다. 주로 데이터 구조(예: 링크드 리스트, 트리 등)와 같은 복잡한 데이터 관리에 사용됩니다.

특징:

  • 동적 할당: 프로그래머가 필요에 따라 메모리를 할당 및 해제.
  • 낮은 주소에서 높은 주소로 확장: 메모리의 낮은 주소부터 시작하여 할당이 증가함에 따라 높은 주소로 확장됩니다.
  • 메모리 누수 위험: 할당된 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있습니다.

예제:

#include <stdlib.h>

int main() {
    int* ptr = (int*)malloc(sizeof(int)); // 힙에 메모리 할당
    *ptr = 100;  // 값 저장
    free(ptr);   // 메모리 해제
    return 0;
}

위 코드에서 malloc 함수는 힙 영역에 메모리를 할당하며, free 함수는 할당된 메모리를 해제합니다.

메모리 누수 경고:

힙 메모리를 해제하지 않으면 시스템의 메모리가 고갈될 수 있습니다. 이는 성능 저하를 초래하거나 시스템 충돌로 이어질 수 있습니다.

image

(그림 출처: 혼자 공부하는 컴퓨터 구조 + 운영체제)


4. 스택 영역 (Stack Segment)

스택 영역은 함수 호출 시 일시적인 데이터를 저장하는 공간입니다. 함수의 매개변수, 지역 변수, 리턴 주소 등이 스택에 저장됩니다.

특징:

  • LIFO 구조: 마지막에 추가된 데이터가 가장 먼저 제거됩니다.
  • 자동 관리: 함수 실행이 종료되면 해당 함수의 스택 공간이 자동으로 해제됩니다.
  • 높은 주소에서 낮은 주소로 확장: 스택은 높은 메모리 주소에서 시작하여 아래쪽으로 확장됩니다.

예제:

void exampleFunction() {
    int localVar = 10; // 지역 변수, 스택에 저장
}

위 코드에서 localVar은 함수 호출 시 스택에 저장되며, 함수 종료 시 자동으로 해제됩니다.


힙과 스택의 상호작용

힙 영역과 스택 영역은 동적 할당이 가능한 메모리 공간으로, 실행 중 메모리 크기가 변화할 수 있습니다. 두 영역은 서로 반대 방향으로 확장됩니다:

  • 힙: 낮은 주소 → 높은 주소로 확장
  • 스택: 높은 주소 → 낮은 주소로 확장

이러한 확장 방향이 반대이기 때문에, 서로 충돌 없이 동작할 수 있습니다. 그러나 잘못된 메모리 관리는 스택 오버플로(stack overflow) 또는 힙 오버플로(heap overflow)를 초래할 수 있습니다.

image

(그림 출처: 혼자 공부하는 컴퓨터 구조 + 운영체제)


프로세스 메모리 영역의 중요성

운영체제는 프로세스의 메모리를 효율적으로 관리하기 위해 위와 같은 구조를 사용합니다. 각 영역은 고유한 역할과 특성을 가지며, 프로그램의 성능과 안정성에 중요한 영향을 미칩니다.

요약:

  • 코드 영역: 읽기 전용, 실행 명령어 저장.
  • 데이터 영역: 전역 변수 및 정적 변수 저장.
  • 힙 영역: 동적 메모리 할당 및 해제.
  • 스택 영역: 함수 호출과 지역 변수 관리.

'운영체제' 카테고리의 다른 글

문맥 교환 (Context Switching)  (0) 2025.01.11
프로세스 제어 블록 (PCB)  (0) 2025.01.08
'운영체제' 카테고리의 다른 글
  • 문맥 교환 (Context Switching)
  • 프로세스 제어 블록 (PCB)
iOS Developer
iOS Developer
myungsun-e 님의 블로그 입니다.
  • iOS Developer
    myungsun-e
    iOS Developer
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • 컴퓨터 네트워크 (11)
        • 응용계층 (11)
      • 운영체제 (14)
        • 운영체제 시작하기 (2)
        • 프로세스 상태와 계층 구조 (3)
        • 프로세스와 스레드 (1)
        • CPU 스케줄링 (3)
        • 동기화란 (2)
      • iOS (0)
        • Swift-문법 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SWIFT
    컴퓨터 네트워크
    IOS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
iOS Developer
프로세스의 메모리 영역
상단으로

티스토리툴바