Interview/OS

OS 프로세스 데이터 영역

김 정출 2024. 9. 26. 10:59

OS 프로세스 데이터 영역

  1. 코드(Code) 영역:
    • 프로그램의 기계어 명령어가 저장되는 영역입니다. 소스 코드를 컴파일하여 기계어로 변환한 후 이 영역에 저장됩니다.
    • 프로그램 실행 동안 CPU가 이 영역에서 명령어를 가져와 실행하게 됩니다.
    • 읽기 전용으로 설정되어 있으며, 프로그램이 끝날 때까지 메모리에 상주합니다.
  2. 데이터(Data) 영역:
    • 초기화된 전역 변수정적(static) 변수가 저장됩니다.
    • 전역 변수와 static 변수는 프로그램 시작 시 할당되며, 프로그램이 종료될 때까지 유지됩니다.
    • 이 영역의 데이터는 프로그램이 시작할 때 값이 초기화되며, 메모리의 해당 위치는 프로그램 전체에서 참조 가능합니다.
  3. BSS 영역:
    • 초기화되지 않은 전역 변수정적 변수들이 저장되는 영역입니다.
    • 이 변수들은 프로그램 시작 시 자동으로 0으로 초기화됩니다.
    • BSS 영역은 초기화되지 않은 데이터만을 저장하므로 실제 실행 파일의 크기에 영향을 미치지 않습니다.
  4. 스택(Stack) 영역:
    • 지역 변수, 함수의 매개변수 등이 저장되는 영역입니다.
    • 함수 호출 시 스택에 할당되고, 함수가 종료되면 자동으로 해제됩니다.
    • 스택은 LIFO(Last In, First Out) 구조로, 컴파일 타임에 크기가 정해지고 함수 호출 시 마다 스택 프레임이 추가 및 제거됩니다.
    • 자동 할당 및 해제가 이루어지므로, 프로그래머가 직접 메모리 관리를 하지 않습니다.
    • 스택 영역은 컴파일 타임에 영역 크기가 결정된다는 부분은 더 정확히 말하자면, 스택 자체의 최대 크기는 컴파일 시 결정될 수 있지만 스택 프레임의 크기와 위치는 함수가 호출될 때마다 런타임에 동적으로 관리됩니다.
  5. 힙(Heap) 영역:
    • 동적 메모리 할당이 이루어지는 영역입니다.
    • malloc(), calloc(), realloc(), free()와 같은 함수를 사용해 프로그래머가 직접 메모리 할당 및 해제를 제어해야 합니다.
    • 런타임에 크기가 결정되며, 크기는 유동적입니다.
    • 메모리 누수를 방지하기 위해서는 사용한 메모리를 적절히 해제해야 합니다.
#include <stdio.h>
#include <stdlib.h>

// Code 영역: 프로그램의 실행 코드를 저장
// 이 함수는 code 영역에 저장됨
void myFunction() {
    printf("This is a function in the code section\n");
}

// Data 영역: 초기화된 전역 변수와 정적 변수가 저장되는 영역
// 전역 변수 (초기화됨, 데이터 섹션에 저장됨)
int initializedGlobalVar = 10;

// BSS 영역: 초기화되지 않은 전역 변수와 정적 변수가 저장되는 영역
// 전역 변수 (초기화되지 않음, BSS 섹션에 저장됨)
int uninitializedGlobalVar;

// Data 영역: 초기화된 정적 변수도 이곳에 저장됨
void someFunction() {
    // 정적 변수 (초기화됨, 데이터 섹션에 저장됨)
    static int staticInitializedVar = 5;

    // BSS 영역: 초기화되지 않은 정적 변수는 BSS에 저장됨
    static int staticUninitializedVar; // 초기화되지 않음
}

// Stack 영역: 함수 호출 시 지역 변수, 매개변수 및 리턴 주소가 저장되는 영역
// 함수가 호출되면 stack에 지역 변수 및 매개변수가 저장됨
int add(int a, int b) {
    // 지역 변수 (stack에 저장됨)
    int result = a + b;
    return result;
}

int main() {
    // Stack 영역: main 함수의 지역 변수는 stack에 저장됨
    int localVariable = 0;

    // Heap 영역: 동적으로 할당된 메모리는 heap에 저장됨
    int *dynamicArray = (int *)malloc(5 * sizeof(int));

    // 동적 메모리 사용
    for(int i = 0; i < 5; i++) {
        dynamicArray[i] = i * 10;
    }

    // 메모리 해제
    free(dynamicArray);

    // 전역 변수 사용
    initializedGlobalVar += add(5, 3);

    // 함수 호출 (stack 사용)
    myFunction();

    return 0;
}

각 메모리 영역의 설명:

  1. Code 영역:
    • 프로그램의 실행 코드가 저장되는 영역입니다.
    • 예: myFunction() 함수와 같은 프로그램의 기계어 코드가 이 영역에 저장됩니다.
  2. Data 영역:
    • 초기화된 전역 변수와 정적 변수가 저장됩니다.
    • 예: initializedGlobalVar(전역 변수)나 staticInitializedVar(정적 변수)처럼 초기화된 값이 있는 변수들이 이 영역에 저장됩니다.
  3. BSS 영역:
    • 초기화되지 않은 전역 변수와 정적 변수가 저장됩니다.
    • 예: uninitializedGlobalVarstaticUninitializedVar처럼 초기화되지 않은 변수가 이 영역에 할당됩니다.
  4. Stack 영역:
    • 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역입니다.
    • 예: add() 함수 내의 result 변수나 main() 함수의 localVariable 같은 지역 변수가 이 영역에 저장됩니다.
  5. Heap 영역:
    • 동적으로 할당된 메모리가 저장되는 영역입니다. malloc()과 같은 함수를 통해 동적으로 메모리를 할당할 때 사용됩니다.
    • 예: dynamicArray와 같은 동적 메모리 할당이 heap에 저장됩니다.