- 가상 메모리 시리즈 모아 보기-
https://microelectronics.tistory.com/99
페이지 폴트(Page Fault)란?
페이지 폴트는 프로그램이 메모리에 없는 데이터를 참조하려 할 때 발생하는 예외이다. 이 경우 운영체제가 디스크에서 해당 페이지를 가져와 메모리에 적재하는 과정을 거쳐야 한다.
페이지 폴트 처리 과정
- 페이지가 RAM에 없는지 확인: 페이지 테이블에서 해당 페이지가 디스크에 있다고 표시된 경우 페이지가 RAM에 없음을 알 수 있다.
- PTE(Page Table Entry) 의 유효비트(R, resident)가 0이면 메모리에 적재되어있지 않은 페이지임을 의미한다.
- PTE(Page Table Entry) 의 유효비트(R, resident)가 0이면 메모리에 적재되어있지 않은 페이지임을 의미한다.
- 페이지 폴트 예외 발생: CPU는 페이지 폴트 예외(exception)를 발생시키고, 이를 통해 운영체제가 페이지 폴트를 처리하도록 한다.
- 운영체제의 페이지 폴트 핸들러 실행: 운영체제는 페이지 폴트 핸들러를 실행하여, 해당 페이지가 어디에 저장되어 있는지 확인하고, 메모리에 로드한다.
- 메모리에서 페이지 교체: 메모리가 가득 차 있는 경우, 운영체제는 메모리에서 다른 페이지를 선택해 디스크로 내보내는 과정을 진행한다. 이때 해당 페이지가 변경된 경우, 디스크로 다시 기록(즉, "dirty page")해야 한다.
- PTE 의 더티 비트(D)가 1이면 더티 페이지 이다.
- 더티 페이지 (Dirty Page): 메모리에 로드된 이후 데이터가 수정된 페이지를 뜻한다. 예를 들어, 프로그램이 이 페이지의 데이터를 변경했다면, 원래 디스크에 있던 내용과 메모리에 있는 내용이 다르게 된다. 이 경우, 메모리에서 페이지를 제거할 때 변경된 데이터를 디스크에 다시 저장해야 한다. 그렇지 않으면, 나중에 이 데이터를 다시 읽을 때 변경 사항이 반영되지 않은 오래된 데이터가 로드될 것이다.
- 클린 페이지 (Clean Page): 메모리에 로드된 후 한 번도 수정되지 않은 페이지를 의미한다. 메모리에 있는 내용과 디스크에 저장된 내용이 같기 때문에, 이 페이지는 그대로 디스크에 다시 저장할 필요가 없다. 즉, 메모리에서 제거될 때 디스크로 쓰는 작업을 생략할 수 있다.
- 디스크에서 데이터 읽기: 운영체제는 디스크에서 해당 페이지를 읽어와 RAM에 적재한다.
- 페이지 테이블 업데이트: 페이지 테이블을 업데이트하여 해당 페이지가 이제 RAM에 있음을 기록한다.
- 프로그램 재개: 마지막으로, 운영체제는 페이지 폴트를 일으킨 명령으로 돌아가 프로그램의 실행을 재개한다.
페이지 교체 알고리즘
- 페이지 선택 기준: 교체할 페이지는 일반적으로 오래 사용되지 않은 페이지(Least Recently Used, LRU) 알고리즘이나 노후화(Aging) 알고리즘을 통해 선택된다. 최적의 전략은 다음 사용 시점이 가장 먼 페이지를 선택하는 것이지만, 미래의 메모리 접근 패턴을 예측할 수 없기 때문에 현실적으로 구현하기는 어렵다.
- 고정된 페이지(Wired Page): 일부 페이지는 선택 대상에서 제외되며, 예를 들어 페이지 폴트 핸들러 코드가 실행되는 페이지가 이에 해당한다.
페이지 폴트의 성능 영향
페이지 폴트는 처리 과정에서 상당히 많은 CPU 사이클을 소비하기 때문에 시스템 성능에 큰 영향을 준다. 디스크 접근 시간이 메모리 접근 시간에 비해 매우 길기 때문이다. 일반적으로 페이지 폴트가 발생했을 때는 다음과 같은 과정이 필요하며, 각 단계의 성능 영향은 다음과 같다:
- 페이지 테이블 조회
운영체제는 먼저 페이지 테이블을 조회하여 해당 페이지가 메모리에 있는지 확인한다. 페이지 테이블에서 디스크를 가리키는 경우, 해당 페이지는 메모리에서 빠져있다는 의미이며, 이는 빠르게 확인 가능하다. - 페이지 폴트 예외 발생
CPU는 페이지 폴트를 감지한 후 예외(exception)를 발생시킨다. 예외 발생에는 수백에서 수천 개의 사이클이 소모된다. - 운영체제 진입
예외 처리로 인해 운영체제의 페이지 폴트 핸들러가 호출된다. 이는 약 만 개의 사이클이 소요되는 비교적 긴 작업이다. - 메모리 공간 확보
필요한 페이지를 메모리에 로드하기 위해 운영체제는 다른 페이지를 제거해야 할 수도 있다. 메모리가 가득 차 있을 때는 오래된 페이지를 디스크로 옮겨야 하며, 이 과정은 약 4천만 개의 사이클이 소요될 수 있다. 특히, 디스크에 쓰기 작업이 추가되는 더티 페이지는 더 많은 시간이 걸린다. - 디스크에서 페이지 로드
운영체제는 디스크에서 필요한 페이지를 읽어와 메모리에 적재하며, 이 작업 또한 약 4천만 개의 사이클이 걸릴 수 있다. 디스크 접근이 매우 느리기 때문에 이 단계는 페이지 폴트 처리에서 가장 큰 지연을 일으키는 부분 중 하나이다. - 페이지 테이블 업데이트
운영체제는 새로운 페이지가 메모리에 로드되었음을 페이지 테이블에 반영하는데, 이 작업에는 약 천 개의 사이클이 소요된다. - 프로그램으로 복귀
마지막으로, 운영체제는 페이지 폴트를 일으켰던 프로그램의 명령어로 돌아가 실행을 재개한다. 운영체제로 진입하는 데 만 사이클이 걸렸듯이, 복귀하는 데도 약 만 개의 사이클이 소요된다.
모든 단계를 합산하면, 단일 페이지 폴트 처리에 8천만 개의 사이클이 걸리며, 이는 CPU의 관점에서 매우 느린 작업이다. 페이지 폴트는 컴퓨터에서 발생할 수 있는 가장 느린 작업 중 하나로, 사람과 상호작용하는 속도보다 빠르긴 하지만 일반적인 네트워크 데이터를 다른 컴퓨터에서 불러오는 것보다도 느리다.
고속 저장장치의 도입과 페이지 폴트 최적화
고속 SSD가 점차 보편화되며 페이지 폴트 처리 시간이 줄어드는 추세이긴 하지만 여전히 메모리에 비해 훨씬 느리다.
이에 따라 운영체제와 프로그램은 페이지 폴트 발생을 줄이기 위한 여러 방법을 채택하고 있다.
예를 들어, iOS는 메모리가 부족할 때 프로그램을 종료해 디스크로 데이터를 넘기지 않으며, macOS는 사용 빈도가 낮은 페이지를 메모리 내에서 압축해 저장한다. 이러한 방법은 디스크 접근을 줄여 페이지 폴트가 성능에 미치는 영향을 최소화하려는 노력의 일환이다.
결론
페이지 폴트는 시스템 성능에 큰 영향을 미치는 문제이지만, 가상 메모리 시스템에서는 필수적이다. 메모리 부족 시 프로그램이 서로의 메모리 공간을 침범하지 않도록 보호할 수 있으며, 메모리 확장이 필요한 경우에도 시스템이 안정적으로 작동할 수 있게 한다. 하지만 가능한 메모리를 충분히 확보하고 페이지 폴트 발생을 최소화할 수 있는 방법을 활용하는 것이 바람직하다.
Reference
- https://www.youtube.com/watch?v=bShqyf-hDfg&list=PLiwt1iVUib9s2Uo5BeYmwkDFUh70fJPxX&index=8
- https://www.youtube.com/watch?v=RrZ8-1w7iok
'Computer Architecture > Virtual Address & Cache' 카테고리의 다른 글
TLB(Translation Lookaside Buffer)와 TLB 미스 (0) | 2024.10.28 |
---|---|
Virtual Memory(가상 메모리)의 컨텍스트와 메모리 관리 (0) | 2024.10.27 |
페이지 테이블과 주소 변환(Address Translation) (0) | 2024.10.25 |
Virtual Memory(가상 메모리)의 동작 방식 (0) | 2024.10.24 |
Virtual Memory(가상 메모리)는 무엇이고 왜 사용되는가? (0) | 2024.10.23 |
댓글