정글/Pintos

[pintos] 3주차 - VM의 Unallocated, Cached, Uncached 상태 / Anonymous page / Lazy Loading

nkdev 2025. 6. 3. 15:28

Unallocated page에 대한 고찰... 이틀째!

vm 구현에 들어가기 전, 기본 개념에 집착하고 있다. 궁금한 게 너무 많다

그래도 이 개념을 정리하고 넘어가고 싶어서 내가 이해한 만큼만 정리해본다.

 

VM page의 세 가지 상태 - Unallocated / Cached / Uncached

CSAPP 9.3장에 나온 그림을 보면 가상 메모리 페이지의 3가지 상태에 대해서 쉽게 이해할 수 있다.

 

unallocated는 아직 아무것도 할당되지 않은 상태. 프로세스가 이 가상메모리 페이지 공간에 암것도 할당한 적이 없다.

없어요 ㄱ냥

 

암것도 할당된 적이 없어요 그냥. 프로세스가 아직 쓰기로한 적이 없는 주소예요..

당연히 디스크에도 없고 그러면 메모리에도 없을 거예요..

그래서 cpu가 unallocated page의 가상 메모리 주소를 접근하면 segmentation fault가 발생하고 프로세스가 강제 종료된다.

프로세스가 사용하고 있지도 않은 잘못된 가상 주소에 접근했기 때문이다.

 

그렇담 allocated는 프로세스가 가상 메모리 페이지 공간에 먼가를 할당했다는 얘기일 것이다.

cpu가 이 페이지에 접근하면 segmentation fault가 나지 않는다!! 사용 가능한 유효한 가상 주소이기 때문이다.

요 allocated 페이지가 RAM에 올라와 있으면 cached, 그렇지 않으면 uncached상태이다.

 

어..정리하면 가상 메모리 페이지가 아직 할당되어있지도 않으면 unallocated.. 할당되어있는데 RAM에 올라와있으면 cached... 안 올라와있으면 uncached.... 웅웅 근데 anonymous page는 머야??

?Anonymous page?

anonymous page는 디스크에 대응되는 파일 없이 메모리에 존재하는 페이지이다.

스택, 힙, bss영역 페이지에 주로 사용된다.

 

스택, 힙, 아직 초기화되지 않은 변수들은 런타임에 실제로 cpu가 실행을 해야 데이터가 생성되는 애들이다. 애초에 디스크 대응되는 파일이 있을 리가 없기 때문에 처음엔 모두 anonymous(매핑된 디스크 파일이 없음)일 수밖에 없다. 나중에 실제로 cpu가 접근해서 가상 공간, 물리 공간(RAM)을 할당받게 되더라도 나중에 프로세스가 종료되면 없어질 애들이고, 끝까지 대응되는 disk file 없이 swap 장치에만 backup된다. 페이지 교체를 할 때도 디스크 파일이 아니라 디스크의 swap 공간 <-> 메모리 공간 둘 사이에 이동이 발생된다. 사용되는 동안 단 한 번도 디스크 파일과의 연관성을 찾을 수 없는 애들이므로 모두 anonymous page로 취급되는 것 같다. 

 

오호오호 anonymous page는 대응되는 디스크 파일이 없는 페이지.

스왑될 때는 디스크 스왑공간에 일시적으로 저장될 뿐이다!

 

.

.

🐜 오케이 이해해써

 

그런데 anonymous page는 lazy loading으로 메모리 공간을 할당받는다는 것을 알고 있는가?

Lazy Loading

lazy loading은 메모리 로딩을 필요한 시점까지 미루는 방법이다.

뒤.로.미.루.기 ⭐️

 

https://nkdev.tistory.com/140

 

동적 메모리 할당 (Dynamic Memory Allocation)

Call by value vs Call by referencecall by valuea copy of the variable is passed.changes made in a copy of variable never modify the value of variable outside the function.does not allow you to make any changed in the actual variables.actual and formal argu

nkdev.tistory.com

* 내가 드는 예시를 이해하려면 malloc 할당 과정을 이해할 필요가 있다..

 

anonymous page의 대표적인 예로 malloc이 있는뎅

malloc이 호출되는 시점에는 힙공간(가상 공간)만 할당되고, 실제로 cpu가그 힙공간을 포인터로 접근하는 연산을 해야 비로소 물리 메모리에 공간이 할당되는 것이 lazy loading이다!!!

 

lazy loading으로 물리 메모리를 할당받는 malloc() 과정을 자세히 설명해보겠다.

 

예시 : Lazy Loading으로 페이지 로드하는 과정

int* p = malloc(sizeof(int*) * 100);이라는 코드가 있다고 해보자. 

런타임에 malloc()을 호출하면 힙에 공간이 할당된다.

그러면 힙의 해당 페이지는 unallocated -> allocated/uncached 상태가 된다.

아직 cpu가 직접 접근하지 않았으니, VM 공간에만 존재하는 페이지다. 

따라서 페이지 테이블에 엔트리를 하나 만들고 valid bit(present bit)를 0으로 설정한다.

 

만약 cpu가 포인터 p에 처음 접근했다면 p[0] = 42;

페이지 테이블을 조회하여 해당 가상 주소와 매핑된 물리 주소를 찾을 것이다.

이때 pte의 valid bit=0 즉 아직 메모리에 없는 uncached상태이므로 page fault가 발생한다.

malloc은 lazy loading 즉 실제로 cpu가 사용하는 시점(page fault가 발생하는 시점)에 실제로 데이터가 로드되므로,

palloc으로 물리 페이지를 4KB 할당받고 anonymous page로 매핑한다. 연결된 disk file이 없기 때문이다.

그리고 pte를 갱신해준다. 이제 메모리에 올라갔으니까 valid bit=1로 바꾸어주면 되겠지오..

 

.

.

😮

예시 하나만 들었는데 unallocated, allocated, uncached, cached, anonymous, lazy loading이 다 설명되었다.

이제 조금 정리가 된닷

 

Lazy Loading을 하는 이유는 필요한 시점에 공간을 할당함으로써 메모리 공간을 효율적으로 쓰기 위함이다.

 

이제 맘 좀 편히 먹고 VM 구현을 위한 코드 분석을 하러 가보겠습니다. 바이바이

 

https://e-juhee.tistory.com/entry/Pintos-KAIST-Project-3-Anonymous-Page-Lazy-Loading%EC%9C%BC%EB%A1%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%9A%A8%EC%9C%A8%EC%84%B1-%EB%86%92%EC%9D%B4%EA%B8%B0