목차
디멘드 페이징
디멘드 페이징은 가상 메모리 시스템에서 매우 중요한 기법 중 하나입니다.
이 방법은 프로그램 실행 시 모든 데이터를 물리 메모리에 적재하는 대신, 필요한 순간에만 페이지를 메모리로 가져오는 방식을 말합니다.
즉, 실제로 사용되는 데이터만 메모리에 로드되므로 메모리 사용의 효율성을 극대화합니다.
디멘드 페이징의 주요 개념
1.
가상 메모리 : 가상 메모리는 물리 메모리보다 훨씬 큰 메모리 공간을 제공합니다. 이는 물리 메모리를 효율적으로 사용할 수 있게 하며, 사용자에게는 더 많은 메모리가 있는 것처럼 보이게 합니다.
2.
페이지: 가상 메모리와 물리 메모리는 페이지라는 고정된 크기의 블록으로 나뉘어 관리됩니다. 페이지는 가상 주소 공간에서 관리되며 필요에 따라 물리 메모리에 매핑됩니다.
3.
페이지 테이블 : 페이지 테이블은 가상 페이지와 물리 페이지의 매핑 정보를 담고 있습니다. 프로세스가 데이터에 접근하려 할 때 페이지 테이블을 참조하여 해당 페이지가 메모리에 있는지 확인합니다.
4.
페이지 폴트 : 프로세스가 접근하려는 페이지가 물리 메모리에 없을 경우 발생합니다. 페이지 폴트가 발생하면 운영 체제는 해당 페이지를 디스크에서 찾아 물리 메모리로 로드하고, 프로세스는 다시 해당 페이지에 접근할 수 있습니다.
디멘드 페이징의 작동 과정
1.
페이지 접근 시도 : 프로세스가 특정 페이지에 접근을 시도합니다.
2.
페이지 테이블 조회 : 시스템은 페이지 테이블을 확인하여 해당 페이지가 메모리에 적재되어 있는지 확인합니다.
3.
페이지 폴트 처리 : 페이지가 메모리에 없으면 페이지 폴트가 발생하고, 필요한 페이지를 디스크에서 찾아 메모리로 로드합니다.
4.
페이지 테이블 업데이트 : 페이지를 메모리에 로드한 후, 페이지 테이블을 업데이트하여 가상 주소와 물리 주소 간의 매핑을 설정합니다.
5.
프로세스 재개 : 프로세스는 중단되었던 작업을 재개합니다.
디멘드 페이징 예시
페이지 요청 시나리오
1.
프로그램이 페이지 2에 접근합니다.
2.
프로그램이 페이지 1에 접근합니다.
3.
프로그램이 페이지 3에 접근합니다.
4.
프로그램이 페이지 4에 접근합니다.
1. 페이지 테이블
페이지 테이블은 가상 페이지 번호와 해당 페이지가 메모리에 있는지 여부 (Valid/Invalid), 그리고 물리 페이지 번호를 나타냅니다.
처음엔 모든 페이지가 모두 물리 메모리에 없다고 가정합시다.
가상 페이지 번호 | Valid/Invalid | 물리 페이지 번호 |
페이지 1 | Invalid | - |
페이지 2 | Invalid | - |
페이지 3 | Invalid | - |
페이지 4 | Invalid | - |
2. 요청 및 페이지 테이블 업데이트 과정
각 단계에서 요청된 페이지와 페이지 테이블, 메모리 상태의 변화를 추적합니다.
단계 | 요청된 페이지 | 페이지 폴트 | 페이지 테이블 업데이트 |
1 | 페이지 2 | Yes | 페이지 2 : Valid
물리 페이지 번호 : 1 |
2 | 페이지 1 | Yes | 페이지 1: Valid
물리 페이지 번호 : 2 |
3 | 페이지 3 | Yes | 페이지 3 : Valid
물리 페이지 번호 : 3 |
4 | 페이지 4 | Yes | 페이지 4 : Valid
물리 페이지 번호 : 1 (페이지 2 덮어쓰기) |
디멘드 페이징, 페이지 폴트가 성능상 안 좋은 이유
물리 메모리 : 모든 가상 메모리 페이지는 물리 메모리에 매핑되어야 실제로 CPU에 의해 접근될 수 있습니다. 페이지 폴트가 자주 발생하면, 물리 메모리 내에서 페이지를 찾고, 없으면 디스크에서 로드하는 작업이 반복됩니다. 이는 I/O 작업의 증가를 의미하며, 메모리 I/O는 CPU 작업보다 훨씬 느립니다.
가상 메모리 : 가상 메모리는 프로그램이 사용할 수 있는 메모리 양을 물리 메모리보다 크게 제공하지만, 페이지 폴트가 많이 발생하면 이 가상 메모리를 효율적으로 활용하지 못하게 됩니다. 페이지 폴트가 너무 자주 발생하면, 실제로 프로세스가 계산 작업을 수행하는 시간보다 메모리를 관리하는 데 더 많은 시간을 소비하게 됩니다. 이는 스래싱(Thrashing) 현상을 유발하고, 시스템의 전체적인 처리 능력이 급격히 저하됩니다.
페이지 폴트가 발생하지 않게 하는 방법.
클라이언트 프로그래머가 페이지 폴트를 발생시키지 않는 방법은 사실상 없습니다.
물리 메모리를 늘리거나, 가상 메모리 관리자의 페이지 교체 정책을 개선하는 방법이 있는데, 이는 실질적으로 클라이언트 프로그래머가 할 수 없는 일이죠.
다만, 간접적으로 페이지 폴트를 예방하는 방법이 있습니다.
•
로컬리티 원리 활용 : 프로그램을 설계할 때 시간적 지역성과 공간적 지역성을 최대한 활용하도록 합니다. 이는 데이터와 함수를 그룹화하여 메모리 접근 패턴을 최적화함으로써 페이지 폴트를 감소시킵니다.
이는 goto문을 사용하면 안 되는 이유 중 하나인 '지역성'의 개념입니다. 하지만 이 내용은 이곳에서 설명하기에는 너무 광범위합니다. 심지어 goto문을 사용한다고 해서 반드시 지역성을 위배하는 것은 아니므로, 지역성에 대한 설명은 추후에 다루도록 하겠습니다.
•
메모리 사용 최적화 : 메모리 사용을 효율적으로 설계하여 필요하지 않은 메모리 할당을 피합니다.