크래프톤 정글 일지

[PintOS] union이 뭐임? What is union in C

나한나한나한나 2024. 6. 3. 16:39

C 언어에서 union은 여러 데이터 타입을 하나의 메모리 공간에 공유하게 하는 데이터 구조입니다. 즉, 하나의 union 내의 모든 멤버가 동일한 메모리 위치를 사용하며, 어느 한 순간에 하나의 멤버만 값을 가질 수 있습니다. 이를 통해 메모리 사용을 효율적으로 관리할 수 있습니다.

union의 기본 개념

union의 각 멤버는 동일한 메모리 위치를 공유합니다. 따라서 가장 큰 멤버의 크기만큼의 메모리만 할당됩니다. 예를 들어, 다음과 같은 union이 있다고 가정합시다:

union example {
    int i;
    float f;
    char c;
};

union에서 i, f, c는 모두 동일한 메모리 공간을 공유합니다. union의 크기는 가장 큰 멤버(float, 4바이트)의 크기와 같습니다.

union의 사용 예제

#include <stdio.h>

union example {
    int i;
    float f;
    char c;
};

int main() {
    union example ex;
    ex.i = 10;
    printf("ex.i: %d\n", ex.i);

    ex.f = 220.5;
    printf("ex.f: %f\n", ex.f);

    ex.c = 'A';
    printf("ex.c: %c\n", ex.c);

    return 0;
}

출력 결과:

ex.i: 10
ex.f: 220.500000
ex.c: A

하지만 각 멤버는 동일한 메모리 공간을 공유하므로, 마지막으로 저장된 값만 올바르게 읽을 수 있습니다. 위 예제에서 ex.c = 'A';가 실행된 후에는 ex.iex.f의 값이 의미를 잃습니다.

union의 사용 목적

Pintos의 page 구조체에서 union은 페이지의 타입에 따라 서로 다른 데이터 구조를 저장하기 위해 사용됩니다. 이는 페이지가 초기화되지 않은 페이지(uninit_page), 익명 페이지(anon_page), 파일과 관련된 페이지(file_page), 또는 페이지 캐시(page_cache, 프로젝트 4)를 나타낼 수 있기 때문입니다.

page 구조체 내의 union

page 구조체의 union 멤버는 페이지 타입에 따른 특정 데이터를 저장합니다.

struct page {
    const struct page_operations *operations; // 페이지에 대한 작업을 정의하는 함수 테이블
    void *va;              // 사용자 공간에서의 주소
    struct frame *frame;   // 프레임에 대한 백 레퍼런스

    union {
        struct uninit_page uninit;
        struct anon_page anon;
        struct file_page file;
#ifdef EFILESYS
        struct page_cache page_cache;
#endif
    };
};

union의 각 멤버는 페이지의 특정 유형에 따라 데이터를 저장합니다.

  • struct uninit_page uninit: 페이지가 초기화되지 않았을 때 사용됩니다.
  • struct anon_page anon: 익명 페이지일 때 사용됩니다.
  • struct file_page file: 파일과 관련된 페이지일 때 사용됩니다.
  • struct page_cache page_cache: 프로젝트 4에서 페이지 캐시일 때 사용됩니다.

union의 작동 원리

page 구조체의 union을 사용하면 각 페이지가 특정 유형의 데이터를 저장할 수 있으며, 필요한 경우에만 메모리를 사용하여 효율성을 극대화할 수 있습니다. 예를 들어, 페이지가 익명 페이지인 경우, anon 멤버에 데이터를 저장하고 다른 멤버는 사용하지 않습니다.

요약

  • 공유 메모리: union의 모든 멤버는 동일한 메모리 위치를 공유하며, 한 번에 하나의 멤버만 값을 가질 수 있습니다.
  • 메모리 효율성: union을 사용하면 다양한 데이터 타입을 동일한 메모리 공간에 저장하여 메모리를 효율적으로 사용할 수 있습니다.
  • 특정 용도: Pintos의 page 구조체에서 union은 페이지 타입에 따라 서로 다른 데이터를 저장하여 다양한 페이지 유형을 지원합니다.