2012-06-21 3 views
1

이것이 내 첫 번째 질문입니다. 주제가 아닌지 확실하지 않습니다.메모리 매핑 된 파일이 항상 페이지 경계에 매핑되는 이유는 무엇입니까?

자기 공부 나 운영 체제에 대한 다음과 같은 문장을 발견했다, 반면 : 메모리 매핑 된 파일은 항상 파일을 필요로 할 수

운영 시스템은 페이지 경계에 매핑 할 수 있습니다.

예를 들어, 4-KB 페이지로, 파일이 가상 주소 4096에서 시작에 매핑 할 수 있지만,이 문은 다음과 같은 방법으로 설명 5000

가상 주소에서 시작하지 파일을 페이지의 중간에 매핑 할 수 있다면 단일 가상 페이지는 디스크에 두 개의 부분 페이지가 있어야 매핑 할 수 있습니다. 첫 번째 페이지는 특히 을 스크래치 페이지와 파일 페이지에 매핑합니다. 페이지 을 처리하는 것은 복잡하고 값 비싼 작업이므로 데이터를 복사해야합니다. 또한 페이지의 사용하지 않는 부분에 대한 참조를 트랩 할 수있는 방법이 없습니다. 이러한 이유로 이러한 상황은 피할 수 있습니다.

이 답변을 이해하는 데 도움을 얻고 싶습니다. 특히, "하나의 가상 페이지가 디스크에 두 개의 부분 페이지가 필요합니다"라고하는 것은 무엇을 의미합니까? 메모리 매핑 파일에 대해 알아 낸 점에서 가상 페이지는 디스크의 파일에 매핑되고 페이징 파일에는 매핑되지 않습니다. 이것은 "부분 페이지"가 ​​의미하는 것입니까?

또한 "스크래치 페이지"는 무엇을 의미합니까? 나는이 용어를 책 (Tanenbaum의 "Modern Operating Systems"과 "Structured Computer Organization")과 웹에서 찾으려고 노력했지만 찾지 못했습니다.

답변

1

먼저 책과 문서를 읽을 때 항상보고있는 것을 비판적으로 봅니다. 때로는 작성자가 설명하는 솔루션을 홍보하기 위해 "다른 방법은 없습니다"와 같은 언어를 사용하는 경향이 있습니다. 항상 다른 방법이 가능합니다.

지금 문제입니다. 최신 운영 체제는 항상 할당 된 모든 메모리 페이지에 대한 디스크 위치를가집니다. 이것은 의미가 있습니다. 메모리에 페이지를 버려야 할 필요가있을 때 -이 페이지가 '더티'인 경우이 페이지를 어디에 두어야하는지, 아니면 수정되지 않은 경우 버리는 지 이미 명확합니다. 이 전략은 널리 받아 들여지고 있습니다. 대안 정책이 또한 가능하지만.

디스크 위치는 페이징 파일이거나 메모리 매핑 파일 일 수 있습니다. 메모리 매핑 된 파일의 가장 일반적인 사용 - 실행 파일 및 dll. 그들은 (거의) 결코 수정되지 않습니다. 코드가있는 페이지를 얼마 동안 사용하지 않으면 버립니다. 제어가 온다면 - 파일에서 다시 읽으십시오.

언급 한 초록에서 그들은 would need two partial pages on disk to map it. The first page, in particular, would be mapped onto a scratch page이라고 말합니다. 그들은 단지 하나의 해결책이있는 것처럼 상황을 제시하는 경향이 있습니다. 사실, 이러한 결합 된 페이지에 대한 페이징 파일에 페이지를 할당하고 적절한 데이터 복사를 처리 할 수 ​​있습니다. 또한 해당 페이지의 페이징 파일에 아무 것도 지정하지 않고 일시적인 페이지를 사용하여 파일에서이 페이지를 어셈블 할 수도 있습니다. 99 %의 경우 디스크 컨트롤러는 페이지 경계에서 /에서만 읽기/쓰기가 가능합니다. 즉, 두 번째 파일에서 일시적인 페이지로 첫 번째 파일에서 메모리 페이지로 읽어야합니다. 일시적인 페이지에서 데이터를 복사하고 즉시 폐기하십시오.

알다시피, 한 페이지에 여러 파일을 결합하는 것이 완벽하게 가능합니다. 여기에는 아무런 문제가 없습니다.이 솔루션을 처리하는 알고리즘은 더 복잡해 지지만 더 많은 CPU 클록을 소비합니다. 그러한 페이지를 재구성하면 (삭제 될 경우) 여러 다른 파일을 읽어야합니다. 우리 시대에는 4kb가 다소 소량입니다. 2kb를 절약하는 것은 큰 이득이 아닙니다. 필자가 생각하기에, 이익과 비용을 살펴보면 이익이 충분하지 않다고 말할 수 있습니다.

0

가상 주소 페이지 (내가 들어 본 모든 컴퓨터에서)는 페이지 크기의 경계에 정렬됩니다. 이것은 수학이 매우 쉽기 때문입니다. x86에서 페이지 크기는 4096입니다. 정확히 12 비트입니다. 주소가 참조하는 가상 페이지를 알아 내려면 주소를 12로 간단히 이동하십시오. 디스크 블록 (4096 바이트라고 가정)을 주소 5000으로 매핑하면 페이지 # 1에서 시작됩니다 (5000 >> 12 == 1) 페이지 # 2 (9095 >> 12 == 2)로 끝납니다.

메모리 매핑 된 파일은 가상 주소 공간을 파일에 매핑하여 작동하지만 데이터는 필요할 때로드됩니다. 실제로 파일은 실제 메모리보다 훨씬 크기 때문에 적합하지 않을 수 있습니다. 가상 주소에 처음 액세스 할 때 데이터가 없으면 (즉, 실제 메모리에없는 경우) 프로세서가 오류를 일으키고 OS가 데이터를 가져와야합니다. 데이터를 가져올 때 페이지의 모든 데이터를 가져와야합니다. 그렇지 않으면 오류를 끌 수 없습니다. 주소가 정렬되지 않은 경우 페이지를 채우기 위해 여러 개의 디스크 블록을 가져와야합니다. 당신은 확실히 이것을 할 수 있습니다, 그것은 단지 지저분하고 비효율적입니다.