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.i
와 ex.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
은 페이지 타입에 따라 서로 다른 데이터를 저장하여 다양한 페이지 유형을 지원합니다.
'크래프톤 정글 일지' 카테고리의 다른 글
[PintOS] project 3.1 - hash.h, memory management (0) | 2024.06.06 |
---|---|
[PintOS] project 3.0 - vm.h (0) | 2024.06.03 |
[PintOS] '프레임에 대한 백 레퍼런스' 가 뭔 소리임? What is 'Back reference for frame'? (0) | 2024.06.03 |
[PintOS] Struct Page (0) | 2024.06.01 |
[PintOS] Lazy Loading (0) | 2024.06.01 |