2014-11-29 4 views
2

예를 들어 실제 메모리가 2GB 인 시스템에서 : 100GB 파일을 mmap'd하고 가능한 빨리 스프레이를 시작하면 예상되는 동작은 무엇입니까? 페이지가 디스크로 플러시되는 동안 메모리 블록에 쓰기가 가능하거나 시스템 버퍼가 결국 메모리 부족 오류로 인해 종료 될 수 있습니까?mmap 된 메모리에 쓰기가 차단 되나요?

답변

1

많은 것을 바꿀 수 있습니다. mmap()은 스왑 파티션이나 파일 대신 일반 파일로 스와핑한다는 것을 의미합니다.

물론 이것은 파일이 mmap() 인 경우에만 적용됩니다. 익명 매핑 (예 : MAP_ANONYMOUS)을 만들었다면 일반적인 규칙의 적용을받습니다.

블로킹과 비슷하게 나중에 MAP_POPULATE을 사용하여 스와핑의 일부를 나중에 트리거 할 수도 있습니다.

1

예 다시 쓰기 작업이 완료 될 때까지 호출이 차단됩니다.

캐시되지 않은 메모리의 페이지에 액세스하면 페이지 폴트가 발생하여 실행을 중지하고 OS를 다시 제어 할 수 있습니다. 운영 체제는 메모리에서 페이지를로드하는 데 필요한 모든 IO 작업을 예약합니다 (또는 하드 디스크가 스왑 된 경우). 그런 다음 IO가 완료 될 때까지 다른 프로세스를 실행합니다. IO가 완료되면 프로세스는 실행 준비가 된 프로세스 대기열에 다시 추가됩니다.

캐시 된 것이 아닌 즉시 무언가가 스왑되거나 메모리에 있는지 여부는 중요하지 않습니다. 데이터가 캐시에서 사용할 수있을 때까지 실행이 중지되므로 통화가 차단됩니다.

실제로 어떤 종류의 메모리에 액세스하는지는 중요하지 않습니다. 파일을 mmap하면, 스왑 아웃 된 메모리와 비슷하게 동작합니다. 내용에 액세스하면 캐시에 저장되고 캐시의 공간이 필요할 때 메모리 또는 디스크에 다시 기록됩니다. 메모리는 실제로 스왑 공간이 가득 차면 캐시처럼 작동합니다.

여기에서 페이지 오류에 대해 읽을 수 있습니다. https://en.wikipedia.org/wiki/Page_fault